Javascript 停止播放和开始播放
我想做一个额外的点击处理程序(客户端页面,不能修改他的js/html),在我的脚本中应该是这样的: 1)Javascript 停止播放和开始播放,javascript,jquery,stoppropagation,Javascript,Jquery,Stoppropagation,我想做一个额外的点击处理程序(客户端页面,不能修改他的js/html),在我的脚本中应该是这样的: 1) 事件停止传播(暂停客户端点击传播) 2) 我的功能(完成我的功能,当一切都完成后,下一步执行) 3) event.startPropagation(继续标准客户端操作) 现在,第一和第二项工作。第三个是问题。 我知道事件。startPropagation不存在,但我想要这样的东西。 有什么提示吗?首先不要停止传播 测试my function是否执行了您希望它执行的操作,然后确定是否要停止传播
事件停止传播
(暂停客户端点击传播)2) 我的功能(完成我的功能,当一切都完成后,下一步执行)
3)
event.startPropagation
(继续标准客户端操作)
现在,第一和第二项工作。第三个是问题。我知道
事件。startPropagation
不存在,但我想要这样的东西。
有什么提示吗?首先不要停止传播
测试
my function
是否执行了您希望它执行的操作,然后确定是否要停止传播。如果要分别启用/禁用单击事件,请添加和删除单击处理程序。因为event.stopPropagation()
将阻止事件在dom树上传播
更新:
如果您使用的是jQuery,请使用.trigger()
函数
您可以在父节点f.ex(jQuery)上重新触发相同的事件对象。您需要首先复制事件对象并将其传递到触发器,以便在气泡中捕获相同的事件属性(f.ex
e.pageX
):
演示:
编辑
根据您的评论,我认为您正在寻找以下内容:
$.fn.bindFirst = function(type, handler) {
return this.each(function() {
var elm = this;
var evs = $._data(this).events;
if ( type in evs ) {
var handlers = evs[type].map(function(ev) {
return ev.handler;
});
$(elm).unbind(type).on(type, function(e) {
handler.call(elm, e, function() {
handlers.forEach(function(fn) {
fn.call(elm);
});
});
});
}
});
};
此原型允许您绑定一个“高级处理程序”,该处理程序包含一个next
函数,该函数将在需要时执行同一元素的所有以前的处理程序像这样使用它:
$('button').click(function() {
console.log('first');
}).click(function() {
console.log('second');
}).bindFirst('click', function(e, next) {
console.log('do something first');
setTimeout(next, 1000); // holds the other handlers for 1sec
});
演示:当我单击锚定时,我的函数(GET to DB)没有时间执行。我认为它有必要停止传播,你应该考虑可能的用户体验伤害:用户点击某个东西,直到数据库调用完成后什么也不会发生。最坏的情况是,这可能是长时间的无响应。这是一个错误的答案,因为当同一元素上有多个事件冒泡时,通常需要停止传播。这就是这个方法存在的全部原因。好吧,我尝试了很多方法,但没有得到好的结果。也许我做错了什么。例如://客户端,他自己的click处理程序$('p')。click(函数(e){document.location='';})//我的脚本$('p')。单击(函数(e){e.stopPropagation();e.preventDefault();$.get(....,…,function(){//如果确定,则执行类似startPropagation})的操作)@PiotrWójcik听起来像是在寻找
stopImmediatePropagation()
,因为处理程序附加到同一个元素:。请记住,它不会停止执行以前绑定的处理程序。或者你只需要找到已经绑定的处理程序,保存它们,然后在你自己的触发器中执行它们。@PiotrWójcik我用一个可能的解决方案编辑了我的答案,这就是你需要的吗?回答不错!这正是我想要的——遗憾的是,它显然依赖于JQuery的内部结构,即$。\u data(this)
——在不同版本之间可能会发生变化。但是真的很好-只是投了更高的票-顺便说一句,大卫,如果你有一个版本不依赖于我认为它是一个内部调用-即$。\u数据(这个)
请让我们知道:)Alrighty@DavidHelsing-再次-可爱的答案-我确实有一个“骨头”要挑-这是-我会改变行fn.call(elm)代码>到fn.call(elm,e)代码>-为了保留其他处理程序对原始事件的访问:)如果您可以编辑上面的代码,那就太好了;)
$('button').click(function() {
console.log('first');
}).click(function() {
console.log('second');
}).bindFirst('click', function(e, next) {
console.log('do something first');
setTimeout(next, 1000); // holds the other handlers for 1sec
});