2010-04-01 22 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将为空字符串,并且在选择框中将没有选项。

建立选项标签的代码是否也会进入回调或处于回调调用的函数中?