2011-07-02 160 views
-1

我有一個非常奇怪的JS和jQuery問題。JavaScript只執行一個斷點

$('#skip').click(function(e) { 
    savePhoto('skip'); 
    showNextPlace(); 
    photo_changed = 0; 
    return false; 
}); 

showNextPlace()photo_changed = 0;當我添加一個斷點只執行。 savePhoto();的代碼是非常基本的。我根據狀態和位置數組中元素的數量提交請求。

function savePhoto(status) 
    { 
     if (places.length <= 5) 
     { 
      // load more places 
      $('#loadmore').val('1'); 
     } 

     // Don't send a request on skip unless we need more places 
     if (status != 'skip' || $('#loadmore').val() == 1) 
     { 
      $.ajax({ 
       url: "url" + status, 
       cache: false, 
       data: $('#form_photo').serialize(), 
       success: function(results){ 
        // dont load more places until we have few 
        $('#loadmore').val('0'); 

        if (results != '[]') 
        { 
         for (var i in results) 
         { 
          places.push(results[i]); 
         } 
        } 
       } 
      }); 
     } 
    } 

任何想法爲什麼發生這種情況,或者我該如何更好地調試問題?

+0

如果你在'success'回調中註釋掉代碼,它會工作嗎?你有任何錯誤?將一些日誌記錄添加到函數調用中,以查看真正正在運行的內容,例如'console.log('showNextPlace')'到'showNextPlace'函數。 – Heikki

回答

-1

該問題與AJAX調用無關。在代碼的另一部分,每次用戶按下保存按鈕時,我都會將一個事件綁定到圖像域(所以第二次代碼被執行2次,第3次3等)。請記住解除綁定!

另外,即使我點擊跳過,作物&保存插件的某些部分也正在執行,所以我添加了一些控制變量。

解決方案:邏輯可以去的每個路徑上的console.log()。

+0

代碼的另一部分 - 你沒有向我們展示?! –

+0

我以爲這是不相關的!很高興我發現它:) – fesja

2

異步調用XHR

$.ajax({ ... }) 

大概到達,而斷點是存在的,但在不具有斷點運行,在XHR請求仍然在飛行到達該代碼時。

也許你應該有一個$ .ajax調用的回調函數,顯示地點加載後的下一個地方。

你可以有$就處理程序調用showNextPlace如果布爾needsToShowNextPlace是真實的,並有showNextPlace組Boolean如果沒有下一個地方來顯示它被調用。

+0

謝謝,但AJAX請求並不總是執行(如果status = skip和loadmore = 0,我不會像你所看到的那樣調用它),並且成功代碼不會修改showNextPlace()函數。 – fesja

+0

@fesja,我假設'showNextPlace'使用由成功代碼修改的'places'數組。情況並非如此嗎? –

+0

是和不是。在'places'數組中,我有一個地方的隊列。當我調用AJAX請求時,我在數組上有5個元素。我將收到的地點添加到隊列中。但是這個問題與這個AJAX請求無關。請參閱下面的答案。不管怎麼說,還是要謝謝你! – fesja

1

由於$.ajax調用是異步的,你應該把你的代碼在success處理程序是這樣的:

success: function(results){ 
    // dont load more places until we have few 
    $('#loadmore').val('0'); 
    if (results != '[]') 
    { 
     for (var i in results) 
     { 
      places.push(results[i]); 
     } 
    } 
    showNextPlace(); //Moved here 
    photo_changed = 0; //Moved here 
} 

所以您點擊綁定將是:

$('#skip').click(function(e) { 
    savePhoto('skip'); 
    return false; 
}); 

它不工作,因爲,在您的原始代碼中,showNextPlace()photo_changed=0savePhoto('skip')完成其執行之前正在執行。 (多數民衆贊成在異步)。它與斷點一起工作,因爲它給了savePhoto()足夠的時間來完成。

希望這會有所幫助。歡呼聲

+0

更好的做法是讓'savePhoto'接受回調。 –

+0

你說得對。但我想讓他知道這個想法,然後他就可以重構它。 –

+0

謝謝,但這不是我期望它的工作。保存當前照片並顯示下一張照片是兩個不同的和不相關的事件。我發送了AJAX請求,但我沒有對修改showNextPlace()函數的結果做任何事情。我只是想讓界面更快,所以我將照片保存在背景上,然後立即加載下一張。更進一步,AJAX請求並不總是執行(如果status = skip和loadmore = 0,我不會像你所看到的那樣調用它)。 – fesja