2011-10-15 11 views
10

मैं XMLHttpRequest.open() विधि को ओवरराइड करने में सक्षम कैसे होगा और फिर उसके तर्कों को पकड़ और बदल सकता हूं?जावास्क्रिप्ट: XMLHttpRequest.open ओवरराइड करना()

मैं पहले से ही प्रॉक्सी विधि की कोशिश की है, लेकिन यह काम नहीं किया, पर छुटकारा जब XMLHttpRequest() बुलाया गया था खुला को हटाने हालांकि: एक नज़र

(function() { 
    var proxied = window.XMLHttpRequest.open; 
    window.XMLHttpRequest.open = function() { 
     $('.log').html(arguments[0]); 
     return proxied.apply(this, arguments); 
    }; 
})(); 
+0

आप क्या करने की कोशिश कर रहे हैं? – rwilliams

+0

मैं पते को दोबारा शुरू करने के सभी अनुरोधों के लिए XMLHttpRequest.open() का दूसरा तर्क बदलना चाहता हूं। – Trevor

+0

क्या आप दूसरे तर्क के लिए कुछ 'वैश्विक' चर का उपयोग नहीं कर सके। – rwilliams

उत्तर

28

आप द्वारा विरासत में open विधि को संशोधित नहीं कर रहे हैं, लेकिन XMLHttpRequest constructor पर केवल एक विधि जोड़ना जो वास्तव में कभी भी उपयोग नहीं किया जाता है।

मैं फेसबुक में इस कोड की कोशिश की और मैं अनुरोध को पकड़ने के लिए सक्षम था:

(function() { 
    var proxied = window.XMLHttpRequest.prototype.open; 
    window.XMLHttpRequest.prototype.open = function() { 
     console.log(arguments); 
     return proxied.apply(this, [].slice.call(arguments)); 
    }; 
})(); 

/* 
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true] 
    ["POST", "/ajax/apps/usage_update.php?__a=1", true] 
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true] 
    ["POST", "/ajax/canvas_ticker.php?__a=1", true] 
    ["POST", "/ajax/canvas_ticker.php?__a=1", true] 
    ["POST", "/ajax/chat/buddy_list.php?__a=1", true] 
*/ 

तो, हाँ खुला विधि XMLHttpRequest prototype (window.XMLHttpRequest.prototype) के लिए जोड़ा जा करने की जरूरत है नहीं XMLHttpRequest constructor (window.XMLHttpRequest)

2

मैं गूगल कोड पर xmlhttprequest project देना होगा। XMLHttpRequest ऑब्जेक्ट को ठीक से ओवरराइड करने का यह एक बहुत अच्छा उदाहरण है। स्रोत here देखा जा सकता है।

2

इसके बजाय XMLHttpRequest.prototype.open का उपयोग करें।