我对javascript有一个非常奇怪的问题。我的代码相当长,所以这里是结构和问题的一个例子:
var x = new function f() {
this.id = "";
}
function g(obj) {
if (x.id == "") {
...
obj.firstChild.setAttribute("onclick", "javascript:o();");
...
x.id = obj.id;
} else if (x.id != obj.id) {
...
x.id = "";
g(obj);
}
}
function o() {...
if (something == something) {
...
} else {
...
x.id = ""; // if-statement of the g() function is called here?
}
}
正如您所看到的,g()函数的if语句由于某种原因在x.id被更改时被调用或重新运行。我根本无法理解这一点,因为它们不在同一范围内,更改变量应该在任何情况下都不会触发任何内容?
非常感谢任何帮助。
答案 0 :(得分:3)
x.id = ""; // if-statement of the g() function is called here?
如果代码确实如您所示,那行代码将不会生成函数调用。该行只是id
x
属性的赋值。如果您使用支持属性访问器(getter和setter)的浏览器,则可以通过分配id
x
属性来触发函数调用的唯一方法,这是非常不可能的(并且你的代码中没有任何内容可以这样做。)
其他似乎在某种循环中调用g
,因此您更改该值会使下一次调用g
看到更改。正如Jonathon在他对这个问题的评论中指出的那样,这可能是你用setTimeout
或setInterval
设置的,或者是偶数处理程序(例如鼠标移动)等等。 ,但引用的代码中没有任何内容。
可能偏离主题:
一开始就有这行代码:
var x = new function f() {
this.id = "";
}
该代码使用“命名函数表达式”,应该有效但在某些实现中会导致问题(例如,IE)。将其拆分以可靠地跨浏览器获得所需结果:
var x = new f();
function f() {
this.id = "";
}
关闭-主题强>:
除了使用URI的属性(如javascript:
元素上的href
)之外,您不使用a
伪协议。 onclick
属性不接受URI,它需要JavaScript代码,因此更改:
obj.firstChild.setAttribute("onclick", "javascript:o();");
到
obj.firstChild.setAttribute("onclick", "o();");
但是,更好的是,直接分配处理程序:
obj.firstChild.onclick = o;
...甚至考虑使用addEventListener
或其IE对应attachEvent
代替。
答案 1 :(得分:0)
非常感谢您的回答。我现在已经弄明白了这个问题。只要单击某个tableRow对象,就会调用函数g()。这个tableRow包含obj.firstChild。因此,当我点击obj.firstChild时,o()和g()都会被执行。
现在我必须弄清楚如何在单击obj.firsChild时阻止调用g()。