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

时间:2011-01-26 00:27:48

标签: javascript jquery html

我正在使用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%的时间我点击了警报,这将导致稍后的异常。

有没有人碰到这个?是否有回调或方式来知道何时/是否真的发生了附加?

4 个答案:

答案 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放在标记之前是个好习惯。