2012-03-15 41 views
0

经过一些调试之后,似乎每个语句之前的代码都在每个语句完成之前执行。脚本在每个完成之前被执行

我也注意到,每个函数循环两次。

这是发生了什么:

  1. 单击#ProductsSubmit元素
  2. 警报弹出窗口了消息上: '事件触发' - (该#ProductSubmit click事件只被触发一次。警报框只弹出一次。)
  3. 通过使用Firefox萤火虫,我可以看到get函数被调用4次。只有2个.AddProduct元素。查看包含抓取的元素ID的URL时,我可以看到.each()函数正在循环两次,但请记住#ProductSubmit click事件仅触发一次。
  4. 第一个警报(ErrorFound)弹出值为0.我证实get回调正在触发if(VerifyData ['Valid']!='Yes')语句。因此if语句在100%的时间内为真(用于调试)
  5. Settimeout被触发。警报弹出窗口显示警报(ErrorFound)为1

所以它看起来像警报(ErrorFound)之前ErrorFound在每个语句设置为1被触发。但是,当我在上面拖延时,它似乎赶上并显示应该是什么值,这是1.

var ErrorFound; 

$(document).ready(function(){ 

$(document).delegate("#ProductsSubmit", 'click', function(){ 
alert('Event Triggered'); 
ErrorFound = 0; 
$(".AddProduct").each(function(){ 
    var IDToConfirm = $(this).attr('id'); 
    var SKUToConfirm = $(this).val(); 
     $("#"+IDToConfirm).removeClass("InputError"); 
     $.get('http://www.example.com/script.php?s='+SKUToConfirm+'&ut='+IDToConfirm, function(data) { 
      var VerifyData = jQuery.parseJSON(data); 
      if(VerifyData['Valid']!='Yes') { ErrorFound = 1; $("#"+VerifyData['ID']).addClass("InputError"); } 
     }); 


}); 
// Alert box shows value as 0 
alert(ErrorFound); 
setTimeout("AlertError()", 5000); 

return false; 
}); 

}); 
function AlertError() { 
// Alert box shows value as 1 
alert(ErrorFound); 
} 

这是怎么回事?我已经尝试了很多解决方法,但还没有找到任何可行的方法。

+0

'$ .get()'是异步的。阅读承诺。 – Interrobang 2012-03-15 23:10:19

+0

'.delegate()'已弃用,请使用'.on()' – mowwwalker 2012-03-15 23:10:22

+1

**绝不**将字符串传递给'setInterval()'或'setTimeout()'。这样做与使用'eval()'一样糟糕,并且只要使用变量,就会导致不可读和可能不安全的代码,因为您需要将它们插入到字符串中,而不是传递实际变量。正确的解决方案是'setInterval(function(){/ * your code *)},msecs);'。 'setTimeout()'同样适用。如果你只想调用一个没有任何参数的函数,你也可以直接传递函数名:'setInterval(someFunction,msecs);'(注意函数名后面有** no **'()') – ThiefMaster 2012-03-15 23:11:04

回答

0

请记住,无论您的ajax调用的状态如何,您的.each循环都将持续运行。 ajax调用对回调函数做出响应,而不像其他代码那样是程序性的。

当只有两个迭代期望执行4个调用的问题时,这是一个棘手的问题..我会说尝试使用其他方法的选择,除了委托来测试不同但类似的情况下的行为您可以使用.click,.on('click'),.bind('click'),.live('click')< - 不推荐使用)..只需检查它即可获得更完整的图片。

+0

我将更新代码以使用未弃用的功能。希望我能找到一种方法让它工作。 – Brandon 2012-03-15 23:47:42

0

您正在被重定向。你真的使用该网址吗?

+0

不是。这仅仅是为了在这个论坛发帖。 – Brandon 2012-03-15 23:48:08

+0

@Brandon,你告诉我们的东西可能不会有问题。如果您将我们链接到相关网页,会更容易。 – mowwwalker 2012-03-15 23:55:19

相关问题