さらに調査した結果、特定のイベントのみが「キャンセル可能」であることがわかりました。
http://help.dottoro.com/ljwolcsp.phpより引用
バージョン 9 より前の Internet Explorer を除くすべてのブラウザーで、cancelable プロパティを使用してイベントをキャンセルできるかどうかを確認できます。cancelable プロパティは Firefox にも存在しますが、イベントのキャンセル可能な状態に関係なく、常に true を返します。バージョン 9 より前の Internet Explorer でイベントをキャンセルできるかどうかを判断する方法はありません。
キャンセル不可のイベントで preventDefault メソッドと returnValue プロパティを使用しても、エラーは発生しないことに注意してください。イベント ハンドラが false を返すと、イベントはキャンセルされます。preventDefault メソッドと returnValue プロパティの代わりに使用できます。以下の例 2 を参照してください。
JavaScript の各イベントには、イベントを防止できる場合は「true」、イベントをキャンセルできない場合は「false」として定義されるキャンセル可能なプロパティがあります。参考: http: //help.dottoro.com/ljeosnqv.php
このプロパティを示すhttp://help.dottoro.com/ljeosnqv.phpのサンプル スクリプトは、jsFiddle にあります(スペースを節約するため)。Firefox がイベント オブジェクトの cancelable プロパティに対して常に true を返す方法に関するコード内のコメントに注意してください。
一般的な原則は次のとおりです。
$('selector').on(eventType, function (event) {
alert(('cancelable' in event)); //will return true
alert(event.cancelable); //will return true if event can be cancelled
//NOTE: Firefox mistakenly always returns true
});
イベントには、状況に応じて発生する順序があらかじめ設定されています。たとえば、マウス ボタンがクリックされた場合、eventTriggers の順序は、mousedown、mouseup、および click になります。参照: www.w3.org/TR/DOM-Level-2-Events/events.html#Events-Event-initMouseEvent
http://www.w3.org/TR/2003/NOTE-DOM-Level-3-Events-20031107/events.html#Events-flow-cancelationから引用
「キャンセル可能なイベント」とは、DOM イベント フロー中にキャンセルできるデフォルト アクションに関連付けられたイベントです。イベント フロー中の任意の段階で、トリガーされたイベント リスナーには、デフォルト アクションをキャンセルするか、デフォルト アクションの続行を許可するオプションがあります。ブラウザーのハイパーリンクの場合、アクションをキャンセルすると、ハイパーリンクがアクティブ化されません。この仕様で定義されているすべてのイベントがキャンセル可能なイベントであるとは限りません。
イベントのシーケンスでは、キャンセルしようとしているイベントが表示される前に DOM のデフォルト アクションが発生する場合があります。このような場合、デフォルト アクションは既に発生しているためキャンセルできません。つまり、イベントのディスパッチ前にデフォルトのアクションが発生します。
私の解決策:
そうは言っても、私は自分の問題と多かれ少なかれこの問題の解決策を見つけることができました。基本的に、既に focusin の要素を持つ eventListener があり、この要素にフォーカスを維持させたいと考えていました。
<div id='display'></div>
$('#idBox').on('focusin', function () {
$('#div').append('focused');
//do something
}
最初に、クリックしたときにsetTimeoutイベントを使用しようとしましたが、focusinイベントが再びトリガーされたため、うまくいかないことがわかりました。したがって、必要なのは、フォーカスを切り替えるという DOM のデフォルト アクションの前にディスパッチされるイベントです。この要件を満たすイベントがあることがわかりましたが、IE でしか利用できません... 典型的なものです。参考までに、それは「onbeforedeactivate」であり、キャンセル可能です。ただし、ブラウザー間の互換性は重要であるため、この eventTrigger は使用しないでください。むしろ、DOM がフォーカス変更動作を開始する前にイベント mousedown が発生することがわかりました。
したがって、私たちができることは次のとおりです。
$(document).on('mousedown', function(event) {
target = event.target; // the element clicked on
myTarget = document.getElementById("idBox"); // the element to keep focus
if (target !== myTarget) {
event.preventDefault(); //prevent default DOM action
event.stopPropagation(); //stop bubbling
return false; // return
}
});
他にも多くの方法があります。個人的には、ドキュメント全体に eventListener を設定するのは好きではありませんが、その目的を果たす基本を示すためです。
脚注: Javascript でのイベント処理の詳細については、http: //help.dottoro.com/ljtdqwlx.php を参照してください
。すばらしいリソースに出会いました。