Javascript 为什么.append会在jquery中随机失败?

Javascript 为什么.append会在jquery中随机失败?,javascript,jquery,html,Javascript,Jquery,Html,我使用jquery将元素添加到空白列表中 在这一页上,我有: <ul id="myList"> </ul> 大约95%的时间列表被填充,但大约5%的时间我点击我的警报,这将导致一个异常以后 有人碰到过这个吗?是否有回调或方法来知道何时/是否真的发生了追加 var myListItemHTML; for (var i = 0 ; i < 5 ; i++) { $('#myList').append('<li id=listItem'+i+'>This

我使用jquery将元素添加到空白列表中

在这一页上,我有:

<ul id="myList">
</ul>
大约95%的时间列表被填充,但大约5%的时间我点击我的警报,这将导致一个异常以后

有人碰到过这个吗?是否有回调或方法来知道何时/是否真的发生了追加

var myListItemHTML;
for (var i = 0 ; i < 5 ; i++)
{
  $('#myList').append('<li id=listItem'+i+'>This is item number'+i+'</li>');
}
之前需要一个
\
,这样它就不会冲突


edit:jsfiddle显示“undefined”

这有点冗长,因为我对您的代码做了一个超出发布内容的假设。下面是:

我曾经遇到过一些代码的问题,这些代码在除Chrome之外的所有浏览器中都能正常工作,在Chrome中,它会随机失败,而且似乎没有原因

最终,我的问题是Chrome实际上执行我的JavaScript太快了,而且它在一些AJAX调用中耽误了一些时间

我的代码触发了AJAX事件A,然后将数据传递给AJAX事件B。不过,仅在Chrome中,我发现事件B有时发生在事件A之前,这就是错误情况

如果我还记得的话,我认为解决方案是强制同步发出一个关键的AJAX请求,尽管这应该小心使用。请参阅:


我希望这不是太含糊,没有帮助。祝你好运

我学到的是,对于通过动态创建的事件调用的DOM操作,我不能信任jquery。我欢迎有人证明我错了,但这种方法:

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);
}
addListItem=函数(itemID,itemText)
{
var li=document.createElement('li');
li.setAttribute(“id”,itemID);
var liText=document.createTextNode(itemText);
li.appendChild(goalTextNode);
document.getElementById('myList').appendChild(li);
}
对于(变量i=0;i<5;i++)
{
addListItem('listItem'+i,'Item Text'+i);
}

将在100%的时间内工作,永不失败

根据我的经验,如果在-tag中使用prepend函数的脚本,它将无法工作,因为该脚本是在DOM准备就绪之前加载的


为了避免这种挫折感,将javascript放在标记之前是一个好习惯。

如果在一个页面上按了20次重载,20次中有一次会失败?或者你有类似的代码分布在20页上,其中一页失败了吗?你有没有在
$(文档)中找到你的代码。准备好了吗?@sarnold:就是同一页点击一个按钮,导致列表用此代码刷新。这是其中二十个调用中的一个。@lonesomeday-函数不在ready处理程序中,但我有由$(document.ready)包围的附录(函数(){//appends});你能确认你的事件每次都被触发吗?这不是一个好方法。它会导致太多的Dom操作。for循环中的append是一个丰富的操作,请尝试形成一个字符串并在结尾追加…它没有定义,因为第一次myListItemHTML没有定义。它需要是
var myListItemHYML=''我在最后这样做是为了减少总的DOM操作。它看起来确实更快。但我也尝试过循环,结果是一样的,这是一个正确的说法。我实际上是从一个用户操作的事件处理程序中调用它,该操作调用要更新的列表,这在我的刷新方法中。“将在100%的时间内工作,并且永不失败”,没有程序员说过:-)
var myListItemHTML;
for (var i = 0 ; i < 5 ; i++)
{
  $('#myList').append('<li id=listItem'+i+'>This is item number'+i+'</li>');
}
if ($('#myList li').length == 0 )
{
  alert('Going to crash now since I\'m expecting list items')
}
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);
}