2011-08-23 36 views
5

我使用一个jQuery插件建成后,从URL中获取数据,获取,计算并在div写一些数据。当一个函数的工作

我想将此div内容复制到另一个div,当该功能完成其工作时。

例如:

$("#div1").myfunction(); // it gets and calculates data and adds to #div1 . it needs 2-3 seconds to be done 
var contents = $("#div1").html(); // when myfunction() done, copy contents 
$("#div2").html(contents); 

,当我跑的代码,我没有#div2有新的内容。

+2

是否'myfunction'使Ajax请求? –

+0

如果'myFunction()'异步完成,则需要使用回调触发复制。 –

+0

@ karim79:jquery执行的ajax调用可以是* synchronous *。所以 - 不,不是那么明确。 – zerkms

回答

5

你需要有myfunction采取何种一旦请求完成

function myfunction(cb) 
    $.ajax({ 
     type: "get", 
     url: "page.html", 
     success: function(data){ 
      $("#div1").html(data); 
      if(typeof cb === 'function') cb(); 
     } 
    }); 
} 

myfunction(function(){ 
    $("#div2").html($("#div1").html()); 
}); 
+0

你也就会把支票是'cb'是一个有效的功能,喜欢这里:http://stackoverflow.com/questions/6792663/javascript-style-optional-callbacks/6792694#6792694 – zerkms

+0

假设你希望它是一个可选参数。 –

+0

,只要它是JavaScript和每一个参数是可选的定义 - 是的,这种检查是必须具备的 – zerkms

2

你只需要简单地把这个行:

$("#div2").html($("#div1").html()); 

myFunction实施,Ajax代码的成功回调,以确保一旦客户端收到响应并将其插入到的操作情况DOM。

0

如果你是一个编写插件,就应该把它硬编码到AJAX回调函数执行一个回调参数,或者允许使用选项传入回调函数。

如果你有超过插件无法控制,你必须不断地询问你的div,看它是否已被更新:

var oldHTML = $("#div1").html(), 
    counter = 0; 

$("#div1").myfunction(); 

copyHTML(); 

function copyHTML() 
{ 
    var newHTML = $("#div1").html(); 

    // we don't want this function to run indefinitely 
    if (++counter > 15) return; 

    if (newHTML == oldHTML) 
     setTimeout(copyHTML, 1000); 
    else 
     $("#div2").html(newHTML); 
} 
+0

如果插件没有提供一个回调参数,你不得不怀疑它的质量......此外,这是不是火箭科学添加自己的。但是,您的代码如何处理失败的请求? –

+0

@ilia choly:完全正确!但是,如果没有更好的东西,我会选择这个。虽然我可能会增加超时时间(或者在每次通话后增加超时时间)。我将它添加到了警告,虽然... –

+0

@ilia choly:增加了计数器以在x尝试失败后停止执行。 –

1

AJAX回调(如success)将在jQuery的1.8被弃用。相反,您可以使用jQuery的deferred对象来运行(或撤销)需要更多条件才能执行的操作。

var successFunction = function() { 
    var contents = $("#div1").html(); 
    var newElement = $("<div id=div2></div>").html(contents); 
    $("body").append(newElement); 
} 

var failedFunction = function() { 
    // reset element or undo last change 
    window.alert("Update Failed"); 
} 


$.when(
    $.ajax(countParams), 
    doCalculate() 
).then(
    successFunction(), 
    failedFunction() 
); 

Creating Responsive Applications Using jQuery Deferred and Promises

相关问题