1

FirefoxでGreasemonkeyスクリプトを使用して、特定の投稿変数を変更するために送信プロセスをインターセプトします。古い送信ルーチンを保存して後で呼び出しHTMLFormElement.prototype.submit、傍受(変更)関数で上書きします。

私が現在直面している問題は、何かがpost変数を削除しpost=Submit、変更後に(古い)送信関数を呼び出すと現在のページに戻ることです。

var intercept_complete = false;

window.addEventListener('submit', function (e) {
    e.stopPropagation();
    e.preventDefault();
    interceptor(e);
}, true);

function interceptor_setup() {
    HTMLFormElement.prototype.real_submit = HTMLFormElement.prototype.submit;
    HTMLFormElement.prototype.submit = interceptor;
}

function interceptor(e) {
    var frm = e ? e.target : this;
    if (!interceptor_onsubmit(frm)) {
        return false;
    }

    if (!intercept_complete) {
        ModifyAndPost(frm);
        return false;
    } else {
        HTMLFormElement.prototype.real_submit.apply(frm);
        return true;
    }
}

function interceptor_onsubmit(f) {
    return !f.onsubmit || f.onsubmit();
}

function ModifyAndPost(f) {
    var attrs = new Array('name', 'type', 'value');

    for (var i = 0; i < f.elements.length; i++) {
        for (var a = 0; a < attrs.length; a++) {
            if (attrs[a] == 'name') {
                if (f.elements[i][attrs[a]] == "message") {
                    var current_message = f.elements[i][attrs[a + 2]];
                    if (current_message.indexOf("hello") != -1) {
                        var do_replace = confirm("Detected hello, would you like to replace that with bye?");
                        if (do_replace) {
                            f.elements[i][attrs[a + 2]] = current_message.replace("hello", "bye");
                        }
                    }
                }
            }
        }
    }
    PerformSubmit(f);
}

function PerformSubmit(f) {
    HTMLFormElement.prototype.real_submit.apply(f);
}

interceptor_setup();


基本的に、スクリプトは機能し、post変数を正常に変更しますがHTMLFormElement.prototype.real_submit.apply(f);、変更されたフォームを送信するために呼び出すと、リクエストにPost=Submit変数がなく、送信は失敗します。

削除e.stopPropagation()してみたところe.preventDefault()、時々機能しましたが、それでも時々その投稿変数を削除しました。

誰かが私をこれについて正しい方向に向けることができれば素晴らしいでしょう。;)

4

0 に答える 0