我希望所有按钮在其正常的 onclick 事件之前和之后执行一个操作。所以我想出了循环遍历所有这些元素并创建一个包装函数的“绝妙”想法。
当我测试它时,这似乎工作得很好,但是当我将它集成到我们的应用程序中时,它就崩溃了。我将其追溯到包装器更改了“this”值。示例代码说明了这一点;在包装事件处理程序之前,每个按钮都会在您单击时显示按钮 ID,但在包装它之后,在此示例中显示的名称为“未定义”,如果您从表单中运行它,则显示名称为“Form1”。
有人知道做同样事情的更好方法吗?还是保持最初预期的“this”值的好方法?
可以想象,我不想修改目标按钮中的任何现有事件处理程序代码。
提前致谢。
PS-目标浏览器是IE6及以上,不需要跨浏览器功能
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script language="javascript" type="text/javascript">
function btnWrap_onClick()
{
var btns = document.getElementsByTagName("button");
for( var i = 0; i < btns.length; i++)
{
var btn = btns[i];
// handle wrap button differerntly
if( "btnWrap" == btn.id)
{
btn.disabled = true;
continue; // skip this button
}
// wrap it
var originalEventHandler = btn.onclick;
btn.onclick = function()
{
alert("Starting event handler");
originalEventHandler();
alert("Finished event handler");
}
}
alert("Buttons wrapped successfully");
}
</script>
<body>
<p>
<button id="TestButton1" onclick="alert(this.id);">TestButton1</button>
<button id="TestButton2" onclick="alert(this.id);">TestButton2</button>
</p>
<button id="btnWrap" onclick="btnWrap_onClick();">Wrap Event Handlers</button>
</body>
</html>