6

jQuery には live() と呼ばれる非常に便利なイベント バインダーがあり、その場で DOM 要素にイベントを追加します (後で DOM に追加される要素であっても)。問題は、特定のイベントでのみ機能することです (ドキュメントの here にリストされています)。

現在ライブでサポートされていない、フォーカス、ブラー、および変更のライブ イベントが本当に必要です。さらに、ライブ カスタム イベントを作成できれば、私のアプリにとって大きなゲーム チェンジャーになるでしょう。私が現在持っているコードのほとんどは、古いイベント (アイテムをドラッグ可能またはサイズ変更可能にするための変更、フォーカス、およびカスタム イベント) を、ajax によって追加された新しい dom 要素に再バインドすることに専念しています。

何か案が?イベントの委譲が進むべき道だと思いますが、現時点ではコードがより複雑になります。イベント委任を処理するプラグインかもしれません...よくわかりません。解決策を見つけるのを手伝ってください。

4

5 に答える 5

5

jQuery にない場合は、おそらく理由があります。信頼できないブラウザのバグなど。彼らがそれを実装するまで待つか、ライブになった元のプラグインを使用してみてくださいhttp://docs.jquery.com/Plugins/livequery

編集:

いい反対票を投じてください。それが jQuery にないのには理由があります。私は実際にソースを読んで、 live() で特定のイベントのみが実装されている理由を探すのに時間を費やしましたが、その理由を見つけることができません。誰かが知っているなら...私たちを啓発してください。

于 2009-05-02T22:51:43.567 に答える
5

この機能は、jQuery 1.4 で利用できるようになりました。live()はすべての JavaScript イベント (カスタム イベントを含む) をサポートするようになり、focusinとイベントはとのfocusoutバブリング バージョンとして導入されました。focusblur

.live() に関する jQuery 1.4 ドキュメントから:

jQuery 1.4 以降、.live() メソッドはカスタム イベントとすべての JavaScript イベントをサポートします。2 つの例外: focus と blur は実際にはバブリング イベントではないため、代わりに focusin と focusout を使用する必要があります。

于 2010-01-19T04:00:10.700 に答える
4

live()focus イベントと blur イベントは他の DOM イベントのように伝播 (バブル) しないため、jQuery のメソッドは機能しません。jQuery チームは最終的にこの機能を導入する予定ですが、人為的 (手動バブリング) にする必要があります。

jQuery を使用していなくても、live()イベント キャプチャをサポートしているブラウザ (ほとんどの非 IE ブラウザ) で使用し、IE ではonFocusIn/onFocusOutイベントを使用します (これらのイベントは、フォーカス/ぼかしとは異なり、バブルを発生させます)。 )。

次に例を示します。

function onFocus(el, fn) {
    var outerFn = function(e) {
        e = e || window.event;
        if ((e.target || e.srcElement) === el) {
            fn.call(el);
        }
    };
    if (document.body.addEventListener) {
        // This is event capturing:
        document.body.addEventListener('focus', outerFn, true);
    } else {
        // This is event delegation:
        document.body.attachEvent('onfocusin', outerFn);
    }
    return outerFn;
}

それを使用して:

onFocus(document.getElementById('myInputField'), function(){
    log('FOCUSED!!!');
});

同様の抽象化は、blur イベントと change イベントに使用できます。

イベントの順序 (キャプチャ/バブリング) について詳しくは、http ://www.quirksmode.org/js/events_order.html をご覧ください。


また、jQuery プラグインである liveQuery が機能することも注目に値するかもしれません。これは、イベントを新しい要素に再バインドするためです。「append」、「insertBefore」などの jQuery の DOM 操作メソッドでのみ機能します。したがって、jQuery を使用せずに新しい要素を追加すると、機能しません。

于 2009-05-03T07:45:00.540 に答える
1

Ariel Flesley の jQuery.Listen プラグインをチェックしてみてください。live() イベントと livequery() プラグインに似ていますが、focus() と blur() イベントをサポートしています。

http://flesler.blogspot.com/2007/10/jquerylisten.html

于 2009-10-04T23:48:27.020 に答える
0

jQuery の .live() 関数を補完するものとして livequery プラグインを使用することに成功しました。focus、blur、change などのイベント (live() は 1.3.2 の時点ではまだサポートしていません) をバインドできるだけでなく、カスタム イベントをその場で DOM 要素にバインドするメカニズムも提供します。たとえば、Ajax を介して追加されるいくつかの DOM 要素にドラッグ可能およびドロップ可能をバインドするために使用しました。これにより、コードがはるかに読みやすくなり、維持しやすくなります。

于 2009-05-03T04:25:57.227 に答える