115
106

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaScriptやjQueryでイベントを削除して再登録する方法

Last updated at Posted at 2016-11-11

よくあるケースではないですが…JavaScriptやjQueryで設定したイベントハンドラを一時的に無効にして、もろもろの処理をした後に再びイベントを復活させたかったので、やり方を備忘録的に残しておきます。

取得して削除して再登録する

アプローチは単純で、登録済みのイベントを「取得」→「削除」→「再登録」これだけです。

まず、設定済みのイベントハンドラを取得する必要があります。というかイベントハンドラの取得さえできてしまえばできたも同然です。イベントハンドラは、JavaScriptやjQueryの場合、一般的には下記のパターンがあると思います。そして、それぞれに対して取得方法が変わってきます。

onclick属性で指定

<button id="hoge" onclick="doSomething();">click me</button>

取得&削除&再登録

// 取得
var event = $("#hoge").get(0).onclick;
// もしくは
// document.getElementById("hoge").onclick

// 削除
$("#hoge").get(0).onclick = "";

// 再登録
$("#hoge").get(0).onclick = event;

jQueryでDOMにクリックイベント

$("#hoge").click(function() {
	doSomething();
});	

$("#hoge").on("click", function() {
	doSomething();
});

取得&削除&再登録

// 取得
var events = [];
Object.keys($._data($("#hoge").get(0), "events")).forEach(function(k) {
  events[k].forEach(function(o) {
    events.push(o.handler);
  });
});

// 削除
$("#hoge").off("click");

// 再登録
events.forEach(function(e) {
  $("#hoge").on("click", e);
});

jQueryのon()でdocumentにクリックイベント

$(document).on("click", "#hoge", function() {
	doSomething();
});

取得&削除&再登録

// 取得
var events = [];
Object.keys($._data($(document).get(0), "events")).forEach(function(k) {
  events[k].forEach(function(o) {
    events.push({
      handler: o.handler,
      selector: o.selector,
    });
  });
});

// 削除
$(document).off("click", "#hoge");

// 再登録
events.forEach(function(e) {
  $(document).on("click", e.selector, e.handler);
});

addEventListenerを直接使う

var event = function(){
	doSomething();
};
document.getElementById("hoge").addEventListener("click", event);

削除&再登録をする

残念ながら addEventListener で直接設定した場合、後からイベントハンドラを取得することはできないようです(出来る場合は教えてください 🙇🏻)。ただし、設定時にイベントを変数にとっておくことで、削除と復活自体は可能です。

// 削除
document.getElementById("hoge").removeEventListener("click", event);

// 再登録
document.getElementById("hoge").addEventListener("click", event);

ちなみに以前、jQueryで設定されたクリックイベントなどを定義している場所を調べる方法という記事も書いているので、そちらも良ければ見てみてください。

115
106
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
115
106

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?