更改JavaScript函数的定义
假设您有一个函数,如下所示:更改JavaScript函数的定义,javascript,Javascript,假设您有一个函数,如下所示: function chk() { var valid = true; if(document.getElementById("bob")) { if(document.getElementById("bob").value == "") { valid = false; writeErrorMessage("bob", "Field 'Bob' is mandatory");
function chk() {
var valid = true;
if(document.getElementById("bob")) {
if(document.getElementById("bob").value == "") {
valid = false;
writeErrorMessage("bob", "Field 'Bob' is mandatory");
}
}
... //There may be a lot more than just this field, depending on the clients configuration.
return valid;
}
此函数由核心代码输出。现在,一个客户过来说,他们希望字段“x”是强制性的。在查看核心代码时,我们可以看到,默认情况下,此字段不能设置为必填字段,但我们之前所做的工作如下所示:
var chk2 = chk;
chk = function() {
var valid = true;
if(document.getElementById("x")) {
if(document.getElementById("x").value == "") {
valid = false;
writeErrorMessage("x", "Field 'x' is mandatory");
}
}
if(valid) valid = chk2();
return valid;
}
这里的问题是,如果valid为false,那么它将不会运行原始的chk函数(chk2),因此最初验证的那些字段的错误消息将不会显示
我想做的基本上是编辑这个chk函数的工作-在最后一行之前添加几行,返回valid
,这样它可以验证更多的字段。问题是,整个函数都是由核心代码输出的,因此,除了错误消息和验证哪些字段之外,这超出了我们的控制范围。如果一个字段在默认情况下不能成为强制字段,那么它将永远不会为该字段输出此验证代码
记住return valid
行保证始终存在,是否有人知道我可以获取函数体,替换函数体的特定部分,然后将新字符串设置为该函数的新体的方法?这似乎是JS应该可以做到的事情,但我就是无法找到实现这一点的方法
提前谢谢。
当做
Richard重读了你原来的问题后,这个问题怎么样:
//store the original
var old_chk=chk;
// create a new version that first runs the original
chk=function(){
// run the original validation
var valid=old_chk();
//do your additional tests here
var el=document.getElementById('x');
if(el &&!el.value){
valid=false;
...
}
return valid
}
我刚刚想到了一个可能的解决方法-将
chk2()
的结果存储在另一个变量valid2
中,然后返回(valid&&valid2)代码>。我试试看。在其他情况下,我们可能希望编辑字段的验证方式,例如检查格式。不完全确定我们目前的做法是否可行。OP说问题是整个函数都是由核心代码输出的,所以除了错误消息和验证哪些字段之外,这超出了我们的控制。
在这种情况下,存储原始的var oldcheck=check
然后用id参数声明新的一个,如果(!id){return oldcheck()}
已经重新阅读了您的问题(在晚上睡觉后)我已经编辑了我的回答,我认为这将是我在发表这个问题后不久的评论中所说的稍微更有效的版本。然而,我们遇到过这样的情况:由于最初的check函数所做的,我们在身体上无法做我们想做的事情——我想不出一个具体的例子,因为我已经做了一段时间了,但是如果我想到任何例子,我会发布它们。在我的脑海里,我认为这是当一个字段是强制性的,所以它检查空值,但我们希望它需要一个特定的格式(邮政编码,电话号码等)。只是为了记录不,我们不使用像“bob”或“x”这样的词作为字段名lol!它们的命名通常是合理的,尽管不可否认,除非你碰巧知道它们,否则有一两个名称可能会让人困惑。