編集
私はあなたが解決策を見つけたのを見ました、甘い:)。
完全を期すために、イベントを完全にバインド解除する方法を最終的に見つけたので、答えを残します。
動的バインディングを使用しているため、個々の要素のバインド解除は、イベントがバインド元の静的要素に常にバブリングするため、非常に複雑です。
他の回答に見られるように、クリック イベントを新しいクリック イベントで上書きし、伝播を停止できます。
ただし、それでも、バブルアップしない場合でも、クリックすると常に実行されるイベントが添付された要素が残ります。
以下の例では、イベントが完全にバインド解除されているため、イベントが完全にバインド解除されているため、残り物がなく、伝播を停止する必要がありません。
$(document).one('click', 'div', function(e) {
$(this).parent().find("div").one('click.NewClick', function() {
$('#result').append(this.id + " was clicked<br />");
});
$(this).click();
});
デモ- 動的にバインドされた個々の要素のバインドを解除
上記のデモでは、イベントの自動バインド解除を確実にするために、one()を使用しています。
one()
ロジックには外側が必要ですone()
。バインドされていないイベントをクリックしたいので、内側は要件です。
click
を使用して、通常どおり動的セレクター「div」で初期イベントをバインドしていone()
ます。
ただし、イベント内にあるものは、divのいずれかがクリックされた後、要素が存在するため、今回はセレクターを使用click
して、クリックイベントを要素に再バインドしています。また、名前空間を使用して、外側のバインドを解除しても新しいバインドが削除されないようにしています。one()
static
'click.namespace'
one()
これで、すべての div が で適切one()
にバインドされました。つまり、クリックすると、div は自動的に完全にバインド解除されます。
ユーザーが最初のクリック後に 2 回クリックする必要がないように、最初のイベントをトリガーした要素のクリック イベント ( ) を自動的にトリガーし、ユーザーにとって$(this).click()
シームレスにします。
あなたのコードは、以下のようなコードでこれを使用できるはずです:
$("#idTable").one("click", "td", function(e) {
$(this).parent().find("td").one('click.NewClick', function() {
var oTxtbox = $('<input type="text" value="' + $(this).text() + '"/>');
$(this).html(oTxtbox);
// other code
});
$(this).click();
});
on()の代わりにone()を使用していることに注意してください。
もちろん、要素がクリックされた後にイベントのバインドを解除したいので、内部バインディングは必要なものにすることができます。
one()