onew.setAttribute(“type”,“button”);
不要在HTML文档上使用setAttribute。 IE得到它在许多情况下严重错误,和DOM-HTML属性是较短的,更快速,更容易阅读:
onew.type= 'button';
onew.onclick =函数(){fnDisplay_Computers( “'” + ALINES [I ] +“'”); }; // ie
'alines'是什么?你为什么把它转换成一个字符串并用单引号包围它?看起来你正在试图做一些令人讨厌的事情,包括评估字符串中的代码(这就是你在'onew.setAttribute'版本中做的)。评估字符串中的JavaScript代码几乎总是错误的;避免它像瘟疫一样。在上面的例子中,IE应该和Firefox一样:它不应该工作。
如果'alines [i]'是一个字符串,我想你要做的就是通过构建一个代码字符串来记住该字符串,该字符串将在JavaScript中评估为原始字符串。但是:
"'" + alines[i] + "'"
不足。如果'alines [i]'有一个撇号或者一个反斜杠,会发生什么?
'O'Reilly'
你有一个语法错误和可能的安全漏洞。现在,你可以做一些繁琐和恼人的,如:
"'" + alines[i].split('\\').join('\\\\').split("'").join("\\'") + "'"
试图逃跑的字符串,但它的丑陋,并不会为其它数据类型的工作。你甚至可以问JavaScript来为你做它:
uneval(alines[i])
但不是所有的对象,甚至可以转化为可求的JavaScript源字符串;基本上整个方法注定要失败。
正常的事情,如果你只是想拥有的onclick回调调用带有参数的功能是编写代码以直接的方式:
onew.onclick= function() {
fnDisplay_Computers(alines[i]);
};
通常,这工作,是你想要的。然而,你可能会在这里碰到一个轻微的皱纹,这可能是你考虑到古怪的方法和弦的混淆。
也就是说,如果在这种情况下'i'是封闭'for'循环的变量,那么对'alines [i]'的引用将不会做你认为它所做的事情。点击发生后,'i'将被回调函数访问 - 循环结束后。此时,'i'变量将留在循环结尾的任何值,因此'alines [i]'将永远是'alines'的最后一个元素,无论单击哪个'onew'。
(对于一些这方面的讨论,例如参见How to fix closure problem in ActionScript 3 (AS3),这是混淆的,在JavaScript和Python的倒闭的最大原因之一,确实应该有一天固定在一个语言水平。)
你可以避开环路问题通过其自身的功能封装倒闭,就像这样:
function callbackWithArgs(f, args) {
return function() { f.apply(window, args); }
}
// ...
onew.onclick= callbackWithArgs(fnDisplay_Computers, [alines[i]]);
而在JavaScript中的更高版本,你就可以简单地说:
onew.onclick= fnDisplay_Computers.bind(window, alines[i]);
如果你想今天能够使用“Function.bind()”在浏览器中,你可以从Prototype框架的实施,或只是使用:
if (!('bind' in Function.prototype)) {
Function.prototype.bind= function(owner) {
var that= this;
var args= Array.prototype.slice.call(arguments, 1);
return function() {
return that.apply(owner,
args.length===0? arguments : arguments.length===0? args :
args.concat(Array.prototype.slice.call(arguments, 0))
);
};
};
}
这完美的作品,你能解释一下为什么设置它为“新功能”(即使函数fnDisplay_Computers()”是否已经定义,解决了这个问题? – 2009-04-14 19:24:34
我认为这是一个涉及到的数据类型的问题,以及与新的onclick方法相关的“新函数”的引用......但我真的不知道确切的答案,对不起! – 2009-04-14 19:28:36