6

これは、POJSを使用したjsfiddleでreturn false;、イベントの伝播を停止しないことを示しています。http: //jsfiddle.net/Ralt/Lz2Pw/

これは、イベントの伝播を停止するreturn false; ことを示すjQueryを使用した別の例です:http: //jsfiddle.net/Ralt/D5Mtg/

編集: jQueryがこれを行う理由を説明しているもの(意図的に元の動作とは異なります)(およびコード内のどこで)が答えを取得します。

コードは次のとおりです(長いですが、非常に読みやすいです)。

  • 両方のバージョンのHTML:

    <div id="parent1">
        <div id="child1"><a href="#" id="a1">child1</a></div>
    </div>
    
    <div id="parent2">
        <div id="child2"><a href="#" id="a2">child2</a></div>
    </div>
    
    <div id="parent3">
        <div id="child3"><a href="#" id="a3">child3</a></div>
    </div>
    
  • POJS:

    document.getElementById( 'child1' ).onclick = function( e ) {
        console.log( 'child1' );
        e.preventDefault();
    };
    
    document.getElementById( 'parent1' ).onclick = function( e ) {
        console.log( 'parent1' );
    };
    
    document.getElementById( 'child2' ).onclick = function( e ) {
        console.log( 'child2' );
        return false;
    };
    
    document.getElementById( 'parent2' ).onclick = function( e ) {
        console.log( 'parent2' );
    };
    
    document.getElementById( 'child3' ).onclick = function( e ) {
        console.log( 'child3' );
        e.stopPropagation();
    };
    
    document.getElementById( 'parent3' ).onclick = function( e ) {
        console.log( 'parent3' );
    };
    
  • jQueryバージョン:

    $( '#child1' ).click( function( e ) {
        console.log( 'child1' );
        e.preventDefault();
    });
    
    $( '#parent1' ).click( function( e ) {
        console.log( 'parent1' );
    });
    
    $( '#child2' ).click( function( e ) {
        console.log( 'child2' );
        return false;
    });
    
    $( '#parent2' ).click( function( e ) {
        console.log( 'parent2' );
    });
    
    $( '#child3' ).click( function( e ) {
        console.log( 'child3' );
        e.stopPropagation();
    });
    
    $( '#parent3' ).click( function( e ) {
        console.log( 'parent3' );
    });
    
4

1 に答える 1

8

バージョン1.7.1の3331行目、jQuery.event.dispatch

ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
         .apply( matched.elem, args );

if ( ret !== undefined ) {
    event.result = ret;
    if ( ret === false ) {
        event.preventDefault();
        event.stopPropagation();
    }
}

この行の前に多くのパッケージ化が行われていますが、基本的には、を使用してハンドラー関数(raw関数またはのhandlermemeber関数のいずれかhandlerObject)を実行しapplyます。その呼び出しの結果がfalseの場合、falseを実行しpreventDefaultますstopPropagation

これは、次のドキュメントに記載されていますon()

イベントハンドラから戻るfalseと、とが自動的に呼び出さevent.stopPropagation()event.preventDefault()ます。

なぜ彼らはそれをしたのですか?私はjQueryの設計チームではないのでわかりませんが、return false入力が。よりもはるかに速いからだと思いevent.preventDefault(); event.stopPropagation();ます。(そして、jQueryが入力する必要が少ないことを確認することではない場合、それが何であるかはわかりません。)

イベントハンドラの戻り値が実際にPOJSのどこでも使用されているとは思いません(間違っている場合は誰かが正しいです!)。returnしたがって、jQueryは、ハンドラーで副作用を引き起こすステートメントを安全に持つことができます(POJSハンドラーでfalseを返すことは無意味であるため、POJS機能が損なわれることはありません)。

于 2012-05-04T16:13:38.780 に答える