2013-02-27 87 views
3

可变值设置不正确的getJSON函数内。变量$ videoId在第一个Alert中按预期显示396和397。变量值设置不正确

但在第二次警报中,值397显示两次。

我在这里错过了什么吗?我在这里找不到其他任何讨论这类问题的帖子。如果是这样,请在那边指向我。

下面是jQuery代码。

$("div .ow_video_list_item").each(function(){   
    $videoId = $(this).children("a").attr("href").split("/")[5]; 
    alert($videoId); ==> First Alert 

    $.getJSON("video/get-embed/" + $videoId + "/", function (data) 
    {       
     $.each(data, function (key, code) {         
      alert($videoId); ==> Second Alert 
     });  
    }); 

    }); 

下面是HTML代码:

<div class="ow_video_list_item ow_small"> 
    <a href="http://site.com/video/396">Video 1</a> 
</div> 

<div class="ow_video_list_item ow_small"> 
    <a href="http://site.com/video/397">Video 2</a> 
</div> 
+2

上面的代码中没有任何地方确实定义或设置了一个名为$ videoId的变量。 – samjudson 2013-02-27 14:23:22

+0

是$ videoLink拼写错误$ videoId? – Andre 2013-02-27 14:23:42

+0

这是一种类型,我现在纠正它。 – Purus 2013-02-27 16:09:33

回答

1

关于getJson异步性质的其他评论是正确的。但主要是,问题是你使用全局变量$ videoId。 如果更换:

$videoId = $(this).children("a").attr("href").split("/")[5]; 

通过

var $videoId = $(this).children("a").attr("href").split("/")[5]; 

你会没事的,使用异步方法时也是如此。

+0

谢谢。它真的帮助了我。 – Purus 2013-02-28 14:24:08

1

假设$videoLink其实$videoId通过评论指出:

这是因为getJSON方法是异步的,你正在处理的JavaScript关闭。当您执行getJSON回调:

function (data) 
    {       
     $.each(data, function (key, code) {         
      alert($videoId); ==> Second Alert 
     }); 

您已经在第一循环的每个和$ VideoID的循环所采取的最后一个值,因此397个两倍的显示。

看一看JavaScript的闭包是如何在这里工作:How do JavaScript closures work?

+0

我真的很困惑学习关于混蛋。似乎对我来说很复杂..感谢您指点我这个链接。 – Purus 2013-02-28 14:25:51

1

当你这样做getJson方法,您可以使用异步代码。在这种情况下,您给$videoID的最后一个值是397,这两个回调都是警报值。有几种方法可以解决这个问题。例如,您可以返回getJson操作中检索到的“数据”中的videoID值和使用它的alert(data.videoID)。或者,您可以使用具有适当键的值的数组,而不是具有简单的整数变量。例如,它可能是索引(i$().each(function(i,e) {}))。你需要找到一种方法来使它像那样工作。我认为data.id是最简单的方法!希望它有帮助。

1

一对夫妇的事情。

  • 在你的代码无处是$ videoId定义,我假设$ videoLink真的应该是$ videoId。对于未来的参考,如果可能更容易做一些这样的访问数据点

<a href="http://site.com/video/396" data-video-id="396">Video 1</a>

这样,你可以很容易地访问视频ID与$(element).data('videoId')。还有其他的策略,比如使用类。

  • 如果$录象不应该是你的代码示例$ VideoID的,那么$ VideoID的是,功能范围之外的某处定义。 JS中有很多关于范围/关闭的资源。如果你正在做一个体面的JS开发工作,我会建议Javascript: The good parts

  • 回到假设$ videoLink实际上是您的代码示例中的$ videoId。你在那个.each循环内部赋值它的值,但是那个变量本身并不是在那个函数内部“关闭”的。它可以是全局的,也可以是在每个循环范围之外的其他地方定义的。在$videoLink =语句前面抛出var以保持包含的var。

  • 另一个潜在的问题是您正在调用对服务器的异步调用,但取决于该异步调用范围之外的变量。大多数情况下,这些调用都是毫秒,但理解发生的一个好方法是通过代码精心逐步完成,并假装每个服务器调用需要1分钟。在你的例子中,外层循环运行一次,获取396的id然后触发一个AJAX请求,然后再次循环,并为id 397做同样的事情。服务器没有响应第二个Ajax请求开火。所以你现在有2个Ajax请求。一分钟后,他们回来看看,你的$ variableLink变量的值是397,因为它是在ajax回调函数之外定义的。解决方案?有几个。您可以使用您从服务器获取的某些数据来获取所需的数据,也可以保留从服务器访问的潜在视频的阵列/散列。

还有其他的方法来做到这一点,但不知道是什么,你正在尝试做的超越跟踪该变量的确切使用情况就很难说了。但是这应该给你一个很好的起点。

+0

感谢您的详细回复。这些帮助我理解了关于jQuery范围的许多事情。 – Purus 2013-02-28 14:25:04