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