2011-08-23 10 views
5

Używam wtyczki jQuery, pobiera dane z adresu URL, pobiera, oblicza i zapisuje niektóre dane w numerze div.Po zakończeniu pracy funkcji

Chcę skopiować tę zawartość div do innej div, gdy funkcje te działają.

na przykład:

$("#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); 

kiedy zabrakło tego kodu, nie ma nowych treści w #div2.

+2

Czy 'myfunction' dokonać żądania Ajax? –

+0

Jeśli funkcja 'myFunction()' zakończy się asynchronicznie, musisz użyć wywołania zwrotnego, aby wywołać kopię. –

+0

@ karim79: wywołania ajax wykonywane przez jquery mogą być * synchroniczne *. No nie, to nie jest tak jednoznaczne. – zerkms

Odpowiedz

5

trzeba mieć myfunction wziąć parametr wywołania zwrotnego, która to wykonuje, gdy żądanie jest wykonywane

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

Należy również zaznaczyć, że 'cb' jest poprawną funkcją, na przykład tutaj: http://stackoverflow.com/questions/6792663/javascript-style-optional-callbacks/6792694#6792694 – zerkms

+0

przy założeniu, że chcesz, aby była opcjonalny parametr. –

+0

, o ile jest to javascript i każdy parametr jest z definicji opcjonalny - tak, ten rodzaj sprawdzenia musiałby być konieczny – zerkms

2

Będziesz wystarczy umieścić ten wiersz:

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

do zwrotnego sukcesu kodu ajax realizowanego w myFunction, aby upewnić się, że operacja się dzieje, gdy klient otrzymał odpowiedź i włożeniu go do DOM.

0

Jeśli jesteś jednym piśmie wtyczki, należy albo ciężko kod go do funkcji wywołania zwrotnego AJAX lub zezwolić na przekazanie funkcji zwrotnej z opcjami.

Jeśli nie masz kontroli nad plugin, musisz stale zapytanie do div aby sprawdzić, czy został on zaktualizowany:

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

jeśli wtyczka nie oferuje parametru wywołania zwrotnego, musisz zakwestionować jej jakość ... Ponadto, nie jest to nauka rakietowa, aby dodać własną. Ale w jaki sposób twój kod radzi sobie z nieudanym żądaniem? –

+0

@ilia choly: Całkowicie rację! Jednak w przypadku braku czegoś lepszego, wybrałbym to. Mogę jednak zwiększyć limit czasu (lub zwiększyć go później przy każdym połączeniu). Dodałem go do ostrzeżenia ... –

+0

@ilia choly: Dodano licznik do zatrzymania wykonania po x nieudanych próbach. –

1

Ajax wywołania zwrotne (takie jak success) zostanie wycofany w jQuery 1.8 . Zamiast tego można użyć obiektu jQuery's deferred, aby uruchomić (lub cofnąć) działanie, które wymaga jeszcze jednego warunku, zanim zostanie wykonane.

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

Powiązane problemy