坚持奇怪的jQuery错误

时间:2011-02-17 15:33:04

标签: 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",
            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触发。我调试了它。它应该工作,它执行该行,但没有出现

3 个答案:

答案 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:回调中。在此代码触发时,ilength的值相同,因此该索引处没有任何项目。

换句话说,最后一项是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');

相关问题