4.22. 覆盖内建的 Javascript 方法

您可以用 prototype 属性 覆盖原有的对象方法。

例 4.26. 当表单提交时做点事

function newsubmit(event) {
var target = event ? event.target : this;

// 在这里定义想做的操作
alert('Submitting form to ' + target.action);

// 调用真正的提交函数
this._submit();
}

// 捕获所有表单的 onsubmit 事件
window.addEventListener('submit', newsubmit, true);

// 如果脚本调用 someForm.submit(),onsubmit 事件不会发生,
// 所以我们需要重新定义 HTMLFormElement 类的 submit 方法。
HTMLFormElement.prototype._submit = HTMLFormElement.prototype.submit;
HTMLFormElement.prototype.submit = newsubmit;

在这里做了两件事。首先,我加入了一个用来捕获 submit 事件的监听函数。当用户点击表单的提交按钮时,触发 submit 事件。然而,当别的脚本调用表单的 submit() 方法时,并不会触发 submit 事件。 所以,我做的第二件事是覆盖 HTMLFormElement 类的 submit 方法。

但是等等,还有几点需要说明。事件监听函数和重新定义的方法都指向同一个函数,newsubmit。如果 newsubmit 被一个 submit 事件调用,event 参数将会被包含在事件对象中,这个事件对象包含事件的信息(例如,event.target 是被提交的表单)。然而,如果脚本手动调用了 submit 方法,event 事件会被忽略掉,但是全局变量 this 将会指向这个表单。因此,在我的 newsubmit 函数中,我先判断 event 是否为空;如果为空,就用 this 来得到这个表单。

[提示]

正常情况下,当用户提交一个表单时,例如,点击表单中的 提交 按钮或者按 回车键),都会触发 submit 事件。但是,当脚本调用 aForm.submit() 提交表单时,却不会触发 submit 事件。因此,您必须做两件事来捕获表单的提交事件:给 submit 事件增加事件监听,并且修改 HTMLFormElement 类的原型来重定向 submit() 方法到您的自定义函数上。

← 俘获用户点击
解析 XML →