等待所有DOM操作完成jQuery?

时间:2012-12-17 00:51:26

标签: php javascript jquery mysql

我对如何完成某件事情有一点困惑。我正在使用名为isotope的插件编写一个具有砌体布局的投资组合。它基本上是pinterest风格的布局。我还将有过滤器,它将自动从数据库中获取正确的内容,并使用胡子模板插入它。现在我遇到的问题是如何在运行同位素接力输出功能之前等待所有dom插入完成。因为如果我太快运行它,元素将无法正确定位。我不想做一个setTimeout()函数,因为我不确定数据库请求需要多长时间,我不想让用户等待太久。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

查看jQuery Deferred.done()

以下是该网站的示例:

<!DOCTYPE html>
<html>
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>

 <button>Go</button>
 <p>Ready...</p>

<script>
/* 3 functions to call when the Deferred object is resolved */
function fn1() {
  $("p").append(" 1 ");
}
function fn2() {
  $("p").append(" 2 ");
}
function fn3(n) {
  $("p").append(n + " 3 " + n);
}

/* create a deferred object */
var dfd = $.Deferred();

/* add handlers to be called when dfd is resolved */
dfd
/* .done() can take any number of functions or arrays of functions */
.done( [fn1, fn2], fn3, [fn2, fn1] )
/* we can chain done methods, too */
.done(function(n) {
  $("p").append(n + " we're done.");
});

/* resolve the Deferred object when the button is clicked */
$("button").bind("click", function() {
  dfd.resolve("and");
});
</script>

</body>
</html>  

此外,网站上还有一个演示。

答案 1 :(得分:0)

您可以在插入函数的回调中调用relayOut方法。

$('#container').isotope( 'insert', /*items*/ ,function(){
  $('#container').isotope( 'reLayout', callback );
} );

或者你可以将所有方法都作为链

$('#container').isotope( 'insert', /*items*/).isotope( 'reLayout', callback );

如果您使用ajax调用内容,可以在jquery ajax成功回调的最后一行调用您的relayOut。因此,在调用relayOut方法之前,每个DOM操作都已完成。

请参考http://isotope.metafizzy.co/docs/methods.html获取同位素插件的回调和链接方法。 对于jquery ajax,请查看http://api.jquery.com/jQuery.ajax/

答案 2 :(得分:-3)

你目前在$(document).ready(function()中运行这个函数吗?也许你可以在$(window).load(function()。

里面试一下。