0
0

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 3 years have passed since last update.

shortcut.jsでshortcut.removeしてもコールバック関数がイベントに登録されたままになる

Last updated at Posted at 2020-03-18

環境

os : Windows 7

バグ内容

以下のコードでctrl + sを押したら2つ目と表示されてほしいのに両方のアラートが連続して表示されてしまう。

shortcut.add('ctrl+s', function(){
  alert('1つ目');
});
shortcut.remove('ctrl+s');

shortcut.add('ctrl+s', function(){
  alert('2つ目');
});

修正方法

shortcut.js
上記リンクがコード全体ですが219行目と220行目を入れ替えれば直ります。

shortcut.remove
-		if(ele.detachEvent) ele.detachEvent('on'+type, callback);
-		else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
+		if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
+		else if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 		else ele['on'+type] = false;
 	}
 }

バグの理由

shortcut.addではaddEventListenerのチェックを先に行っているのにshortcut.removeではそdetachEventのチェックを先に行っていて対応したaddremoveになっていないため。

// shortcut.add
if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
else ele['on'+opt['type']] = func;

// shortcut.remove
if(ele.detachEvent) ele.detachEvent('on'+type, callback);
else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
else ele['on'+type] = false;

気づいた経緯

【HTA】【jquery】【Marked】Markdown版ローカルwiki(v1.6)
MarkdownLocalWiki

上記をフォークしてwiki編集モードでのみctrl + sで保存できる機能を追加していました。
編集モード移行時にshortcut.add、それ以外に移行したらshortcut.removeとして制限を掛けていたのですが2回以上保存されることがありバグに気づきました。

その他

このことを本家に伝えたいのですが英語力が皆無なためQiitaに投稿しました。

リンク一覧

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?