問題描述
我正在嘗試修改我無法修改的函數接收到的 responseText.此函數創建一個我可以附加到的 XMLHttpRequest,但我無法以一種允許我在原始函數接收到內容之前修改內容的方式包裝"responseText.
I am trying to modify the responseText received by a function that I cannot modify. This function creates a XMLHttpRequest that I can attach to, but I have been unable to "wrap" the responseText in a way that allows me to modify the content before the original function receives it.
這是完整的原始功能:
function Mj(a, b, c, d, e) {
function k() {
4 == (m && 'readyState' in m ? m.readyState : 0) && b && ff(b) (m)
}
var m = new XMLHttpRequest;
'onloadend' in m ? m.addEventListener('loadend', k, !1) : m.onreadystatechange = k;
c = ('GET').toUpperCase();
d = d || '';
m.open(c, a, !0);
m.send(d);
return m
}
function ff(a) {
return a && window ? function () {
try {
return a.apply(this, arguments)
} catch(b) {
throw jf(b),
b;
}
} : a
}
我也嘗試過操縱接收函數 k();試圖達到我的目標,但由于它不依賴于傳遞給函數的任何數據(例如 k(a.responseText);)我沒有成功.
I have also tried to manipulate the reiceiving function k(); in an attempt to reach my goal, but since it doesn't depend on any data passing to the function (for example k(a.responseText);) I had no success.
有什么方法可以實現嗎?我不希望使用 js 庫(如 jQuery);
Is there any way that I can achieve this? I do not wish to use js libraries (such as jQuery);
編輯:我知道我無法直接更改 .responseText,因為它是只讀的,但我正在嘗試找到一種方法來更改響應和接收函數之間的內容.
EDIT: I understand that I cannot change .responseText directly since it is read-only, but I am trying to find a way to change the content between the response and receiving function.
EDIT2:在我嘗試攔截和更改已從此處添加的 .responseText 的方法之一下方添加:猴子補丁 XMLHTTPRequest.onreadystatechange
EDIT2: Added below one of the methods I have tried to intercept and change .responseText which has been addapted from here: Monkey patch XMLHTTPRequest.onreadystatechange
(function (open) {
XMLHttpRequest.prototype.open = function (method, url, async, user, pass) {
if(/results/.test(url)) {
console.log(this.onreadystatechange);
this.addEventListener("readystatechange", function () {
console.log('readystate: ' + this.readyState);
if(this.responseText !== '') {
this.responseText = this.responseText.split('&')[0];
}
}, false);
}
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
<小時>
EDIT3:我忘了包括函數 Mj 和 ff 不是全局可用的,它們都包含在一個匿名函數中 (function(){functions are here})();
EDIT3: I forgot to include that the functions Mj and ff are not globally available, they are both contained inside an anonymous function (function(){functions are here})();
EDIT4:我更改了接受的答案,因為 AmmarCSE 沒有任何與 jfriend00 的答案相關的問題和復雜性.
EDIT4: I have changed the accepted answer because AmmarCSE's does not have any of the problems and complexity linked to jfriend00's answer.
簡而言之,最佳答案如下:
The best answer explained in short is as follows:
偵聽您要修改的任何請求(確保您的偵聽器會在原始函數目標之前攔截它,否則在響應已經使用后修改它沒有意義).
Listen to whichever request you want to modify (make sure your listener will intercept it before the original function destination does, otherwise there is no point in modifying it after the response has already been used).
將原始響應(如果要修改)保存在臨時變量中
Save the original response (if you want to modify it) in a temporary variable
將要修改的屬性更改為可寫:真",它將擦除它擁有的任何值.就我而言,我使用
Change the property you want to modify to "writable: true", it will erase whichever value it had. In my case I use
Object.defineProperty(event, 'responseText', {
writable: true
});
其中event
是監聽xhr請求的load
或readystatechange
事件返回的對象
Where event
is the object returned by listening to the load
or readystatechange
event of the xhr request
現在您可以為響應設置任何您想要的內容,如果您只想修改原始響應,那么您可以使用臨時變量中的數據,然后將修改保存在響應中.
Now you can set anything you want for your response, if all you wanted was to modify the original response then you can use that data from your temporary variable and then save the modifications in the response.
推薦答案
一個非常簡單的解決方法是更改?? responseText
本身的屬性描述符
One very simple workaround is to change the property descriptor for responseText
itself
Object.defineProperty(wrapped, 'responseText', {
writable: true
});
所以,你可以像
(function(proxied) {
XMLHttpRequest = function() {
//cannot use apply directly since we want a 'new' version
var wrapped = new(Function.prototype.bind.apply(proxied, arguments));
Object.defineProperty(wrapped, 'responseText', {
writable: true
});
return wrapped;
};
})(XMLHttpRequest);
演示
這篇關于如何修改另一個函數接收到的 XMLHttpRequest 響應文本?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!