憋屈奇怪的jQuery的错误(Stuck on weird jQuery error)

2019-09-29 09:38发布

好吧,这里是我的代码,它被存储在外部js文件,并适当地包括在头节主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);
}
});

正如你所看到的,我想显示的fancybox当后端脚本(“orderStatus.php”),得到正确的数据。

如果我不使用jQuery(例如:window.alert代替的fancybox)一切正常,但是当我尝试使用jQuery这个函数中,我得到一个奇怪的错误。

萤火虫说,有上线的错误$("#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文件:(智者+ HTML,Smarty的{}文字在这个岗位忽略标签)

<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触发。 我调试了。 它应该工作,它执行的是行,但似乎没有什么

Answer 1:

这里是你将有一个问题:当你设置这些AJAX的“for”循环中调用,在“成功”处理程序的代码引用变量“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)

做这样将确保每个单独的处理器都有自己的“我”的副本,并用正确的值的副本。



Answer 2:

编辑:有可能存在一些问题。

  • 你传递myOrders[i].splice() 我认为它并不包含类似的索引号.splice()要求。

  • 的值i下面描述的问题。

  • 即使解决了这些两个问题,你还有一个问题,因为.splice() 修改数组,比一个在拼接使用的是过时的更高,所以任何索引号,因为你的.splice()去除的数组项。


你在做:

myOrders.splice(myOrders[i], 1);

success:回调到异步AJAX调用。 但与此同时,这代码火灾, i是相同的值length ,使指数在没有项目。

换言之最后一个项目是length - 1 ,但i == length所以myOrders[i] == undefined

一个简单和有效的解决将是设置myOrders[i]作为context AJAX调用的参数。

    $.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);
            }
        }


Answer 3:

尝试触发因素,例如在点击$('#fancyAlertLink').trigger('click');



文章来源: Stuck on weird jQuery error