我正在使用jquery将元素添加到空白列表中。
我在页面上的:
<ul id="myList">
</ul>
我在从动态创建的事件处理程序调用的脚本中经历了这样的循环。 (它是使用拖动操作排序的列表项的“onDrop”)
var myListItemHTML;
for (var i = 0 ; i < 5 ; i++)
{
myListItemHTML += '<li id=listItem'+i+'>This is item number'+i+'</li>';
}
$('#myList').append(myListItemHTML);
如果我检查后......
if ($('#myList li').length == 0 )
{
alert('Going to crash now since I'm expecting list items')
}
大约95%的时间填充了列表,但是大约5%的时间我点击了警报,这将导致稍后的异常。
有没有人碰到这个?是否有回调或方式来知道何时/是否真的发生了附加?
答案 0 :(得分:1)
var myListItemHTML;
for (var i = 0 ; i < 5 ; i++)
{
$('#myList').append('<li id=listItem'+i+'>This is item number'+i+'</li>');
}
尝试在for循环中添加。
if ($('#myList li').length == 0 )
{
alert('Going to crash now since I\'m expecting list items')
}
\
之前需要'
,因此不会发生冲突。
编辑:显示“未定义”http://jsfiddle.net/gyEre/1/
的jsfiddle答案 1 :(得分:1)
这有点过分了,因为我假设您的代码超出了发布的范围。这是:
我曾经遇到过一些代码的问题,它在除Chrome之外的所有浏览器中都能很好地工作,其中它会随机失败并且看起来没有原因。
我的问题最终是,Chrome实际上是在执行我的JavaScript 太快,并且它在一些早期制作的AJAX调用中丢失了一些时间。
我的代码是这样的,AJAX事件A被触发,然后将数据传递给AJAX事件B.但仅在Chrome中,我发现事件B有时发生在事件A之前,这是错误情况。
如果我记得,我认为解决方案是强制同步一个关键的AJAX请求,尽管应该谨慎使用。请参阅:http://api.jquery.com/jQuery.ajaxSetup/
我希望这不是太模糊,无法提供帮助。祝你好运!
答案 2 :(得分:1)
我学到的是,我不能相信jquery通过动态创建的事件调用DOM操作。我欢迎有人证明我错了,但这种方法:
addListItem = function (itemID, itemText)
{
var li = document.createElement('li');
li.setAttribute("id", itemID);
var liText = document.createTextNode(itemText);
li.appendChild(goalTextNode);
document.getElementById('myList').appendChild(li);
}
for (var i = 0 ; i < 5 ; i++)
{
addListItem('listItem'+i, 'Item Text'+i);
}
将100%的时间工作,永不失败。
答案 3 :(得分:1)
根据我的经验,如果在-tag中使用prepend函数的脚本,它将无法工作,因为在DOM准备好之前加载了脚本。
为了避免这种挫败感,将javascript放在标记之前是个好习惯。