我在 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()
然后有时它会起作用,但仍然偶尔会删除该帖子变量。
如果有人能在这个问题上为我指出正确的方向,那就太好了。;)