簡単なことかもしれませんが、私はそれを理解することはできません...
モーダル通知ウィンドウを動的に構築しようとしています。構造は次のとおりです。
<!-- the overlay to disable the screen interaction -->
<div id="modalWrapper"></div>
<!-- the actual window where I put the contents in dynamically -->
<div id="modalWindow"></div>
JQueryを使用して構築している構造は次のとおりです。
<h1>Error</h1><h5>test</h5><ul class="buttons"><li class="left"><a class="button red small">Close</a></li></ul>
イベントハンドラーも動的にアタッチしています:
a.bind('click', function() {
// hide wrapper and modal
$('#modalWindow').hide();
$('#modalWrapper').hide();
callback();
});
コールバック関数は、モーダル ウィンドウを構築する関数への参照として渡されます。
「表示」機能を呼び出すと、ウィンドウが作成されて表示されますが、一度しか機能しません。それに対する連続した呼び出しは、次のように失敗します。
$('#modalWindow').empty();
イベントがバインドされている要素 (つまり、ノード) の削除に失敗します。
私が試してみました:
$('#modalWindow').empty();
$('#modalWindow').remove();
$('#modalWindow a').each(function(index, item) { $(item).unbind('click');});
$('#modalWindow a').each(function(index, item) { $(item).remove();});
そしてそれらはすべて同じエラーメッセージで失敗します:
TypeError: handleObj is undefined
()jquery-1.7.2.js (line 3057)
()jquery-1.7.2.js (line 6524)
()jquery....min.js (line 9)
()jquery-1.7.2.js (line 5906)
()xxxxxxxxxxx.js (line 392)
()xxxxxxxxxxx.js (line 282)
[Break On This Error]
if ( ( mappedTypes || origType === handleObj.origType ) && jquery-1.7.2.js (line 3057
#modalWindow を空にして、次の通知で再度入力できるようにする方法について、誰かが光を当てることができますか?
これを使用して問題を再現しました:
var x = $('<a/>').html('clickme').attr('id','some_id').bind('click',function() {$(this).remove();});
$('body').append(x);
ただし、上記のワンライナーは同じメッセージでエラーになりますが、アプリでの実際の実行フローは異なることに注意してください。私はすべての HTML を構築し、モーダル要素を「非表示」にするイベントをバインドしています。次に、次の反復で、モーダル コンテナを「空」にして新しいアイテムを「挿入」しようとしていますが、そこでエラーが発生するため、現在実行中のハンドラを含むアイテムは削除しません。次の繰り返しでそれを削除しようとしています。
前もって感謝します。
別の更新 - 参考 までにですが、JQuery のイベント ディスパッチャまたはその周辺のコードにバグがあるようです。
Object.prototype.someFunctionName = function(param) {
alert('test');
}
var x = $('<a/>').html('clickme').attr('id','some_id').bind('click',function() {$(this).remove();});
$('body').append(x);
いずれかの要素で「クリック」がトリガーされるたびに someFunctionName が実行され、パラメーターの不一致により JQuery が停止してエラーが発生します。
someFunctionName を次のように定義すると:
Object.prototype.someFunctionName = function() {
alert('test');
}
var x = $('<a/>').html('clickme').attr('id','some_id').bind('click',function() {$(this).remove();});
$('body').append(x);
それは機能しますが、それでも毎回実行されます-これは間違っています... JQueryのサイトに投稿します-みんなありがとう。
作品: http://jsfiddle.net/tinnerdxp/AU4pm/
動作しません: http://jsfiddle.net/tinnerdxp/Pvax2/
ティンナーdxp