2011-05-22 23 views
1

我創建腳本,它發送AJAX請求和刷新選擇與選項元素的列表元素。有人做過之後,我嘗試使用JQuery plugin jQuery.sortElements.js選項元素進行排序:JQuery的種類只有斷點在Firebug存在

/* If region is specified */ 
    if (regionId != '0') { 
     /* AJAX request to get city list and refresh select state. */ 
     $.getJSON('/json/cities', {region_id: regionId}, function(json) { 
      $("select.changedBy-" + regionSelectId).each(function() { 
       var citySelect = $(this); 
       $.each(json, function(id, name) { 
        $('<option value="' + id + '">' + name + '</option>').appendTo(citySelect); 
       }); 
      }); 
     }); 

     /* Sorting */ 
     $("select.changedBy-" + regionSelectId).each(function() { 
      $(this).find('option').sortElements(function(option1, option2) { 
       var option1Value = $(option1).attr('value'); 
       var option2Value = $(option2).attr('value'); 
       if (option1Value == '0') return -1; 
       if (option2Value == '0') return 1; 
       if (option1Value == regionId) return -1; 
       if (option2Value == regionId) return 1; 
       return $(option1).text() > $(option2).text() ? 1 : -1; 
      }); 
     }); 
    } 
}; 

不幸的是,整理作品只有當我把斷點在Firebug在下面一行:

$("select.changedBy-" + regionSelectId).each(function() { 

在其他情況下(常規模式)它不排序選項元素。你能幫我找到這個問題的原因嗎?

謝謝, 鮑里斯。

回答

2

聲音和看起來像一個時間問題。你意識到getJSON()調用是異步的,對吧? JavaScript引擎將獲得$.getJSON(),發出請求,然後幾乎立即得到您的排序代碼。它將無法排序,因爲沒有任何要排序的元素,但是由於請求尚未完成。

我懷疑當你把一個斷點,提供足夠的時間來完成請求,你看到的東西工作,你期望他們的方式。

我會建議把所有的分類代碼getJSON()回調函數內的以下

  1. 一個,您將追加之後所有的新<option>小號
  2. 結束語排序代碼的函數,調用創建完之後,該函數的所有新<option>小號

這裏的第一個建議代碼(無窮容易 - 它涉及到剛剛剪切和粘貼您的排序代碼步入回調函數體):

if (regionId != '0') { 
     /* AJAX request to get city list and refresh select state. */ 
     $.getJSON('/json/cities', {region_id: regionId}, function(json) { 
      $("select.changedBy-" + regionSelectId).each(function() { 
       var citySelect = $(this); 
       $.each(json, function(id, name) { 
        $('<option value="' + id + '">' + name + '</option>').appendTo(citySelect); 
       }); 
      }); 

      /* Sorting */    
      $("select.changedBy-" + regionSelectId).each(function() { 
       $(this).find('option').sortElements(function(option1, option2) { 
        var option1Value = $(option1).attr('value'); 
        var option2Value = $(option2).attr('value'); 
        if (option1Value == '0') return -1; 
        if (option2Value == '0') return 1; 
        if (option1Value == regionId) return -1; 
        if (option2Value == regionId) return 1; 
        return $(option1).text() > $(option2).text() ? 1 : -1; 
       }); 
      }); 
     }); 
    } 
0

JavaScript是單線程的語言,你的排序代碼時,沒有選項被接到電話元素已經創建完畢,因爲它們是在完成ajax請求時創建的。要強制排序代碼被稱爲後選擇元素創作是把分類代碼中的函數,調用它的AJAX請求完成,選項元素創建後,它會像:

makeAjaxCall(callBack(){ 
    createOptionElements(); 
    SortOptionElements(); 
}); 

希望它會爲你工作。祝你好運:)

0

Ajax請求可能是異步的。使用同步Ajax請求

相關問題