12

मैं बंदर पैच XMLHttpRequest.prototype.open को आईएन 8 संगतता मोड में चल रहे इंट्रानेट साइट के लिए बंदरगाह पैच करने की कोशिश कर रहा हूं लेकिन यह SCRIPT438: Object doesn't support this property or method फेंकता रहता है। अजीब चीज है ... अगर मैं arguments पहले "स्पर्श" करता हूं, यानी bar को अपूर्ण करें, यह ठीक काम करता है! क्या किसी को पता है कि क्यों और अगर इसे छूना वास्तव में 100% मामलों में समस्या का समाधान करता है?बंदरगाह XMLHttpRequest.prototype.open और "स्पर्श" तर्क

var foo = window.XMLHttpRequest.prototype.open; 
window.XMLHttpRequest.prototype.open = function() { 
    //var bar = arguments; 
    foo.apply(this, arguments); 
    console.log("OK"); 
} 

यहाँ IE9 IE8 में मोड modern.ie वीएम गूगल छवि खोज के साथ open करने की कोशिश कर स्क्रीनशॉट एक बंदर स्क्रॉल पर समझौता अनुरोध है।

enter image description here

संपादित करें:

console.log(foo); 
//console.log(foo.apply); 
console.log(typeof foo); 
console.log(foo instanceof Function); 

रिटर्न

LOG: 
function open() { 
    [native code] 
} 

LOG: object 
LOG: false 

console.log(foo.apply) एक फेंकता "Object doesn't support this property or method"

खुशी से पर्याप्त मैं इसे किसी भी मोड में वास्तविक आईई 8 वीएम में दोहराने नहीं कर सकता, केवल IE9 मानकों मोड में चल रहे IE9 में।

+1

क्या आप 'console.log (foo, foo.apply, typeof foo, foo exampleof Function) कर सकते हैं? शायद? मेरा अनुमान होगा कि '.apply (यह, तर्क);' आंतरिक रूप से अनुकूलित किया गया है, लेकिन "तर्क" स्पर्श करने के लिए * एक तर्क वस्तु के स्पष्ट निर्माण की आवश्यकता है। और जैसा कि आप क्वांटिन पाए गए संभावित डुप्लिकेट से देख सकते हैं, आईई प्लगइन ऑब्जेक्ट्स के "विधियों" के बारे में बहुत क्विंकी है। – Bergi

+0

@ बर्गि धन्यवाद, कृपया लॉग रिटर्न के लिए संपादन देखें। –

+1

यहां तक ​​कि * * * .apply' तक पहुंचने पर भी यह फेंकता है? वाह। लेकिन हाँ, ऐसा कुछ है जो मुझे डर था। क्या 'function.prototype.apply.call (foo, arguments)' वर्कअराउंड के रूप में काम करता है? – Bergi

उत्तर

0

मैंने हाल ही में XMLHttpRequest.prototype.open का एक उदाहरण देखा है, जो आपके से थोड़ा अलग दृष्टिकोण है;

(function(open) { 
    XMLHttpRequest.prototype.open = function() { 
     // your special sauce 

     open.apply(this, arguments); 
    }; 
})(XMLHttpRequest.prototype.open); 

क्या आप जांच सकते हैं और देख सकते हैं कि ऐसा करने से यह अलग तरीके से कार्य करता है?

0
var XHR = XMLHttpRequest.prototype; 
XHR.open = function (method, url) { 
    //do stuff 

    return open.apply(this, arguments); 
}; 
संबंधित मुद्दे