昨天我问了一个问题,我接受了答案,但不久之后,我才知道解决方案还没有完成。问题是: -
Insert a JQuery click handler that executes before the ones already registered
立即使用setTimeout(handler,0);
返回,我无法使用return setTimeout(handler,0);
。如何同步运行此handler
并且不允许父函数完成,直到此处理程序完全执行并从中获取返回值?
我很着急,所以我再次问它,而不是再次编辑这个问题。
答案 0 :(得分:2)
您无需使用setTimeout
。如果你不使用setTimeout
,你的处理程序可以同步,你可以在你的函数中返回你想要的所有值。
<script>
function f2() {
alert('Handler declared in HTML')
}
buttons = document.getElementsByTagName('input'); // refine this, later
for (i = 0, max = buttons.length; i < max; i++) {
oldonclick = buttons[i].onclick;
buttons[i].onclick = function() {
alert('Prepend handler');
oldonclick();
}
}
</script>
答案 1 :(得分:0)
快速回答:如何改变:
setTimeout(clickhandler, 0);
到
eval(clickhandler)();
到
eval(clickhandler);
$(document).ready(function() {
$("input[type=button]").each(function() {
// your button
var btn = $(this);
// original click handler
var clickhandler = btn.data("events").click[0];
btn.unbind("click", clickhandler);
// new click handler
btn.click(function() {
alert('Prepended Handler');
clickhandler();
});
});
});
function f2() {
alert('Handler declared in HTML');
}
现在点击处理程序是一个函数,对吗?
答案 2 :(得分:0)
由于超时是异步的,你需要在超时内设置变量(和/或调用回调函数)。
var x = 1;
setTimeout(function() {
x = 2;
}, 2000);
这是一个带回调函数的例子。你需要的是你想要在变量发生变化后立即对变量做些什么。
var x = 1;
function callback(x) {
console.log(x);
}
setTimeout(function() {
x = 2;
callback(x);
}, 2000);
执行超时后,这将log
2
。
根据你正在尝试做什么,你可能根本不需要超时,这可以避免异步性和很多麻烦。