1

我在 Firefox 中使用 Greasemonkey 脚本来拦截提交过程,以修改某个 post 变量。我保存旧的提交例程以便稍后调用它并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