
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で質問しましょう!
似たような質問が見つかりました
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript jsで質問です。 ボタンが二つ存在し、両方のボタンがクリックされたことをチェックしたいのですが、どの 4 2022/11/22 10:30
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
追加ボタンを押した際に ok ボ...
-
JavaScriptで コードを変数で...
-
JQueryでfunctionに引数としてI...
-
<textarea>の最後尾に追加した...
-
複数のテキストボックスの値の...
-
JavaScriptのfileオブジェクト...
-
Javascriptで'(シングルクォー...
-
セレクトメニューの値の取得
-
HTMLのフォーム名とJavaScript...
-
Java Scriptで・・・
-
プルダウンメニューの項目で1つ...
-
tableの任意行にfocusをあてる
-
JavaScriptで次のような動作を...
-
特定<table>内の<td>の色を変える
-
チェックボックス付きのテーブ...
-
大文字か小文字かを判断する方法
-
Visual Studioのデザインでの非...
-
イベント発生時に入力待ち状態...
-
slickのレスポンシブ > center...
-
フォームの送信ボタンを画像に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
onchangeイベントを強制的に発...
-
JavaScriptのfileオブジェクト...
-
クリックさせたいが、click()が...
-
javaScriptの変数をJavaの変数...
-
innerHTML内では改行は禁止?
-
VB.NETで<Input>タグ、<text...
-
BackSpaceしたい(QNo.2734284の...
-
formのfileの値をhiddenでも持...
-
onclickが動作しない
-
ボタンかリンクをクリックする...
-
WordpressのCocoonというテーマ...
-
フォームのNAMEを変数に格納し...
-
JavaScriptでの足し算処理について
-
インラインフレームから親ウィ...
-
タグ実験で
-
リスト追加
-
localStorage
-
javascriptでtextareaに文字列...
-
onClickがinput type="image"だ...
-
ボタンで配列に代入
おすすめ情報