好的,这是我的代码,它存储在外部js文件中,并正确包含在head部分的主html中。
$(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);
}
});
正如您所看到的,我正在尝试在后端脚本(“orderStatus.php”)获取正确数据时显示fancybox。
如果我不使用jQuery(例如:window.alert而不是fancybox),一切正常,但是当我尝试在这个函数中使用jQuery时,我得到一个奇怪的错误。
Firebug说行$("#fancyAlertLink").fancybox().trigger('click');
没有错误说明,只是“$(”
我做错了什么???
对不起。我知道这不是一个答案,但我不能全部评论。 这是“更新的”代码。 错误现在消失了,但fancybox仍然不会从我的脚本中触发。
编辑:在成功功能内部,触发器不起作用。我试着将它移到外面并且有效。问题是我在成功的过程中确实需要它。我试图在单独的函数中移动触发器调用并从成功调用函数,但结果相同。不行!有什么建议吗?
confirmationDaemon.js
$(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]},
context: i,
success: function(data){
if(data!="null"){
var reply = jQuery.parseJSON(data);
$("#fancyAlertLink").trigger("click");
myOrders.splice(this, 1);
}
}
});
if (myOrders.length == 0){
clearInterval(waitForRestourantInterval);
}
}
}
if (myOrders.length>0){
var waitForRestourantInterval = setInterval(function(){checkForConfirmation()}, 5000);
}
});
主html文件:(此帖子中忽略了smarty + html,smarty {literal}标签)
<html>
<head>
<script src="jquery-1.4.4.min.js" type="text/javascript"></script>
<script src="fancyBox/jquery.fancybox-1.3.4.pack.js" type="text/javascript"></script>
<link rel="stylesheet" href="fancybox/jquery.fancybox-1.3.4.css" type="text/css" media="screen" />
<script type="text/javascript">
var myOrders = new Array();
{foreach from=$smarty.session.my_orders item=id}
myOrders.push({$id}):
{/foreach}
</script>
<script type="text/javascript">
$(document).ready(function{
$("#fancyAlertLink").fancybox();
});
</script>
<script src="confirmationDaemon.js" type="text/javascript"></script>
</head>
<body>
--- some content here ---
<a id="fancyAlertLink" href="#fancyAlert">Show fancy</a>
<div style="display:none">
<div id="fancyAlert">Fancybox hell yeah!!!</div>
</div>
</body>
</html>
设置间隔和AJAX按预期工作。当我点击“显示花式”链接时,会显示fancybox。但它不会从外部js触发。我调试了它。它应该工作,它执行该行,但没有出现
答案 0 :(得分:4)
以下是您将要遇到的一个问题:当您在“for”循环中设置这些AJAX调用时,“success”处理程序中的代码会引用用于循环迭代的变量“i”。这将是一个大问题,因为所有函数将引用相同的变量“i”。因此,当实际调用函数时,异步地在HTTP请求完成时,它们都将看到相同的“i”值(这将是循环运行时的 last 值“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”副本和一个具有正确值的副本。
答案 1 :(得分:4)
编辑:可能存在一些问题。
您已将myOrders[i]
传递给.splice()
。我假设它不包含.splice()
所需的索引号。
i
问题的价值如下所述。
即使解决了这两个问题,您仍然遇到问题,因为.splice()
修改 数组,因此任何索引号都高于1在拼接中使用已过时,因为您的.splice()
从数组中移除 项目。
你在做:
myOrders.splice(myOrders[i], 1);
在异步AJAX调用的success:
回调中。在此代码触发时,i
与length
的值相同,因此该索引处没有任何项目。
换句话说,最后一项是length - 1
,但是i == length
所以myOrders[i] == undefined
。
一个简单有效的解决方法是将myOrders[i]
设置为AJAX调用的context
参数。
$.ajax({
type: "GET",
url: "orderStatus.php",
context: myOrders[i],
然后在success:
回调中,this
将引用该项目。
success: function(data){
if (data){
var reply = jQuery.parseJSON(data);
$("#fancyAlertLink").fancybox().trigger('click');
// -------------v-----references the proper item
myOrders.splice( this, 1);
}
}
答案 2 :(得分:1)
尝试触发元素点击,例如$('#fancyAlertLink').trigger('click');