4

.remove() メソッドを使用して html 要素を削除していますが、同時にこの要素に対してイベント ハンドラーがありますが、トリガーされません。なぜそれができますか?jsFiddleとコードは次のとおりです: HTML

<span id='del_span'>Delete</span><br>
<span id='to_del'>I'm going to be deleted</span>

JS

$('#del_span').click(function() {
    $('#to_del').remove();
});
$('#to_del').on('remove', function() {
    alert("I'm being deleted"); //is never triggered
});
4

3 に答える 3

4

jQuery UI を含めると、$.cleanDataメソッドがオーバーライドされ、削除イベントもトリガーされます。この動作は、同じ方法で非常に簡単に模倣できます。

// copied from jQuery UI Github, link below
var _cleanData = $.cleanData;
$.cleanData = function( elems ) {
    for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
        try {
            $( elem ).triggerHandler( "remove" );
        // http://bugs.jquery.com/ticket/8235
        } catch( e ) {}
    }
    _cleanData( elems );
};

https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.widget.js#L16

$.cleanDataメソッドによって呼び出され.remove、要素に保存されているデータとイベントをクリーンアップします。これにより、次のような他の方法で要素が削除されたときにも remove イベントがトリガーされることに注意してください。.empty()

于 2013-08-23T19:09:58.573 に答える
1

David Thomas の回答に追加するために、必要なことを行うための小さなプラグインを作成しました。

このコードをファイルに追加します。

//@Author Karl-André Gagnon
$.hook = function(){
    $.each(arguments, function(){
        var fn = this
        if(!$.fn['hooked'+fn]){
            $.fn['hooked'+fn] = $.fn[fn];
            $.fn[fn] = function(){
                $.fn['hooked'+fn](arguments);
                $(this).trigger(fn, arguments);
            }
        }
    })
}

次に、このコード:

$.hook('remove')

これは にイベント リスナーを追加してい.remove()ます。コードに何も変更しないと動作します。

非常に小さな例

于 2013-08-23T19:10:25.170 に答える