
No.6ベストアンサー
- 回答日時:
#2~4です。
#4のお礼より引用。
> でも、そんなに多量に追加・削除を繰り返しが想定さなければ、たぶん許されそうな....
まあ、そうですよね。
参照できないところにあるのですし、よほどメモリを圧迫していなければ問題は出そうにないですね。
ただ…。例えば、先の回答のように click を3つ定義する実装があったとして。
私なら、一つだけイベント定義しちゃいます。
document./*@cc_on @if(@_jscript) attachEvent('on' + @else @*/addEventListener(/*@end @*/ 'click', function (evt) {
var targetNode = evt.target || evt.srcElement;// イベント呼び出し元の要素ノード
switch(targetNode.id){
case 'Hello':
// 処理
break;
case 'Delete':
// 処理
break;
case 'View':
// 処理
break;
default:
return false;// それ以外は処理を行わない
}
evt.preventDefault ? evt.preventDefault() : evt.returnValue = false;// デフォルト動作を無効に
},false);
イベントそのものは一つなので、匿名関数内部で制御構造を工夫すれば特定条件下で処理を回避する事も簡単にできます。
No.5
- 回答日時:
曖昧な質問ですが、
「ウェブページのHTML上のあるDOM要素にon~のイベントであるJavaScript処理を設定した状態で、そのDOM要素をHTMLから削除した場合、削除後のウェブページにキーボードやマウスで何かの操作をして、設定してあったJavaScript処理を実行する手段があるか?(実行されるか?)」
と言うことであれば、「実行されない」だと思いますが。
HTMLから削除したDOM要素を、削除する前に変数に保存してあれば、その変数を経由して処理を呼び出すことは可能ですね。保存してあれば残るのは当然。
No.4
- 回答日時:
#2,3 です。
申し訳ありません。質問の意図を勘違いしていました。
「イベントハンドラが削除されるのか」ですね。
再び、検証してみました。
-----------
<p id="Hello">Hello, World!</p>
<p id="Delete">Delete</p>
<p id="View">View</p>
<script type="text/javascript">
<!--
document.getElementById('Hello').onclick = function(evt){
console.log('Hello, world!');
};
var helloElement = document.getElementById('Hello');
var helloEventHandler = document.getElementById('Hello').onclick;// イベントハンドラを格納する
document.getElementById('Delete').onclick = function(evt){
//document.getElementById('Hello').onclick = null;// イベントハンドラを削除
document.getElementById('Hello').parentNode.removeChild(document.getElementById('Hello'));// 要素を削除
};
document.getElementById('View').onclick = function(evt){
console.log(helloElement);// Hello要素ノードを表示
console.log(helloEventHandler);// イベントハンドラを表示
helloEventHandler();// onclickで参照される function を実行
};
-->
</script>
-----------
Firebugでコンソールを確認してみてください。
イベントハンドラを削除しない場合は、helloElementを辿っていくと、onclickにfunctionが格納されていることがわかります。
イベントハンドラを削除すれば、nullが格納されます。
つまり、
> DOM要素を削除しても、イベントは消えないのでしょうか?
に対する回答は「削除されない」ですね。
実際にどんな影響を及ぼすかはわかりませんが、とりあえず、null で埋めておくのがベターかと思います。
function 自体はメモリから解放されませんが、少なくともonclickから参照しなくなることは確かですので…。
わざわざテストして調べてくださって有難うございます。
本来、自分で試せるぐらいの人なんですが。
やはり、自分で追加したイベントはちゃんと始末するべきなんですね。
でも、そんなに多量に追加・削除を繰り返しが想定さなければ、
たぶん許されそうな....
No.3
- 回答日時:
ちなみに、イベントを削除する方法は、
document.getElementById('Hello').onclick = null;
でいいはずなんですが、変数に待避させた値は残っちゃってますね。
Deleteをクリックすることでonclickが作用しないことは確認できるのですが…。
イベントオブジェクトの参照ではなく、コピーが格納されてしまっているのでしょうか。
---------
<p id="Hello">Hello, World!</p>
<p id="Delete">Delete</p>
<p id="View">View</p>
<script type="text/javascript">
<!--
var helloEvent;
document.getElementById('Hello').onclick = function(evt){
helloEvent = evt ? evt : window.event;// イベントオブジェクトを格納する
console.log('Hello, world!');
};
document.getElementById('Delete').onclick = function(evt){
document.getElementById('Hello').onclick = null;// イベントオブジェクトを削除
document.getElementById('Hello').parentNode.removeChild(document.getElementById('Hello'));// 要素を削除
};
document.getElementById('View').onclick = function(evt){
console.log(helloEvent);// イベントオブジェクトを表示
};
-->
</script>
---------
掲示板/JavaScript質問板/onclickで定義したイベントリスナを削除するには? - TAG index Webサイト
http://www.tagindex.com/cgi-lib/q4bbs/patio.cgi? …
No.2
- 回答日時:
Firefox3.6, IE8でイベントを定義した要素ノードを削除しても、イベントオブジェクトが残ることを確認しました。
---------
<p id="Hello">Hello, World!</p>
<p id="Delete">Delete</p>
<script type="text/javascript">
<!--
var helloEvent;
document.getElementById('Hello').onclick = function(evt){
helloEvent = evt ? evt : window.event;// イベントオブジェクトを格納する
console.log(helloEvent);// イベントオブジェクトを表示
};
document.getElementById('Delete').onclick = function(evt){
document.getElementById('Hello').parentNode.removeChild(document.getElementById('Hello'));// 要素を削除
console.log(helloEvent);// イベントオブジェクトを表示
};
-->
</script>
---------
event - MDC
https://developer.mozilla.org/ja/DOM/event
element.onclick - MDC
https://developer.mozilla.org/en/DOM/element.onc …
No.1
- 回答日時:
//あくいはないんだ。
まっとうなかいとうがつくまで、ひまつぶしに!
http://ganchiku.com/2007/10/before_removechild_r …
にほんごもびみょうだから、えいごは・・・。^^;
有難うございます。
「removeChildのみならずreplaceChildのときも必要!さらに、innerHTMLで内でEventを指定していた要素にも必要」
なんですね。
全然気にしてませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript JavaScriptの即時関数の書き方 1 2022/11/29 09:52
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- Excel(エクセル) ユーザー関数の自動計算(excel2003) 1 2023/02/06 06:46
- JavaScript Google reCAPTCHAについて 1 2023/02/22 14:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JavaScript window.openで開く...
-
VB2019でウェブサイトにID/PASS...
-
ネスケ6以上でも動作させたいの...
-
表示エリアサイズで判別してsty...
-
サブウィンドウに背景色をつけ...
-
マウスでポイントすると説明を表示
-
テーブルの行削除について
-
javascriptがわからない その2
-
bxsliderでpagerCustomのクラス...
-
onClickイベントの変更方法
-
フレームで仕切っているHTMLフ...
-
Latexに関する質問です。
-
DMM検索のブックマークレット出...
-
compatModeとは?
-
複数の配列から、項目数にあわ...
-
onload時にPostBackを発生させ...
-
メニューを変えたい
-
テーブル背景を毎日入れ替える方法
-
多重配列の定義について。【Ruby】
-
javscript超初心者です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DOM要素を削除しても、イベント...
-
XMLでのAttributeを持ったNode...
-
Latexに関する質問です。
-
javascriptの基本的なことだと...
-
JavaScript window.openで開く...
-
excle VBA とweb上の検索を利用...
-
VBAのIE操作でframe構造のサイ...
-
iframeのソースを取得したい
-
FireFoxのjavascriptで自動でキ...
-
UWSCでオンクリックのボタンを...
-
VBAでIEのボタンを押してメッセ...
-
ブラウザ情報の件で困ってます...
-
Null またはオブジェクトではあ...
-
繰り返し処理で記述したいのです。
-
webページ上のTabキーの動き
-
onClickイベントの変更方法
-
ブラウザのウィンドウサイズに...
-
removeEventListenerの必要性
-
乗換案内 VBAで操作したい
-
文字を一文字ずつ表示
おすすめ情報