2011-08-23 15 views
5

मैं एक jQuery प्लगइन का उपयोग कर रहा हूं, तो यह div में कुछ डेटा को यूआरएल, fetches, गणना और लिखता है।जब कोई फ़ंक्शन का काम पूरा हो जाता है

मैं इस 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 में नई सामग्री नहीं था। यह सुनिश्चित करें कि आपरेशन एक बार ग्राहक प्रतिक्रिया मिली है और में डाला गया है होता है, myFunction में लागू ajax कोड की सफलता कॉलबैक में

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

:

+2

'myfunction' एक अजाक्स अनुरोध करना है? –

+0

यदि 'myFunction() 'अतुल्यकालिक रूप से समाप्त होता है, तो आपको कॉपी को ट्रिगर करने के लिए कॉलबैक का उपयोग करना होगा। –

+0

@ karim79: और jquery द्वारा निष्पादित AJAX कॉल * तुल्यकालिक * हो सकता है। तो - नहीं, यह अस्पष्ट नहीं है। – zerkms

उत्तर

5

आप एक कॉलबैक पैरामीटर जो इसे एक बार अनुरोध किया जाता है

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

जब तक यह जावास्क्रिप्ट है और प्रत्येक पैरामीटर परिभाषा के अनुसार वैकल्पिक है - हां, इस प्रकार की जांच – zerkms

2

आप बस इस लाइन डालने के लिए की आवश्यकता होगी डोम।

0

आप एक प्लगइन, आप या तो AJAX कॉलबैक फ़ंक्शन में कड़ी मेहनत से कोड यह होना चाहिए लिख रहे हैं कार्यान्वित ले myfunction की आवश्यकता है , या विकल्पों के साथ कॉलबैक फ़ंक्शन को पारित करने की अनुमति दें।

आप प्लगइन पर कोई नियंत्रण नहीं है, तो आप लगातार अपने 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); 
} 
(जैसे success के रूप में)
+0

यदि कोई प्लगइन कॉलबैक पैरामीटर प्रदान नहीं करता है, तो आपको इसकी गुणवत्ता पर सवाल उठाना होगा ... साथ ही, रॉकेट साइंस अपने आप को जोड़ने के लिए नहीं है। लेकिन आपका कोड असफल अनुरोध से कैसे सामना करता है? –

+0

@ilia choly: पूरी तरह से सही! हालांकि, किसी भी चीज की अनुपस्थिति में, मैं इसका चयन करूंगा। हालांकि मैं टाइमआउट बढ़ा सकता हूं (या बाद में प्रत्येक कॉल पर इसे बढ़ाएं)। मैंने इसे चेतावनी में जोड़ा हालांकि ... –

+0

@ilia choly: x विफल प्रयासों के बाद निष्पादन रोकने के लिए काउंटर जोड़ा गया। –

1

अजाक्स कॉलबैक 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

संबंधित मुद्दे

 संबंधित मुद्दे