Добавление кода к методу - PullRequest
       22

Добавление кода к методу

1 голос
/ 19 декабря 2010

Я пытаюсь добавить некоторый код к методу объекта XMLHttpRequest, но что-то не работает. Соответствующий код:

XMLHttpRequest.prototype.oldOpen = XMLHttpRequest.prototype.open;
var newOpen = function(method, url, async, user, password) {
    alert( "[debug info]" );
    this.oldOpen(method, url, async, user, password);
}
XMLHttpRequest.prototype.open = newOpen;

Когда вызывается open (), оповещение отключается, но исходная функция не вызывается. Почему это?

Для справки: это часть скрипта GreaseMonkey, которая должна прослушивать трафик XHR. Полный скрипт выглядит следующим образом:

var XMLHttpRequest = unsafeWindow.XMLHttpRequest;

var startTracing = function () {
    XMLHttpRequest.prototype.uniqueID = function() {
        // each XMLHttpRequest gets assigned a unique ID and memorizes it 
        //  in the "uniqueIDMemo" property
        if (!this.uniqueIDMemo) {
            this.uniqueIDMemo = Math.floor(Math.random() * 1000);
        }
        return this.uniqueIDMemo;
    }

    // backup original "open" function reference
    XMLHttpRequest.prototype.oldOpen = XMLHttpRequest.prototype.open;
    var oOpen = XMLHttpRequest.prototype.open;

    var newOpen = function(method, url, async, user, password) {
        alert("open: " + method + "," + url + "," + async + "," + user + "," + password );
        this.oldOpen(method, url, async, user, password);
    }

    XMLHttpRequest.prototype.open = newOpen;

}

startTracing();

1 Ответ

3 голосов
/ 20 декабря 2010

Я попробовал это, что по сути является переделкой вашего кода, и он работал просто отлично. Вот весь мой сценарий greasemonkey.

// ==UserScript==
// @name           sof
// @namespace      taylor.kelly.sof
// @description    Stack overflow testing
// @include        http://localhost:8080/tests/sof.html
// ==/UserScript==

var XMLHttpRequest = unsafeWindow.XMLHttpRequest;
var startTracing = function () {
    // backup original "open" function reference
    var open = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
        alert("open: " + method + "," + url + "," + async + "," + user + "," + password );
        open.apply(this, arguments);
    }
}

startTracing();

Существует проблема синхронизации при загрузке скриптов greasemonkey. Возможно, вам придется подождать, пока window.onload запустит запрос XHTTPRequest на вашей тестовой странице.

Позвольте мне также предположить, что ваша схема uniqueId, вероятно, будет иметь некоторые коллизии. Использование new Date (). GetTime () в сочетании с Math.random уменьшит их почти до 0. Что-то вроде:

new Date().getTime() + '' + Math.floor(Math.random() * 1000)

...