Javascript 如何在JQuery中解决这个问题?
所以,我有一个文本框,当用户离开它时…这个东西会被触发并处理 好的,问题是: 当用户单击表单提交按钮时,就会触发此模糊事件。在处理过程中,表单提交。这把一切都搞砸了 我该如何解决这个问题?Javascript 如何在JQuery中解决这个问题?,javascript,jquery,css,templates,forms,Javascript,Jquery,Css,Templates,Forms,所以,我有一个文本框,当用户离开它时…这个东西会被触发并处理 好的,问题是: 当用户单击表单提交按钮时,就会触发此模糊事件。在处理过程中,表单提交。这把一切都搞砸了 我该如何解决这个问题? 我考虑在form.submit上添加一个延迟,以便它完成处理。但是,这是个坏主意,因为我不知道用户的浏览器和/或谷歌地图有多快。使用javascript提交表单。编写一个函数,调用onsubmit并检查blur事件中应该发生的事情是否已经完成。然后只提交您的表单是否尝试使用标志 $("#id_address_
我考虑在form.submit上添加一个延迟,以便它完成处理。但是,这是个坏主意,因为我不知道用户的浏览器和/或谷歌地图有多快。使用javascript提交表单。编写一个函数,调用onsubmit并检查blur事件中应该发生的事情是否已经完成。然后只提交您的表单是否尝试使用标志
$("#id_address_input").bind("blur",function(e){
//do a lot of stuff, set variables.
});
在
blur
处理程序中,您必须做一些“让”到浏览器的事情(一个setTimeout
,一个异步ajax调用,等等),否则,浏览器将不会中断JavaScript代码来提交表单。请参见下面的示例以证明这一点
如果您正在执行从blur
处理程序中产生到浏览器的操作,则必须使用submit
处理程序阻止表单提交,然后在所有操作(包括blur
处理程序中的各种操作)准备就绪时将其提交。这可能有点复杂
最好的解决办法是删除blur
处理程序中向浏览器屈服的任何内容。如果您不能这样做,您可能正在查看表单上的锁定计数器,并让提交处理程序检查该锁定计数器:
var doSubmit = true;
$("#id_address_input").bind("blur",function(e){
doSubmit = false;
//do a lot of stuff, set variables.
doSubmit = true;
});
$("#form").submit(function(){
if(doSubmit){
return true;
}else{
// keep checking until doSubmit is true
window.setInterval(function(){if(doSubmit){$("#form").submit();}},1000);
return false;
}
});
(下面是我们的阻塞示例的一个版本,但已更新以适应浏览器)
请注意,如果您的表单提交到新窗口,您可能会遇到弹出窗口阻止程序(因为新窗口不会直接响应用户的单击)。但是如果你没有做类似的事情,那么你在上述方面的状态很好
下面是一个
blur
处理程序的示例,该处理程序在提交表单之前造成了很大的延迟(四秒钟):
HTML:
搜索:
JavaScript:
<form action='http://www.google.com/search' target='_new'>
<label>Search for:
<input type='text' name='q' value='foo'></label>
<br><input type='submit' value='Search'>
</form>
$('input[name=q]').blur(function(){
var端,计数器;
显示(“开始模糊”);
计数器=0;
end=新日期().getTime()+4000;
while(新日期().getTime()
将光标放在文本框中,然后单击“搜索”。您将看到四秒钟的延迟,然后搜索将在新窗口中打开。我已经在Chrome、Firefox和Opera(Linux上)、IE6(Windows 2000上)和IE7(Windows XP上)上进行了测试。所有的行为都是相同的。“并且在处理的中间,表单提交。”真的吗?你是在做一些有收益的事情吗?(
setTimeout
,ajax…)您不想使用“提交”
事件吗?在这种情况下,您不希望返回true
…需要返回true,而不是在末尾返回submit()。
<form action='http://www.google.com/search' target='_new'>
<label>Search for:
<input type='text' name='q' value='foo'></label>
<br><input type='submit' value='Search'>
</form>
$('input[name=q]').blur(function() {
var end, counter;
display("Start blurring");
counter = 0;
end = new Date().getTime() + 4000;
while (new Date().getTime() < end) {
++counter;
if (counter % 100000 == 0) {
display("Still blurring");
}
}
display("Done blurring");
});