12

IE8 uyumluluk modunda çalışan bir intranet sitesi için maymun yama XMLHttpRequest.prototype.open çalışıyorum ama SCRIPT438: Object doesn't support this property or method atmaya devam ediyor. Garip olan şey, ilk olarak arguments 'a dokunursam, yani, bar uncomment'ına dokunursak, gayet iyi çalışıyor! Neden olduğunu bilen var mı, eğer dokunup dokunursanız, sorunun% 100'ünde gerçekten sorunu çözüyor mu?XMLHttpRequest.prototype.open ve bağımsız değişkenlere "dokunmak" Maymun yama

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

İşte bir maymun kaydırma üzerinde isteği yamalı open çalışırken Google Görsel arama ile IE9 IE8 modunda modern.ie VM ekran görüntüsü var.

enter image description here

Düzenleme:

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

İade

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

LOG: object 
LOG: false 

console.log(foo.apply) bir "Object doesn't support this property or method" atar.

Gerçekten, IE8 standart modunda çalışan IE9'da denediğim herhangi bir modda bunu gerçek bir IE8 VM'de kopyalayamıyorum.

+1

Bir "console.log (foo, foo.apply, foo foo, foo instanceof Function)" yapabilir misiniz? Benim tahminim budur. .apply (bu, argümanlar), 'dahili olarak en iyi duruma getirilmiş, ama '' dokunmadan '' argümanlar' * * argüman nesnesinin açık yaratılmasını gerektirir. Ve Quentin'in bulduğu olası kopyadan da görebileceğiniz gibi, IE eklenti nesnelerinin "yöntemleri" hakkında çok tuhaftır. – Bergi

+0

@Bergi teşekkürler, lütfen günlük getirileri için düzenlemeye bakın. –

+1

* * .apply'a erişirken bile * atar? Vay. Ama evet, bunun gibi bir şey korktuğum şey. Function.prototype.apply.call (foo, arguments) 'bir geçici çözüm olarak mı çalışıyor? – Bergi

cevap

0

Kısa bir süre önce sizinkilerden biraz farklı bir yaklaşımla, XMLHttpRequest.prototype.open geçersiz kılınan bir örnek gördüm;

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

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

Bu şekilde yapılıp yapılmadığını kontrol edip edemiyor musunuz?

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

    return open.apply(this, arguments); 
};