5

私は質問のためにこのテストコードを作成しました:https ://jsfiddle.net/5phqm/1/

私が理解している限り、jQuerytriggerHandler()がデフォルトのブラウザーの動作を妨げている場合、ネイティブJavaScriptイベントはトリガーおよび処理されません(私のコードでは当てはまりaddEventListener()ます)が、タグの属性onclick=""を介して追加されたインラインイベントはとにかくトリガーされます!なぜそれが起こるのですか?ブラウザでトリガーされるイベントについて何か誤解していますか?

4

2 に答える 2

2

明示的にコーディングされているため、インラインハンドラーが実行されていることを確認できます。

handle = ontype && cur[ ontype ];
if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
    event.preventDefault();
}

ontypeこの場合はどこにありますか"onclick"。つまりonclick、要素のプロパティをフェッチして実行します。このコードは、.trigger/に関係なく常に呼び出され.triggerHandlerます。

ただし、のようなネイティブアクションは、ブロック内でelem.click()のみ実行されます。if

if ( !onlyHandlers && !event.isDefaultPrevented() ) {
    // ...
    elem[ type ]();

ここで、onlyHandlerstruefortriggerHandleおよびfalsefor.triggerであるため、実行さtriggerHandlerれません。たとえば、実行されますelem.click()(実行さ.triggerれます)。そのため、ネイティブアクションは防止されます。

したがって、インラインハンドラーとネイティブアクションは別々のものであり、別々に処理されます。ネイティブアクションのみがによって防止され.triggerHandlerます。

于 2011-11-30T15:57:47.663 に答える
0

私は(推測ですが、jQueryのソースコードを簡単に見てみましたが、これは完全に間違っている可能性があります)、jQueryはjQuery.trigger.eventの要素に添付されたイベントを次のように呼び出すことで取得すると思います

   $(elem).data("events");

そして、それらを発射/停止するかどうかを決定します。インラインイベントはこの方法では収集できないため、停止することはできません。

于 2011-11-30T12:33:38.887 に答える