찾다
웹 프론트엔드JS 튜토리얼yourself_jquery가 작성한 jQuery 콜백의 전체 기능 코드에 대한 자세한 설명

사용법은 $.Callbacks와 완전히 동일하지만 매개 변수가 있는 추가, 제거, 실행, 비어 있음, 생성자 함수만 구현합니다. $.Callbacks에는 비활성화, 비활성화, fireWith, 실행, 잠금, 잠김 메서드도 있습니다.

코드는 다음과 같습니다.

코드 복사 코드는 다음과 같습니다.

 String.prototype.trim = function ()
        {
            return this.replace( /^\s+|\s+$/g, '' );
        };

        // Simulate jQuery.Callbacks object
        function MyCallbacks( options )
        {
            var ops = { once: false, memory: false, unique: false, stopOnFalse: false };

            if ( typeof options === 'string' && options.trim() !== '' )
            {
                var opsArray = options.split( /\s+/ );
                for ( var i = 0; i                 {
                    if ( opsArray[i] === 'once' )
                        ops.once = true;
                    else if ( opsArray[i] === 'memory' )
                        ops.memory = true;
                    else if ( opsArray[i] === 'unique' )
                        ops.unique = true;
                    else if ( opsArray[i] === 'stopOnFalse' )
                        ops.stopOnFalse = true;
                }
            }

            var ar = [];
            var lastArgs = null;
            var firedTimes = 0;

            function hasName( name )
            {
                var h = false;

                if ( typeof name === 'string'
                    && name !== null
                    && name.trim() !== ''
                    && ar.length > 0 )
                {
                    for ( var i = 0; i                     {
                        if ( ar[i].name === name )
                        {
                            h = true;
                            break;
                        }
                    }
                }

                return h;
            }

            // add a function
            this.add = function ( fn )
            {
                if ( typeof fn === 'function' )
                {
                    if ( ops.unique )
                    {
                        // check whether it had been added before
                        if ( fn.name !== '' && hasName( fn.name ) )
                        {
                            return this;
                        }
                    }

                    ar.push( fn );

                    if ( ops.memory )
                    {
                        // after added , call it immediately
                        fn.call( this, lastArgs );
                    }
                }

                return this;
            };

            // remove a function
            this.remove = function ( fn )
            {
                if ( typeof ( fn ) === 'function'
                    && fn.name !== ''
                    && ar.length > 0 )
                {
                    for ( var i = 0; i                     {
                        if ( ar[i].name === fn.name )
                        {
                            ar.splice( i, 1 );
                        }
                    }
                }

                return this;
            };

            // remove all functions
            this.empty = function ()
            {
                ar.length = 0;
                return this;
            };

            // check whether it includes a specific function
            this.has = function ( fn )
            {
                var f = false;

                if ( typeof ( fn ) === 'function'
                    && fn.name !== ''
                    && ar.length > 0 )
                {
                    for ( var i = 0; i                     {
                        if ( ar[i].name === fn.name )
                        {
                            f = true;
                            break;
                        }
                    }
                }

                반환 f;
            };

            // 포함된 함수를 하나씩 호출
            this.fire = function ( args )
            {
               if ( ops.once && FireTimes > 0 )
                {
                   이것을 반환 ;
                }

               if (ar.length > 0 )
                {
                  var r;

                   for ( var i = 0; i                   {
                      r = ar[i].call( this, args );

                      if ( ops.stopOnFalse && r === false )
                    {
                         break;
                       }
                   }
               }

                FireTimes ;

               if ( ops.memory )
               {
                  lastArgs = args;
                }

               이것을 반품하세요.
            };
        };
 

 测试函数如下:(注意fn1 fn2是匿name函数, fn2返回false, fn3是유“명”函数)

 

复主代码 代码如下:

 var fn1 = 함수( v )
        {
            console.log( 'fn1 ' ( v || '' ) );
        };

        var fn2 = 함수 ( v )
        {
            console.log( 'fn2 ' ( v || '' ) );
            return false;
        };

        기능 fn3( v )
        {
            console.log( 'fn3 ' ( v || '' ) );
       };
 

1. 테스트 추가 및 실행

var cb=new MyCallbacks();

cb.add(fn1)

cb.add(fn2)

cb.add(fn3)

cb.fire('안녕하세요')

출력:

fn1 안녕하세요
fn2 안녕하세요
fn3 안녕하세요

2. 테스트 제거
var cb=new MyCallbacks();

cb.add(fn1)

cb.add(fn2)

cb.add(fn3)

cb.remove(fn1)
cb.fire('hello')
cb.remove(fn3)
cb.fire('hello')
출력:

fn1 안녕하세요
fn2 안녕하세요
fn3 안녕하세요
-------------------------------- --
fn1 안녕하세요
fn2 안녕하세요

2. 테스트에는
var cb=new MyCallbacks();

가 있습니다.

cb.add(fn1)

cb.add(fn2)

cb.add(fn3)

cb.has(fn1)

cb.has(fn3)

출력:

거짓

---------------

그렇습니다

3. 매개변수를 사용하여 생성자를 테스트합니다: 한 번

var cb=new MyCallbacks('한 번')

cb.add(fn1)

cb.fire('안녕하세요')

cb.fire('안녕하세요')

cb.add(fn2)

cb.fire('안녕하세요')

출력:

안녕하세요

------

------

------------------

4. 매개변수를 사용하여 생성자를 테스트합니다: 메모리

var cb=new MyCallbacks('memory')

cb.add(fn1)

cb.fire('hello') // 출력: fn1 hello

cb.add(fn2) // 출력: fn2 hello

cb.fire('안녕하세요')

출력:

fn1 안녕하세요

fn2 안녕하세요

5. 매개변수를 사용하여 생성자를 테스트합니다: stopOnFalse

var cb=new MyCallbacks('stopOnFalse')

cb.add(fn1)

cb.add(fn2)

cb.add(fn3)

cb.fire('안녕하세요')

출력:

fn1 hello
fn2 hello
6. 고유 매개변수를 사용하여 생성자를 테스트합니다

var cb=new MyCallbacks('unique')

b.추가(fn3)

b.추가(fn3)

cb.fire('안녕하세요')

출력:

fn3 안녕하세요

7. 결합된 매개변수로 생성자를 테스트합니다. 4개의 설정 매개변수를 마음대로 결합할 수 있습니다. 모든 조합을 한 번에 테스트해야 합니다. 그렇지 않으면 16개의 테스트 사례를 작성해야 합니다.

var cb=new MyCallbacks('일회 메모리 고유 stopOnFalse')

cb.add(fn1) // 출력: fn1

cb.add(fn2) // 출력: fn2

cb.add(fn3) // 출력: fn3

cb.fire('안녕하세요')

출력:

fn1 hello

fn2 hello
cb.fire('hello') // 출력: 출력 없음

공식 API 문서는 다음과 같습니다.

설명: 콜백 목록을 관리하는 강력한 방법을 제공하는 다목적 콜백 목록 개체입니다. $.Callbacks() 함수는 내부적으로 jQuery $.ajax() 및 $.Deferred(의 기본 기능을 제공하는 데 사용됩니다. ) 구성요소는 새로운 구성요소의 기능을 정의하기 위한 유사한 기반으로 사용될 수 있습니다.

생성자: jQuery.Callbacks( 플래그 )

flags

유형: 문자열
콜백 목록의 작동 방식을 변경하는 공백으로 구분된 플래그의 선택적 목록입니다.
가능한 플래그:
once: 콜백 목록이 한 번만 실행될 수 있도록 보장합니다( Deferred와 같음).
memory: 이전 값을 추적하고 목록이 실행된 후 추가된 모든 콜백을 최신 "기억된" 값(예: Deferred)으로 즉시 호출합니다.
고유 : 콜백을 한 번만 추가할 수 있도록 합니다(목록에 중복이 없도록 합니다).
stopOnFalse: 콜백이 false를 반환할 때 호출을 중단합니다.
기본적으로 콜백 목록은 이벤트 콜백 목록처럼 작동하며 다음을 수행할 수 있습니다. 여러 번 "해고"당했습니다.

위에서는 .add() 및 .fire()라는 두 가지 특정 메서드가 사용되었습니다. .add() 메서드는 콜백 목록에 새 콜백을 추가하는 것을 지원하는 반면, .fire() 메서드는 추가된 함수를 실행하고 동일한 목록의 콜백에서 처리할 인수를 전달하는 방법입니다.

콜백을 사용하여 게시-구독 모드 게시/구독 구현: (공식 문서)

코드 복사 코드는 다음과 같습니다.

var 주제 = {};

        jQuery.Topic = 함수( id )
        {
            var 콜백,
               메소드,
               주제 = id && 주제[id];

            if ( !topic )
            {
               콜백 = jQuery.Callbacks();
              주제 = {
                  게시: callbacks.fire,
                    구독: callbacks.add,
구독 취소: callbacks.remove
               };
               if ( id )
               {
                   주제[id] = 주제;
                }
            }
            주제 반환;
        };

사용

复主代码 代码如下:

$.Topic( 'mailArrived' ).subscribe( function ( e )
        {
            console.log( '새 이메일이 있습니다! ' );
            console.log( "메일 제목 : " e.title );
            console.log( "메일 내용 : " e.content );
        }
        );

        $.Topic( 'mailArrived' ).publish( { title: 'mail title', content: 'mail content' } );


具体代码如下, 有兴趣和时间的可以对PhotojQuery특별콜백对比下 :

复主代码 代码如下:

( function ( window, undefined )
        {
            // Simulate jQuery.Callbacks object
            function Callbacks( options )
            {
                var ops = { once: false, memory: false, unique: false, stopOnFalse: false },
                    ar = [],
                    lastArgs = null,
                    firedTimes = 0,
                    _disabled = false,
                    _locked = false;

                if ( typeof options === 'string' && options.trim() !== '' )
                {
                    var opsArray = options.split( /\s+/ );
                    for ( var i = 0; i                     {
                        if ( opsArray[i] === 'once' )
                            ops.once = true;
                        else if ( opsArray[i] === 'memory' )
                            ops.memory = true;
                        else if ( opsArray[i] === 'unique' )
                            ops.unique = true;
                        else if ( opsArray[i] === 'stopOnFalse' )
                            ops.stopOnFalse = true;
                    }
                }

                function hasName( name )
                {
                    var h = false;

                    if ( typeof name === 'string'
                        && name !== null
                        && name.trim() !== ''
                        && ar.length > 0 )
                    {
                        for ( var i = 0; i                         {
                            if ( ar[i].name === name )
                            {
                                h = true;
                                break;
                            }
                        }
                    }

                    return h;
                }

                // add a function
                this.add = function ( fn )
                {
                    if ( typeof fn === 'function' )
                    {
                        if ( ops.unique )
                        {
                            // check whether it had been added before
                            if ( fn.name !== '' && hasName( fn.name ) )
                            {
                                return this;
                            }
                        }

                        ar.push( fn );

                        if ( ops.memory )
                        {
                            // after added , call it immediately
                            fn.call( this, lastArgs );
                        }
                    }

                    return this;
                };

                // remove a function
                this.remove = function ( fn )
                {
                    if ( typeof ( fn ) === 'function'
                        && fn.name !== ''
                        && ar.length > 0 )
                    {
                        for ( var i = 0; i                         {
                            if ( ar[i].name === fn.name )
                            {
                                ar.splice( i, 1 );
                            }
                        }
                    }

                    return this;
                };

                // remove all functions
                this.empty = function ()
                {
                    ar.length = 0;
                    return this;
                };

                // check whether it includes a specific function
                this.has = function ( fn )
                {
                    var f = false;

                    if ( typeof ( fn ) === 'function'
                        && fn.name !== ''
                        && ar.length > 0 )
                    {
                        for ( var i = 0; i                         {
                            if ( ar[i].name === fn.name )
                            {
                                f = true;
                                break;
                            }
                        }
                    }

                    return f;
                };

                this.disable = function ()
                {
                    _disabled = true;
                    return this;
                };

                this.disabled = function ()
                {
                    return _disabled;
                };

                this.fired = function ()
                {
                    return firedTimes > 0;
                };

                function _fire( context, args )
                {
                    if ( _disabled || ops.once && firedTimes > 0 || _locked )
                    {
                        return;
                    }

                    if ( ar.length > 0 )
                    {
                        var r;

                        for ( var i = 0; i                         {
                            r = ar[i].call( context, args );

                            if ( ops.stopOnFalse && r === false )
                            {
                                break;
                            }
                        }
                    }

                    firedTimes++;

                    if ( ops.memory )
                    {
                        lastArgs = args;
                    }

                };

                this.fireWith = function ( context, args )
                {
                    context = context || this;
                    _fire( context, args );
                    return this;
                };

                this.fire = function ( args )
                {
                    _fire( this, args );
                    return this;
                };

                this.lock = function ()
                {
                    _locked = true;
                    return this;
                };

               this.locked = function ()
                {
                  return _locked;
               };

            };

            // 팩토리 메서드로 전역에 노출
            window.callbacks = function ( options )
            {
               새 콜백 반환( options );
           };

        } )( 창 );

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
jquery实现多少秒后隐藏图片jquery实现多少秒后隐藏图片Apr 20, 2022 pm 05:33 PM

实现方法:1、用“$("img").delay(毫秒数).fadeOut()”语句,delay()设置延迟秒数;2、用“setTimeout(function(){ $("img").hide(); },毫秒值);”语句,通过定时器来延迟。

axios与jquery的区别是什么axios与jquery的区别是什么Apr 20, 2022 pm 06:18 PM

区别:1、axios是一个异步请求框架,用于封装底层的XMLHttpRequest,而jquery是一个JavaScript库,只是顺便封装了dom操作;2、axios是基于承诺对象的,可以用承诺对象中的方法,而jquery不基于承诺对象。

jquery怎么修改min-height样式jquery怎么修改min-height样式Apr 20, 2022 pm 12:19 PM

修改方法:1、用css()设置新样式,语法“$(元素).css("min-height","新值")”;2、用attr(),通过设置style属性来添加新样式,语法“$(元素).attr("style","min-height:新值")”。

jquery怎么在body中增加元素jquery怎么在body中增加元素Apr 22, 2022 am 11:13 AM

增加元素的方法:1、用append(),语法“$("body").append(新元素)”,可向body内部的末尾处增加元素;2、用prepend(),语法“$("body").prepend(新元素)”,可向body内部的开始处增加元素。

jquery中apply()方法怎么用jquery中apply()方法怎么用Apr 24, 2022 pm 05:35 PM

在jquery中,apply()方法用于改变this指向,使用另一个对象替换当前对象,是应用某一对象的一个方法,语法为“apply(thisobj,[argarray])”;参数argarray表示的是以数组的形式进行传递。

jquery怎么删除div内所有子元素jquery怎么删除div内所有子元素Apr 21, 2022 pm 07:08 PM

删除方法:1、用empty(),语法“$("div").empty();”,可删除所有子节点和内容;2、用children()和remove(),语法“$("div").children().remove();”,只删除子元素,不删除内容。

jquery on()有几个参数jquery on()有几个参数Apr 21, 2022 am 11:29 AM

on()方法有4个参数:1、第一个参数不可省略,规定要从被选元素添加的一个或多个事件或命名空间;2、第二个参数可省略,规定元素的事件处理程序;3、第三个参数可省略,规定传递到函数的额外数据;4、第四个参数可省略,规定当事件发生时运行的函数。

jquery怎么去掉只读属性jquery怎么去掉只读属性Apr 20, 2022 pm 07:55 PM

去掉方法:1、用“$(selector).removeAttr("readonly")”语句删除readonly属性;2、用“$(selector).attr("readonly",false)”将readonly属性的值设置为false。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.