2012-08-17 6 views
5

मैं ajaxsend घटना पर सफलता समारोह अधिलेखित करने के लिए कोशिश कर रहा हूँ, लेकिन यह यहाँ काम does not कोड है कंसोल, लेकिन सफलता पर मैं शुरुआत और अंत डीबग msges नहीं देख सकता ..JQuery ajaxSend घटना के माध्यम से सफलता समारोह अधिलेखित करने के लिए कैसे

मैं क्या गलत करता हूं?

+0

संबंधित: http://stackoverflow.com/questions/293668/jquery-ajax-prevent-callback-from-running – pimvdb

+0

धन्यवाद, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है, AJAX को HTTP प्रतिक्रिया प्राप्त करने के बाद पूर्ण आग लगती है, मैं AJAXSend के बारे में पूछ रहा हूं जो HTTP अनुरोध – ciochPep

+0

से पहले ठीक है। आप सही हैं। मैं केवल उस जवाब पर इशारा कर रहा था जो कहता है कि कॉलबैक चलाने के लिए बाध्य हैं और आप इसे रोक नहीं सकते हैं। यह सच है कि यह वास्तव में आपका प्रश्न नहीं है; मुझे एक समाधान में दिलचस्पी है। – pimvdb

उत्तर

-1

आप पूरा करने के लिए आपको क्या चाहिए बंद इस्तेमाल कर सकते हैं:

function closure(handler) { 
    return function(ev, xhr, options) { 
     console.log("start"); 
     handler(ev, xhr, options); 
     console.log("stop"); 
    } 
} 

$(document).ajaxSend(closure(function(ev, xhr, options) { 
    console.log("hello"); 
})); 
+0

यह इरादा के रूप में काम नहीं करता है क्योंकि यह सफलता कॉलबैक फ़ंक्शन को ओवरराइट नहीं करता है! "बंद" फ़ंक्शन का कोई प्रभाव नहीं पड़ता है; 'console.log ('start/end') 'को यहां' AJAXSend' में भी ले जाया जा सकता है।असल में आपका "समाधान" केवल कोड obfuscation है ... – Aletheios

+0

स्पष्ट रूप से मैंने लेखक के इरादे को गलत समझा, इसके लिए खेद है। $ .get और $ .load के रूप में वे आंतरिक रूप से $ .ajax का उपयोग करते हैं जैसा कि यहां देखा जा सकता है: https://github.com/jquery/jquery/blob/master/src/ajax.js – prot

6

क्या आप पूरा करने के लिए कोशिश कर रहे हैं ajaxSend के साथ नहीं किया जा सकता है। समस्या यह है कि ajaxSend स्पष्ट रूप से मूल xhr और options ऑब्जेक्ट्स की एक प्रति के साथ काम करता है, इसलिए संशोधनों का कोई प्रभाव नहीं पड़ेगा। आप आसानी से निम्नलिखित कोड के साथ इस परीक्षण कर सकते हैं:

$(document).ajaxSend(function(event, xhr, options){ 
    delete options.success; 
    console.log(options.success); // undefined 
}); 
$.ajax({ 
    url: "test.html", 
    success: function() { console.log("this will be printed nevertheless"); } 
}); 


तो तुम ajaxSend उपयोग नहीं कर सकते सफलता कॉलबैक अधिलेखित करने के लिए।

// closure to prevent global access to this stuff 
(function(){ 
    // creates a new callback function that also executes the original callback 
    var SuccessCallback = function(origCallback){ 
     return function(data, textStatus, jqXHR) { 
      console.log("start"); 
      if (typeof origCallback === "function") { 
       origCallback(data, textStatus, jqXHR); 
      } 
      console.log("end"); 
     }; 
    }; 

    // store the original AJAX function in a variable before overwriting it 
    var jqAjax = $.ajax; 
    $.ajax = function(settings){ 
     // override the callback function, then execute the original AJAX function 
     settings.success = new SuccessCallback(settings.success); 
     jqAjax(settings); 
    }; 
})(); 

अब आप बस $.ajax हमेशा की तरह उपयोग कर सकते हैं: जहाँ तक मुझे पता, jQuery के AJAX के किसी भी कार्य के रूप में

$.ajax({ 
    url: "test.html", 
    success: function() { 
     console.log("will be printed between 'start' and 'end'"); 
    } 
}); 

(जैसे इसके बजाय, आप jQuery के AJAX समारोह "हैक" करना होगा $.get() या .load()) आंतरिक रूप से $.ajax का उपयोग करें, इसलिए इसे jQuery के माध्यम से किए गए प्रत्येक AJAX अनुरोध के साथ काम करना चाहिए (मैंने इसका परीक्षण नहीं किया है ...)।



कुछ ऐसा भी XMLHttpRequest.prototype हैकिंग से "शुद्ध" जावास्क्रिप्ट के साथ काम करना चाहिए। ध्यान दें कि निम्नलिखित IE में काम नहीं करेगा, जो XMLHttpRequest के बजाय ActiveXObject का उपयोग करता है।

(function(){ 
    // overwrite the "send" method, but keep the original implementation in a variable 
    var origSend = XMLHttpRequest.prototype.send; 
    XMLHttpRequest.prototype.send = function(data){ 
     // check if onreadystatechange property is set (which is used for callbacks) 
     if (typeof this.onreadystatechange === "function") { 
      // overwrite callback function 
      var origOnreadystatechange = this.onreadystatechange; 
      this.onreadystatechange = function(){ 
       if (this.readyState === 4) { 
        console.log("start"); 
       } 
       origOnreadystatechange(); 
       if (this.readyState === 4) { 
        console.log("end"); 
       } 
      }; 
     } 
     // execute the original "send" method 
     origSend.call(this, data); 
    }; 
})(); 

उपयोग (सिर्फ एक सामान्य XMLHttpRequest की तरह):

var xhr = new XMLHttpRequest(); 
xhr.open("POST", "test.html", true); 
xhr.onreadystatechange = function(){ 
    if (xhr.readyState === 4) { 
     console.log("will be printed between 'start' and 'end'"); 
    } 
}; 
xhr.send(); 
+0

आप क्या करेंगे गैर-jquery AJAX अनुरोधों के लिए? – ciochPep

+0

ऊपर देखें, मैंने अपना जवाब संपादित कर दिया है ... लेकिन मुझे लगता है कि इसके लिए और भी कुछ है, तो शायद इसके लिए आपको एक अलग प्रश्न खोलना चाहिए। – Aletheios

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