JavaScript stopImmediatePropagation 在事件处理程序中不起作用

标签 javascript event-handling

我想使用 stopImmediatePropagation 来防止触发同一元素上的第二个(鼠标按下)hadler,但它不起作用。代码示例:

$(function() {
  var showEventsMessage = function(options) {
    options = $.extend({
      eventType: 'CLICK',
      eventTarget: this,
      suffix: '<br>'
    }, options);
    var message = options.eventType + ': ' +
      (options.eventTarget.nodeName || 'unknown') +
      options.suffix;
    $('#Messages').append(message);
  }

  $('.clickable').click(function() {
    showEventsMessage.call(this, {
      eventType: event.type
    });
  }).dblclick(function() {
    showEventsMessage.call(this, {
      eventType: event.type
    });
  }).mousedown(function() {
    showEventsMessage.call(this, {
      eventType: event.type
    });
    event.stopImmediatePropagation();
    event.preventDefault();
  }).mousedown(function() {
    showEventsMessage.call(this, {
      eventType: event.type,
      suffix: '#2<br>'
    });
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='clickable'>CLICK HERE ...
  <p class='clickable'>or here!</p>
</div>
<div id="Messages"></div>

但是,如果我向调用 stopImmediatePropagation 的事件处理程序添加一个 event 参数(在代码中参见“ARGUMENT ADDED HERE”行),它确实有效!由于 event 是一个全局对象,这怎么可能,我不明白是什么有效地改变了......!?代码示例:

$(function() {
  var showEventsMessage = function(options) {
    options = $.extend({
      eventType: 'CLICK',
      eventTarget: this,
      suffix: '<br>'
    }, options);
    var message = options.eventType + ': ' +
      (options.eventTarget.nodeName || 'unknown') +
      options.suffix;
    $('#Messages').append(message);
  }

  $('.clickable').click(function() {
    showEventsMessage.call(this, {
      eventType: event.type
    });
  }).dblclick(function() {
    showEventsMessage.call(this, {
      eventType: event.type
    });
  }).mousedown(function(event) /* ARGUMENT ADDED HERE */ {
    showEventsMessage.call(this, {
      eventType: event.type
    });
    event.stopImmediatePropagation();
    event.preventDefault();
  }).mousedown(function() {
    showEventsMessage.call(this, {
      eventType: event.type,
      suffix: '#2<br>'
    });
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='clickable'>CLICK HERE ...
  <p class='clickable'>or here!</p>
</div>
<div id="Messages"></div>

最佳答案

区别在于参数是一个jQuery事件对象,没有参数它使用原始的JS事件对象。您获得 jQuery 版本是因为您使用 jQuery 初始化了事件处理程序。

您尝试调用“stopImmediatePropagation”的函数是一个 jQuery 函数,未在原始 JS 事件中定义,这就是它不起作用的原因。

关于JavaScript stopImmediatePropagation 在事件处理程序中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50871751/

相关文章:

javascript - 单击输入键上的 anchor 标记链接

javascript - 避免从主干 View 重新渲染图像和其他内容

c# - 从通用类调用通用事件处理程序

javascript - 想找到一种在 javaScript 中还原 'onclick' 的方法

javascript - 动态分配的 ID

javascript - 新的 Google 日历登陆页面滚动

java - 处理 JavaFX 事件,例如从文本字段控件捕获文本

android - 应用在设备中运行时,如何区分onTouchEvent方法中的点击事件和触摸事件?

c# - Naudio录音麦克风X秒钟

javascript - 在php/javascript中单击另一个页面中的按钮时需要启用按钮