Невозможно получить правильный синтаксис для динамика. создать на клик то есть путь - PullRequest
0 голосов
/ 26 апреля 2010

Я надеялся сохранить кросс-браузерную совместимость, и на данный момент это единственная проблема.

.setAttribute("onclick", "return showRapidText("+itemnum+");"); 

Это работает ОТЛИЧНО, но я бы хотел сделать его совместимым с IE, указав этот синтаксис

.onclick = new Function("fnDisplay_Computers('" + alines[i] + "')");

так ... я пытался

.onclick = new Function("showRapidText('" + itemnum + "')");

и

.onclick = new Function("return showRapidText('" + itemnum + "')");

и около 40 других способов, но ничего не работает

Ответы [ 2 ]

3 голосов
/ 26 апреля 2010
element.onclick = function() {
    return showRapidText(itemnum);
};
1 голос
/ 26 апреля 2010

+ 1 ответ J-P: функциональные литералы значительно лучше, чем строки. Взламывать код в строках - это ужас, которого следует избегать любой ценой. Кроме того, setAttribute почти никогда не следует использовать в HTMLDocument из-за совместимости с IE (а также из-за того, что свойства HTML уровня 1 DOM в любом случае более читаемы).

Одна потенциальная ловушка: если вы делаете это в цикле, который выглядит так, как если бы вы были, вы не получите желаемого поведения из-за проблемы замыкания цикла . Вы можете решить это с помощью другого замыкания:

for (var i= 0; i<alines.length; i++) {
    elements[i].onclick= function(i) {
        return function() {
            fnDisplay_Computers(alines[i]);
        };
    }(i);
}

или более аккуратно с помощью функции пятого издания ECMAScript Function#bind:

for (var i= 0; i<alines.length; i++) {
    elements[i].onclick= fnDisplay_Computers.bind(null, alines[i]);
}

Добавление функции # bind в браузеры, которые ее еще не поддерживают.

...