1

簡単なことかもしれませんが、私はそれを理解することはできません...

モーダル通知ウィンドウを動的に構築しようとしています。構造は次のとおりです。

<!-- 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

4

1 に答える 1

0

tinnerdxpの答え:

みんなありがとう、それは最終的に私のコードでした。Object.prototype を次のように拡張しました。

Object.prototype.isSet = function(property) {
    if (!(property in this)) {
        return false;
    } else {
        return true;
    }
}


Object.prototype.isArray = function() {
    if (this.constructor.toString().indexOf('Array') == -1) {
        return false;
    } else {
        return true;
    }
}

最初の拡張機能は実際にそれを壊していました。次のように少し奇妙です:

  • JQuery はどこにも .isSet を使用していないため、コア関数をオーバーライドしていません。
  • isSet の名前を amIset のようなばかげた名前に変更 - まだ修正されていません
  • isSet を削除 - まだ .isArray() がありますが、修正しました。

上記のレプリケーション コードは、ライブラリ (および拡張機能) を実行したときに実際に機能しないため、最初からここに投稿するのは間違っていました。

一般的に言えば:

  • 私を解決に導く提案をしてくれたBlazemongerに感謝します
  • Anthony - それも非常に良いポインタです - 私はもともとスコープの問題を疑っていたので.

みんなありがとう。

于 2012-08-03T08:37:21.710 に答える