我在Firefox中使用Greasemonkey脚本拦截提交过程以修改某个post变量。我保存旧的提交例程以便稍后调用它并用我的拦截(修改)函数覆盖HTMLFormElement.prototype.submit
。
我目前面临的问题是,在修改后,某些内容会删除帖子变量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()
然后它有时会工作,但仍然会偶尔删除该帖子变量。
如果有人能指出我在这个方向上的正确方向,那将会很棒。 ;)