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");

});