Rails提供了开箱即用的不同ajax事件。 (更多信息可在此处找到 - https://github.com/rails/jquery-ujs/wiki/ajax,源代码可在此处找到 - https://github.com/rails/jquery-ujs/blob/master/src/rails.js#L125)
现在我有一个自定义小部件,它定义了两个_on()
方法。这是相关的代码片段:
_create: function() {
this._on(this.document, {
"ajax:beforeSend #some-form": function(event, xhr, settings) {
return console.log("Before send");
}
});
this._on({
// Event listeners for widget local events
});
}
我已经到了可以使用两种_on()
方法并且两者都正常工作的地步。第一个监听document
内发生的所有事件(所以如果我有一些非常简单的事件,比如click *
事件 - 它会起作用),第二个事件只监听在窗口小部件中触发的事件。
如果我将rails回调直接绑定到$(document).ready
函数中的元素,一切正常。当我尝试将rails ajax:beforeSend
,ajax:success
和其他类似事件的事件侦听器添加到第一个_on()
方法时,问题就开始了 - 它根本无效。
如何将rails事件与jquery-ui widget事件监听器结合?感谢。
答案 0 :(得分:1)
如果您在jQuery UI中查看_on()
的代码,您会看到它使用regexp /^(\w+)\s*(.*)$/
来获取事件名称和选择器:
var match = event.match( /^(\w+)\s*(.*)$/ ),
eventName = match[1] + instance.eventNamespace,
selector = match[2];
显然,它会将您想要的ajax:beforeSend
事件视为ajax
,将选择器视为:beforeSend #some-form
而不会触发处理程序。
现在使用冒号制作事件名称是很常见的,因此发送拉取请求可能是个好主意。
与此同时,您可以为所需事件注册全局处理程序,并使用不同的名称重新标记它们,而不使用冒号。