onew.setAttribute («тип», «кнопка»);
Никогда не используйте setAttribute в документах HTML. Во многих случаях IE ошибается, а свойства DOM-HTML короче, быстрее и проще для чтения:
onew.type= 'button';
onew.onclick = function () {fnDisplay_Computers ("'" + alines [i] + "'"); }; // т.е.
Что такое "алины"? Почему вы конвертируете его в строку и заключаете в одинарные кавычки? Похоже, вы пытаетесь сделать что-то отвратительное, включая оценку кода в строке (это то, что вы делаете ниже в версии «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'.
(См., Например, Как исправить проблему с замыканием в 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 framework или просто использовать:
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))
);
};
};
}