2010-04-01 38 views
1

有趣的是,如果我刪除警報(data [i] .id)的註釋代碼的作品。就像在這個例子中,字符串不是連接的,因此我在選擇框中沒有選項。提示?幫幫我?有趣的jQuery代碼行爲

重新編輯,這樣你們可以看到整個方法

function socialbookmarksTableData(data) 
{ 
    var toAppend = ''; 
    var bookmarkingSites = ''; 

    $.getJSON("php/socialbookmark-get-bookmarking-sites.php",function(data){ 

     for(var i = 0; i < data.length; i++){ 
      //alert(data[i].id); 
      bookmarkingSites += '<option value = "' + data[i].id + '">' + data[i].title + '</option>'; 
     } 
    }); 

    $.each(data.results, function(i, id){ 

     if(i%2 == 1) 
      toAppend += '<tr class="first">'; 
     else 
      toAppend += '<tr class="second">'; 
     if(data.results[i].status == "PENDING" || data.results[i].status == "POSTED") 
      toAppend += '<td><span class="approved">' + data.results[i].status + '</span></td>'; 
     else 
      toAppend += '<td>' + data.results[i].status + '</td>'; 
     toAppend += '<td><select name="sb2" id="sb2">'+ 
     '<option value="'+ data.results[i].bookmark +'">' + data.results[i].bookmark +'</option>' + 
     bookmarkingSites + '</select></td>'; 
     toAppend += '<td>' + data.results[i].user + '</td>'; 
     toAppend += '<td>' + data.results[i].link + '</td>'; 
     toAppend += '<td>Some Article</td>'; 
     toAppend += '<td>' + data.results[i].title + '</td>'; 
     toAppend += '<td>' + data.results[i].description + '</td>'; 
     toAppend += '<td>' + data.results[i].tags + '</td>'; 
     toAppend += '<td>' + data.results[i].date + '</td>'; 
     toAppend += '<td><div class="actions">'; 
     toAppend += '<ul><li><input class="radio" name="input" type="checkbox" value="' + data.results[i].id + '" /></li>'; 
     toAppend += '<li><a class="action1" href="#">1</a></li>'; 
     toAppend += '<li><a class="action4" href="#">4</a></li></ul></div></td></tr>'; 
    }); 
    $("#searchTable tbody").append(toAppend); 
} 

回答

2

一個是原因:當你在單引號字符串,你不必逃避雙引號(反斜槓不作爲逃避工作反正在這裏工作,我認爲)。所以這樣的:

bookmarkingSites += '<option value = \"' + data[i].id + '\">' + data[i].title + '</option>'; 

應該是:

bookmarkingSites += '<option value="' + data[i].id + '">' + data[i].title + '</option>'; 

的另一個原因:<some more code>之間你的代碼是不是在回調函數,但是你從功能(databookmarkingSites)儘量O訪問的數據。將所有HTML代碼放入回調函數中。


啊所以它是一個其他數據;)反正你不能在你的代碼中訪問bookmarkingSites,因爲在執行代碼時,它還沒有存在。試試這個:

function socialbookmarksTableData(data) 
{ 

    $.getJSON("php/socialbookmark-get-bookmarking-sites.php",function(bookmarks){ 

     var toAppend = ''; 
     var bookmarkingSites = ''; 

     for(var i = 0; i < bookmarks.length; i++){ 
      //alert(bookmarks[i].id); 
      bookmarkingSites += '<option value = "' + bookmarks[i].id + '">' + bookmarks[i].title + '</option>'; 
     } 

     $.each(data.results, function(i, id){ 

      if(i%2 == 1) 
       toAppend += '<tr class="first">'; 
      else 
       toAppend += '<tr class="second">'; 
      if(data.results[i].status == "PENDING" || data.results[i].status == "POSTED") 
       toAppend += '<td><span class="approved">' + data.results[i].status + '</span></td>'; 
      else 
       toAppend += '<td>' + data.results[i].status + '</td>'; 
      toAppend += '<td><select name="sb2" id="sb2">'+ 
      '<option value="'+ data.results[i].bookmark +'">' + data.results[i].bookmark +'</option>' + 
      bookmarkingSites + '</select></td>'; 
      toAppend += '<td>' + data.results[i].user + '</td>'; 
      toAppend += '<td>' + data.results[i].link + '</td>'; 
      toAppend += '<td>Some Article</td>'; 
      toAppend += '<td>' + data.results[i].title + '</td>'; 
      toAppend += '<td>' + data.results[i].description + '</td>'; 
      toAppend += '<td>' + data.results[i].tags + '</td>'; 
      toAppend += '<td>' + data.results[i].date + '</td>'; 
      toAppend += '<td><div class="actions">'; 
      toAppend += '<ul><li><input class="radio" name="input" type="checkbox" value="' + data.results[i].id + '" /></li>'; 
      toAppend += '<li><a class="action1" href="#">1</a></li>'; 
      toAppend += '<li><a class="action4" href="#">4</a></li></ul></div></td></tr>'; 
     }); 
     $("#searchTable tbody").append(toAppend); 
    }); 
} 
+0

謝謝,現在就像一個魅力。 – user253530 2010-04-01 02:02:47

+0

除了周圍的引號,您還需要將HTML文本轉換爲HTML字符串。由於這個原因,標準代碼充滿了潛在的跨站點腳本(XSS)安全漏洞。通常使用'text()'和'attr()'/'val()'來調用'​​'和屬性的內容,而不是構建模板化的HTML字符串。 – bobince 2010-04-01 14:27:52

0

什麼,你所得到的是一個典型的競爭條件。 getJSON代碼正在進行異步調用。當您在那裏有警報時,在呼叫從回叫返回之前執行getJSON呼叫以下的代碼。沒有警報,它在回調後執行。這實際上是一個幸運的事件,因爲你不能保證它會以這種方式發生。您應該將所有依賴於從getJSON調用返回的數據的代碼放入回調函數中,以確保數據在使用前返回。

var bookmarkingSites = ''; 

$.getJSON("php/socialbookmark-get-bookmarking-sites.php",function(data){ 

    for(var i = 0; i < data.length; i++){ 
     //alert(data[i].id); 
     bookmarkingSites += '<option value = "' 
          + data[i].id + '">' 
          + data[i].title + '</option>'; 
    } 
    <some more code> 
    toAppend += '<td><select name="sb2" id="sb2">' 
       + '<option value="'+ data.results[i].bookmark +'">' 
       + data.results[i].bookmark +'</option>' 
       + bookmarkingSites + '</select></td>'; 
    <some more code> 
}); // end of JSON call/callback 
0

從提供的代碼看起來你做了JSON調用,回調函數附加到bookmarkingSites變量。到現在爲止還挺好。

箭頭指向的代碼位於回調函數之外,並且會在調用JSON回調之前運行,因此bookmarkingSite將爲空字符串,並且在選擇框中將沒有選項。

建立選項標籤的代碼是否也會進入回調或處於回調調用的函數中?