Javascript 陷入奇怪的jQuery错误
好的,这是我的代码,它存储在一个外部js文件中,并正确地包含在head部分的主html中Javascript 陷入奇怪的jQuery错误,javascript,jquery,fancybox,external,Javascript,Jquery,Fancybox,External,好的,这是我的代码,它存储在一个外部js文件中,并正确地包含在head部分的主html中 $(document).ready(function(){ var checkForConfirmation = function(){ for(var i=0; i<myOrders.length; i++){ $.ajax({ type: "GET", url: "orderStatus.php",
$(document).ready(function(){
var checkForConfirmation = function(){
for(var i=0; i<myOrders.length; i++){
$.ajax({
type: "GET",
url: "orderStatus.php",
data: {action: 'get', id: myOrders[i]},
success: function(data){
if (data){
var reply = jQuery.parseJSON(data);
$("#fancyAlertLink").fancybox().trigger('click');
myOrders.splice(myOrders[i], 1);
}
}
});
if (myorders.length == 0){
clearInterval(waitForRestourantInterval);
}
}
}
if (myOrders.length > 0){
var waitForRestourantInterval = setInterval(function(){checkForConfirmation()}, 5000);
}
});
主html文件:(smarty+html,smarty{literal}标记在本文中被忽略)
var myOrders=新数组();
{foreach from=$smarty.session.my_orders item=id}
myOrders.push({$id}):
{/foreach}
$(文档).ready(函数){
$(“#fancyAlertLink”).fancybox();
});
---这里有一些内容---
Fancybox地狱耶!!!
按预期设置时间间隔和AJAX工作。当我点击“ShowFancy”链接时,fancybox会显示出来。但它不会从外部js触发。我调试了它。它应该可以工作,它执行该行,但是没有出现任何东西试图触发对元素的单击,例如
$('fancyAlertLink')。trigger('click')代码>尝试触发对元素的单击,例如$('fancyAlertLink')。触发('click')代码>这里有一个问题:当您在“for”循环中设置这些AJAX调用时,“success”处理程序中的代码引用用于循环迭代的变量“i”。这将是一个大问题,因为所有函数都将引用相同的变量“i”。因此,当函数实际被调用时,当HTTP请求完成时,它们都将看到相同的值“i”(这将是循环运行时“i”的最后一个值)
要解决该问题,请以稍微不同的方式设置“成功”处理程序:
success: (function(i) {
return function(data) {
if (data){
var reply = jQuery.parseJSON(data);
$("#fancyAlertLink").fancybox().trigger('click');
myOrders.splice(myOrders[i], 1);
}
};
})(i)
这样做将确保每个单独的处理程序都有自己的“i”副本,以及一个具有正确值的副本。这里有一个问题:当您在“for”循环中设置这些AJAX调用时,“success”处理程序中的代码引用用于循环迭代的变量“i”。这将是一个大问题,因为所有函数都将引用相同的变量“i”。因此,当函数实际被调用时,当HTTP请求完成时,它们都将看到相同的值“i”(这将是循环运行时“i”的最后一个值)
要解决该问题,请以稍微不同的方式设置“成功”处理程序:
success: (function(i) {
return function(data) {
if (data){
var reply = jQuery.parseJSON(data);
$("#fancyAlertLink").fancybox().trigger('click');
myOrders.splice(myOrders[i], 1);
}
};
})(i)
这样做将确保每个单独的处理程序都有自己的“i”副本,以及具有正确值的副本。编辑:可能存在一些问题
- 您正在将myOrders[i]
传递到.splice()
。我假设它不包含像.splice()
这样的索引号
i的值
问题如下所述
即使解决了这两个问题,您仍然有一个问题,因为.splice()
修改了数组,因此任何高于拼接中使用的索引号都是过时的,因为.splice()
正在从数组中删除项目
你正在做:
myOrders.splice(myOrders[i], 1);
在success:
回调到异步AJAX调用中。当该代码触发时,i
与length
的值相同,因此该索引中没有任何项
换句话说,最后一项是length-1
,但是i==length
somyOrders[i]==undefined
一个简单有效的修复方法是将myOrders[i]
设置为AJAX调用的context
参数
$.ajax({
type: "GET",
url: "orderStatus.php",
context: myOrders[i],
然后在success:
回调中,此
将引用该项
success: function(data){
if (data){
var reply = jQuery.parseJSON(data);
$("#fancyAlertLink").fancybox().trigger('click');
// -------------v-----references the proper item
myOrders.splice( this, 1);
}
}
编辑:可能存在一些问题
- 您正在将myOrders[i]
传递到.splice()
。我假设它不包含像.splice()
这样的索引号
i的值
问题如下所述.splice()
修改了数组,因此任何高于拼接中使用的索引号都是过时的,因为.splice()
正在从数组中删除项目你正在做:
myOrders.splice(myOrders[i], 1);
在success:
回调到异步AJAX调用中。当该代码触发时,i
与length
的值相同,因此该索引中没有任何项
换句话说,最后一项是length-1
,但是i==length
somyOrders[i]==undefined
一个简单有效的修复方法是将myOrders[i]
设置为AJAX调用的context
参数
$.ajax({
type: "GET",
url: "orderStatus.php",
context: myOrders[i],
然后在success:
回调中,此
将引用该项
success: function(data){
if (data){
var reply = jQuery.parseJSON(data);
$("#fancyAlertLink").fancybox().trigger('click');
// -------------v-----references the proper item
myOrders.splice( this, 1);
}
}
这行代码似乎无效($(“#fancyAlertLink”).fancybox().trigger('click');)这到底应该做什么?@guildsbounty这绝对不是真的。这行代码没有问题。如果从firebug命令行调用$(“#fancyAlertLink”).fancybox().trigger('click'),该怎么办?如果您使用未调用.fancybox()的$函数执行某些操作会怎么样?这就是您通过假装单击打开fancybox模式的方式,如果您删除其上方的行会怎么样?@ZolaKt您可以发布JSON响应的样子吗?该行似乎无效($(“#fancyAlertLink”).fancybox().trigger('click');)这到底是怎么回事?@行会赏金那绝对不是真的。这行代码没有问题。如果从firebug命令行调用$(“#fancyAlertLink”).fancybox().trigger('click'),该怎么办?如果你用$function做了一些不调用.fancybox()的事情怎么办?这就是你如何通过假装点击打开一个fancybox模态,它看起来很好,如果你删除它上面的行怎么办?@ZolaKt