【问题标题】:jQuery trigger not firing with bind() or on() for custom eventsjQuery 触发器不使用 bind() 或 on() 触发自定义事件
【发布时间】:2012-06-08 17:52:34
【问题描述】:

谁能告诉我为什么这段代码不起作用?

$('body').on('test', function() {
  alert('test');
});

$('body').trigger('test');

我正在使用 jquery-1.7.2.min。我没有收到任何错误,只是没有任何反应。

我尝试将代码放在内联脚本中,在 $(document).ready() 中,但仍然没有。我也尝试了on()bind() 都没有结果。我看到所有例子都显示相同的语法,那么这有什么不同呢?

【问题讨论】:

  • 这里运行良好,jsfiddle.net/joycse06/XXXhQ
  • 是的,您的语法适用于自定义事件
  • Odd.. 这些示例都有效,但它不在我的页面中。我今天早上刚刚将我的 jQuery 从 1.6.4 更新到 1.7.2,也许我的服务器上有一些缓存问题?我知道on() 直到 1.7 才实施
  • 警报(jQuery.fn.jquery);将检查您的版本,或 alert(typeof jQuery.fn.on);确认函数存在。
  • 我会为我的实例添加,确保你没有包含两次 jquery(.on 注册时的 jquery 对象需要是相同的 jquery 对象(即$)当@否则将调用 987654329@ 否则如果稍后加载另一个 $ 实例,它将几乎擦除在使用第一个 $ jquery 对象时设置的原始回调。旧/原始 jquery 对象将被删除,新的 ( $) 将取代第一个(事件监听器将消失)

标签: jquery triggers bind jquery-events custom-events


【解决方案1】:

尝试委托:

$(document).on('test', 'body', function() {
  alert('test');
});

$('body').trigger('test');

这就像以前的 live() 一样工作。 http://api.jquery.com/live/

【讨论】:

  • 你的代码不能反映 OP 想要什么。 OP 的问题不是委托而是自定义事件
  • 这是一个自定义事件,你是对的,他的代码应该可以工作,我只是根据经验知道有时以这种方式绑定事件(甚至是自定义事件)比直接绑定更容易。来自文档:事件处理程序仅绑定到当前选定的元素;当您的代码调用 .on() 时,它们必须存在于页面上。当然 body 应该存在,但是在我们看不到的情况下发生了一些奇怪的事情,这将克服这一点。 (理论上)。 ;)
【解决方案2】:

看来问题在于 DOM 以某种方式准备就绪。将代码放在内联脚本中是行不通的。将其放置在 $(document).ready() 中将与匿名函数一起使用,但由于某种原因不能使用 '( )' 进行函数调用.. 此代码有效

$(document).ready(start);
function start(){
$('body').on('test', function() {
  alert('test');
});

$('body').trigger('test');
}

但这并没有... *注意函数调用括号。

$(document).ready(start());
function start(){
$('body').on('test', function() {
  alert('test');
});

$('body').trigger('test');
}

一个确切的例子在jsfiddle 上可以双向使用,但由于某种原因,我的服务器上只有一种方式可以使用。我想这会引发另一个问题,但至少我们可以看到这段代码确实有效,我的东西有一些奇怪的异常:/

【讨论】:

  • 那是因为你的语义不正确。 start() 将传递 start 函数的返回值。而 start 将传递文档准备好时要执行的函数。通常,人们传递匿名函数: $(function() {/*my stuff here*/});
  • 感谢这对我也有用。在“on”声明周围添加准备好的文档有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2012-10-31
相关资源
最近更新 更多