onew.setAttribute ("tipo", "botón");
Nunca use setAttribute en documentos HTML. IE consigue muy mal en muchos casos, y las propiedades DOM-HTML son más cortos, más rápido y más fácil de leer:
onew.type= 'button';
onew.onclick = function() {fnDisplay_Computers ("'" + alines [i ] + "'"); }; // ie
¿Qué es 'alines'? ¿Por qué lo está convirtiendo en una cadena y rodeándolo con comillas simples? Parece que estás tratando de hacer algo atroz que implica la evaluación de código en una cadena (que es lo que estás haciendo a continuación en la versión 'onew.setAttribute'). La evaluación del código JavaScript en cadenas es casi siempre lo incorrecto; evitarlo como la peste. En el caso anterior, IE debería hacer lo mismo que Firefox: no debería funcionar.
Si 'alines [i]' es una cadena, supongo que lo que intenta hacer es recordar esa cadena construyendo una cadena de código que evaluará en JavaScript la cadena original. Pero:
"'" + alines[i] + "'"
es insuficiente. ¿Qué sucede si 'alines [i]' tiene un apóstrofo adentro, o una barra invertida?
'O'Reilly'
usted tiene un error de sintaxis y posible agujero de seguridad.Ahora, se podría hacer algo laborioso y molesto como:
"'" + alines[i].split('\\').join('\\\\').split("'").join("\\'") + "'"
para tratar de escapar de la cadena, pero es feo y no va a funcionar para otros tipos de datos. Incluso se puede pedir JavaScript para hacerlo por usted:
uneval(alines[i])
Pero no todos los objetos, incluso se pueden convertir en evaluable cadenas de código JavaScript; básicamente todo el enfoque está condenado al fracaso.
Lo normal hacer si lo que desea es tener la devolución de llamada onclick llamar a una función con un parámetro es escribir el código en la forma sencilla:
onew.onclick= function() {
fnDisplay_Computers(alines[i]);
};
Generalmente esto funcionará y es lo que quiere . Hay, sin embargo, una pequeña arruga que puede haber golpeado aquí, que podría ser lo que le confunde al considerar el enfoque loco con las cuerdas.
A saber, si 'i' en este caso es la variable de un bucle 'para' adjunto, la referencia a 'alines [i]' no hará lo que usted piensa que hace. La función de devolución de llamada accederá a la 'i' cuando ocurra el clic, que es después de que haya terminado el ciclo. En este punto, la variable 'i' quedará con el valor que tenga al final del ciclo, por lo que 'alines [i]' siempre será el último elemento de 'alines', independientemente de en qué 'onew' se haya hecho clic.
(Véase, por ejemplo. How to fix closure problem in ActionScript 3 (AS3) por alguna discusión sobre esto. Es una de las mayores causas de la confusión con cierres en JavaScript y Python, y realmente debe fijarse en un nivel de lengua algún día.)
Puede sortear el problema de bucle encapsulando el cierre en su propia función, así:
function callbackWithArgs(f, args) {
return function() { f.apply(window, args); }
}
// ...
onew.onclick= callbackWithArgs(fnDisplay_Computers, [alines[i]]);
Y en una versión posterior de JavaScript, podrás decir simplemente:
onew.onclick= fnDisplay_Computers.bind(window, alines[i]);
Si le gustaría ser capaz de utilizar 'Function.bind()' en los navegadores de hoy en día, se puede obtener una implementación del marco Prototype, o simplemente utilizar:
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))
);
};
};
}
Esto funciona perfectamente, se puede explicar por qué su puesta en marcha como una "nueva función" (a pesar de que los fnDisplay_Computers función()" ya está definido, resuelve el problema? –
Creo que es un problema del tipo de datos involucrados y la referencia a la "nueva Función" asociada con el nuevo método onclick ... pero realmente no sé la respuesta exacta, lo siento! –
Hermoso! Gracias! Tuve problemas con IE7 esto lo resolvió perfectamente –