9

コードは次のとおりです。

$("div").on("click",function(){
       console.log("click");
});
$("div").on("click.plugin", function(){
       console.log("click.plugin");
});
$("button").click(function() {
      $("div").trigger("click!");    
});

そしてHTML:

<div>test.</div>
<button >Trigger event according to namespace</button>

jQuery 1.8.3 でコードを実行すると、動作します。ボタンをクリックするclickと、コンソールにログインします。

しかし、jQuery 1.9.1 に変更すると、ボタンを押しても何も起こりません。1.9.1 では感嘆符が機能しなくなったようです。

1.9 アップグレード ガイドでこの変更を見つけることができません。理由を知っている人はいますか?

4

2 に答える 2

5

.$の代わりに使用!

$("button").click(function() {
      $("div").trigger("click.$");    
});

デモ [クレジット: Tim B James]

于 2013-05-09T10:20:22.970 に答える
4

jQuery 1.8.3は次のようになります。

trigger: function( event, data, elem, onlyHandlers ) {

    // Don't do events on text and comment nodes
    if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
        return;
    }

    // Event object or event type
    var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
        type = event.type || event,
        namespaces = [];

    // focus/blur morphs to focusin/out; ensure we're not firing them right now
    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        return;
    }

    if ( type.indexOf( "!" ) >= 0 ) {
        // Exclusive events trigger only for the exact event (no namespaces)
        type = type.slice(0, -1);
        exclusive = true;
    }

    if ( type.indexOf( "." ) >= 0 ) {
        // Namespaced trigger; create a regexp to match event type in handle()
        namespaces = type.split(".");
        type = namespaces.shift();
        namespaces.sort();
    }

    // ...

「正確なイベントに対してのみトリガーされる排他的イベント」セクションに注目してください。

そして、これはjQuery 1.9.1です:

trigger: function( event, data, elem, onlyHandlers ) {
    var handle, ontype, cur,
        bubbleType, special, tmp, i,
        eventPath = [ elem || document ],
        type = core_hasOwn.call( event, "type" ) ? event.type : event,
        namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];

    cur = tmp = elem = elem || document;

    // Don't do events on text and comment nodes
    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
        return;
    }

    // focus/blur morphs to focusin/out; ensure we're not firing them right now
    if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
        return;
    }

    if ( type.indexOf(".") >= 0 ) {
        // Namespaced trigger; create a regexp to match event type in handle()
        namespaces = type.split(".");
        type = namespaces.shift();
        namespaces.sort();
    }

    // ...

ここでは、セクション全体が欠落しています (省略されたビットにもありません)。

jQuery がこの機能のサポートを終了したようです。変数exclusiveはソース全体から削除されました。

バージョン 1.9.1 のソースを見ると、ハックに頼らずに目的の機能を取得する方法がわかりません。

于 2013-05-09T11:12:20.587 に答える