
jQueryについての質問です。
ちょっと言葉での説明が難しいので、具体的なコードを記載します。
=== JavaScript ===
var clicked = function () { alert(1); };
var jqButton = $("<input type='button' value='test' />");
jqButton.click(clicked);
$(function() {
$("#showButton").click(function () { $("#test").html(jqButton); });
$("#hideButton").click(function () { $("#test").html(""); });
});
=== HTML ===
<input type="button" id="showButton" value="show" />
<input type="button" id="hideButton" value="hide" />
<div id="test"></div>
showボタンをクリックすると、testボタンが表示されます。
hideボタンをクリックすると、testボタンが消えます。
testボタンをクリックすると、alert(1) が実行されます。
という内容なのですが、一度hideしてから再度showして現れたtestボタンをクリックしても、
何も起きません。
仮に、jqButton.click(clicked); の部分を、
jqButton[0].attachEvent("onclick", clicked); などにすると、再表示させたtestボタンも動作します。
これはjQueryのイベントハンドラ設定APIを使った時特有の症状だと思うのですが、
なぜこのような結果になるのでしょうか。
てっきり、$.click()でイベントハンドラを設定すると、
内部でattachEventとかaddEventListnerとかが走るだけだと想像してましたが・・・
また、attachEventなど使わずに、jQueryの機能を使って、
再表示させてtestボタンも動作させるには、どうしたらいいでしょうか。
ご存知の方いましたら、お願い致します。
No.1ベストアンサー
- 回答日時:
「$("#test").html("");」の指定でセットしていたclickイベントが消されているみたいですね。
なぜイベントまで消えるかはわかりませんが、JQueryのソースコードみたら確かに
empty()でイベント消してる箇所がありました。
で表示、非表示的な処理はshow関数とhide関数を使えばいいと思います。
=== JavaScript ===
var clicked = function () { alert(1); };
var jqButton = $("<input type='button' value='test' />");
jqButton.click(clicked);
$(function() {
$("#test").html(jqButton);
$("#showButton").click(function () { $("#test").show(); });
$("#hideButton").click(function () { $("#test").hide(); });
});
=== HTML ===
<input type="button" id="showButton" value="show" />
<input type="button" id="hideButton" value="hide" />
<div id="test" style="display:none;"></div>
回答ありがとうございます。
自分でも調べてみたところ、イベントハンドラを削除しているのは
メモリリーク対策とのことでした。
確かにhtml()で要素のオブジェクトを参照できなくなってしまったら、
イベントハンドラとDOMで引き起こされるメモリリークを解消できませんね・・・
というわけで解決です。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javaScriptの変数をJavaの変数...
-
JavaScriptのfileオブジェクト...
-
onclickが動作しない
-
<input>の選択肢をプルダウンメ...
-
Selectボックスの幅を自動で広...
-
ボタン無しでフォーム内容送信
-
<JavaScript>tableタグを入力不...
-
同じ名前のセレクトがある場合...
-
doPostBack 関数について
-
tableの任意行にfocusをあてる
-
二次元配列に数字をランダムに...
-
JQueryで2つのテキストフィー...
-
特定<table>内の<td>の色を変える
-
削除ボタンの確認ダイアログを...
-
javascriptで<table>背景色の取得
-
C#(csファイル)とjavascriptと...
-
RegularExpressionValidatorの...
-
name = cats[1] という input ...
-
1つのform内に2つのsubmitボタ...
-
プルダウンで選択された値を別...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onchangeイベントを強制的に発...
-
javaScriptの変数をJavaの変数...
-
VB.NETで<Input>タグ、<text...
-
iOSのみダブルタップが必要
-
JavaScriptのfileオブジェクト...
-
追加ボタンを押した際に ok ボ...
-
onClickがinput type="image"だ...
-
innerHTML内では改行は禁止?
-
javascriptでチェックボックス...
-
パラメータから取得した文字をH...
-
クリックさせたいが、click()が...
-
JSPファイルにJavaScriptを埋め...
-
ボタンで配列に代入
-
任意の<DIV></DIV>の中に計算結...
-
javascript教えてください
-
WordpressのCocoonというテーマ...
-
ボタンかリンクをクリックする...
-
HTMLのテキストボックスへのド...
-
onclickが動作しない
-
複数のボタンに対するActionと...
おすすめ情報