我正在尝试修改如下所示的现有网页
<script type="text/javascript" src="s1.js"></script>
s1.js有这样的东西
window.onDomReady = DomReady;
function DomReady(fn)
{
if(document.addEventListener)
{
document.addEventListener("DOMContentLoaded", fn, false);
}
else
{
document.onreadystatechange = function(){chState(fn);};
}
}
function chState(fn)
{
if(document.readyState == "interactive" || document.readyState == "complete")
fn();
}
window.onDomReady(addHndlrs);
function addHndlrs()
{
var forms = document.getElementsByTagName("form");
for(var i = 0; i < forms.length; i++)
{
var form = forms[i];
if(form.addEventListener)
{
form.addEventListener("submit", DoValidate, false);
}
else if (form.attachEvent)
{
form.attachEvent("onsubmit", DoValidate);
}
Other stuff.
}
当我单击表单上的“提交”时,DoValidate确实会调用。
我试图修改此页面以添加另一个提交处理程序,该处理程序在第一个处理程序之后调用。
我复制了上面的代码,更改了函数名称并放入s2.js。
window.onDomReady = DReady;
function DReady(fn)
{
if(document.addEventListener)
{
document.addEventListener("DOMContentLoaded", fn, false);
}
else
{
document.onreadystatechange = function(){Chk1State(fn);};
}
}
function Chk1State(fn)
{
if(document.readyState == "interactive" || document.readyState == "complete")
fn();
}
window.onDomReady(myready);
function myready()
{
var forms = document.getElementsByTagName("form");
for(var i = 0; i < forms.length; i++)
{
var form = forms[i];
if(form.addEventListener)
{
form.addEventListener("submit", mynewhandler, false);
}
else if (form.attachEvent)
{
form.attachEvent("onsubmit", mynewhandler);
}
}
}
在html格式中,我添加了对它的引用
<script type="text/javascript" src="s1.js"></script>
<script type="text/javascript" src="s2.js"></script>
我的新提交处理程序永远不会被调用。我通过Firebug调试了它-我看到DReady被调用并且我的DOM Ready处理程序被注册。但是myready永远不会被调用,因此我的提交处理程序永远不会被注册。
我在这里想念什么?我尝试更改s1.js和s2.js的包含顺序,但这似乎无济于事。我想这样做而不修改s1.js
最佳答案
您提供的代码似乎很好!已检查过Chrome 25,FireFox 19和IE 10!
通常,我发现仅在运行时修改代码(而不是源文件)会更容易,这归功于JavaScript是动态类型化的,因此您可以用自己的代码覆盖DoValidate
函数,将原始的DoValidate
通过闭包传递给:
var originalValidate = DoValidate;
DoValidate = function () {
originalValidate();
alert("my handler");
};