如何全局覆盖 javascript 中 html 表单的提交

How to globally overwrite submit on html form in javascript

我今天为此苦苦挣扎了一整天,我发现了这个 http://greasemonkey.win-start.de/patterns/override-method.html 但它只有 50% 准确,所以我决定分享解决方案,因为它可能对 csrf 实施等例如有用。

任何类型的表单提交解决方案:

// form.submit() js 调用的代码 https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit

HTMLFormElement.prototype._submit = HTMLFormElement.prototype.submit;
     
function newSubmit() {
    //add code here

    this._submit();
}

HTMLFormElement.prototype.submit = newSubmit;

// 点击按钮类型提交的代码 https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/requestSubmit

function newRequestSubmit(submitter) {       
    if (submitter.srcElement.tagName === "FORM") {
     // add code here
    }
}

document.body.addEventListener("submit", newRequestSubmit);

对于 csrf 实现,覆盖 XMLHttpRequest.prototype.open 在 ajax 请求的情况下也很有用,方法是在 header 中设置 csrf:https://whosebug.com/a/56499250/7309871