'this' ссылка на элемент нажата с ошибкой, т.е. - PullRequest
1 голос
/ 17 июня 2009

Для кода ниже, у меня есть некоторые проблемы в IE. Второй параметр, передаваемый в функцию, должен быть ссылкой на элемент, по которому щелкнули. Это хорошо работает в FF и Safari, но когда я тестировал его в IE7, это ошибки. IE, кажется, получает элемент (как видно из консоли), но всякий раз, когда я пытаюсь что-то с ним сделать, я получаю ошибку:

"Объект не поддерживает это свойство или метод"

Спасибо за помощь.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>  
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js"></script>
<script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>   
<script language="javascript" type="text/javascript">   
    var Test = {            
        doIt: function(str, btn) {  
            console.log(str);
            console.log(btn);               
            if (btn.hasClassName('red')) {
                console.log('has red');         
            } else {
                console.log('doesn\'t');
            }           
        }   
    };  
</script>   
<a href="#" onClick="Test.doIt('hello', this)" class="red">Test</a> 
</body></html>

Ответы [ 2 ]

6 голосов
/ 17 июня 2009

Проблема в том, что btn автоматически не имеет метод hasClassName - это расширение Prototype.

Чтобы расширить свой элемент с помощью функций расширения прототипа , добавьте эту строку вверху doIt():

btn = $(btn); // Extends element with Prototype functions.

Ваш код должен работать оттуда.

2 голосов
/ 17 июня 2009

Это связано с тем, что при использовании Prototype элементы не расширяются автоматически с помощью функций Prototype при загрузке страницы в IE, им, в частности, приходится проходить через вызов $() для расширения элементов с помощью этих методов. Добавьте это в начало вашей функции, чтобы она работала в IE.

doIt : function(str, btn) {
    btn = $(btn);
}

Редактировать: Для пояснения, во всех браузерах, кроме IE 7 (iirc) и ниже, HTML-элементы будут прототипироваться автоматически, но в IE <= 7 они должны проходить через функцию <code>$(), чтобы иметь эти прототипы применяются.

...