2013-02-27 73 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