English 中文(简体)
陷入奇怪的jQuery错误
原标题:Stuck on weird jQuery error

好吧,这是我的代码,它存储在一个外部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(点击)

没有错误描述,只有“$(”

我做错了什么???


Sorry. I know this is not an answer, but I can t put it all in comment. Here is the "updated" code. Error is gone now, but fancybox still will not trigger from my script.

编辑:在成功函数内部时,触发器不起作用。我试着把它移到外面,效果很好。问题是我真的需要它才能成功。我试图在单独的函数中移动触发器调用,并从成功中调用该函数,但结果相同。不起作用!有什么建议吗?

确认Daemon.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="确认Daemon.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工作。当我点击“显示幻想”链接时,幻想盒就会显示出来。但它不是由外部js触发的。我调试了它。它应该可以工作,它执行了那一行,但什么也没有出现

问题回答

这里有一个问题:当您在“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);

在<code>成功:</code>回调到异步AJAX调用中。当此代码激发时,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);
            }
        }

尝试触发点击元素,例如$(#fancyAlertLink).trigger(点击)





相关问题
selected text in iframe

How to get a selected text inside a iframe. I my page i m having a iframe which is editable true. So how can i get the selected text in that iframe.

How to fire event handlers on the link using javascript

I would like to click a link in my page using javascript. I would like to Fire event handlers on the link without navigating. How can this be done? This has to work both in firefox and Internet ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Clipboard access using Javascript - sans Flash?

Is there a reliable way to access the client machine s clipboard using Javascript? I continue to run into permissions issues when attempting to do this. How does Google Docs do this? Do they use ...

javascript debugging question

I have a large javascript which I didn t write but I need to use it and I m slowely going trough it trying to figure out what does it do and how, I m using alert to print out what it does but now I ...

Parsing date like twitter

I ve made a little forum and I want parse the date on newest posts like twitter, you know "posted 40 minutes ago ","posted 1 hour ago"... What s the best way ? Thanx.