有趣的是,如果我删除alert(data [i] .id)的注释,代码就可以了。正如在示例中,字符串未连接,因此我在选择框中没有选项。提示?帮助
重新编辑,以便你们可以看到整个方法
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);
}
答案 0 :(得分:2)
一个原因是:当你用单引号括起字符串时,你不必转义双引号(反斜杠不起作用,因为我想这里的转义操作)。所以这个:
bookmarkingSites += '<option value = \"' + data[i].id + '\">' + data[i].title + '</option>';
应该是:
bookmarkingSites += '<option value="' + data[i].id + '">' + data[i].title + '</option>';
另一个原因:<some more code>
之间的代码不在回调函数中,但您尝试从函数(data
和bookmarkingSites
)访问数据。将所有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);
});
}
答案 1 :(得分: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
答案 2 :(得分:0)
从提供的代码看起来,您执行JSON调用,并且回调函数附加到bookmarkingSites变量。到目前为止一切顺利。
箭头指向的代码位于回调函数之外,并且在调用JSON回调之前运行,因此bookmarkingSite将为空字符串,并且选择框中将没有选项。
构建选项标记的代码也不会进入回调或者是回调调用的函数吗?