#html #internet-explorer #firefox #href
#HTML #internet-explorer #firefox #href
Вопрос:
Мой приведенный ниже код отлично работает в IE8, но в FF 3.5 нажатие на ссылку вызывает ошибку «start_upload не является функцией». Что происходит? (Конечно, start_upload — это допустимая функция, которая отлично работает в IE)
<div align="left">
<a href="#" onClick="start_upload();"
onMouseOver="start_upload.src='/Images/Buttons/Upload-glow.gif'"
onMouseOut="start_upload.src='/Images/Buttons/Upload.gif'">
<img src="/Images/Buttons/Upload.gif" id="start_upload" width="90" height="25" border="0"></a>
</a>
</div>
Комментарии:
1. Является
start_upload
функцией?
Ответ №1:
Это из-за способа, которым on....
обрабатываются события, или которые стандартно должны обрабатываться. Контекст onclick
встроенной функции — это <a>
элемент, к которому она была присоединена, затем его родительский элемент, затем его parent, и так далее до document
и window
. Поскольку IE поддерживает ссылки на элементы по идентификатору (и FF должен, но все еще не делает этого), это работает. Однако в любом случае это правильно — start_upload
не является функцией. Это изображение. Что именно вы намерены start_upload();
делать? Вы можете установить его src
, и это правильно, но вы не можете вызвать элемент как функцию.
Комментарии:
1. но я определил функцию javascript с именем start_upload выше на странице. Я попытался заменить код тегом img, но получаю ту же ошибку в FF. Смотрите сами: generationd.com/Pages/Private/DownloadUpload/Upload.php
2. Так что не дублируйте это. Измените свою функцию
start_upload
на что-то вродеstartUpload
, и она будет работать.3. АААА … теперь я понял. Я ошибочно называю свою функцию так же, как html-элемент. Хорошо, спасибо!
4. Firefox поддерживает ссылки на элементы по идентификатору простого слова в режиме quirks. Но в любом случае, эта ситуация примерно
document.start_upload
связана с настройкой цепочки областей для встроенных обработчиков событий, поэтому простое слово «загрязнение глобальной области» даже не появляется на картинке. Реальная проблема заключается в том, что поиск имени IE во встроенных обработчиках событий зависит от контекста:start_upload
преобразуется к элементу, ноstart_upload()
игнорирует элемент, находит и вызывает функцию.
Ответ №2:
Происходит то, что IE нарушает спецификацию ECMAScript. Когда вы это делаете start_upload
, это преобразует его либо в функцию, либо в элемент, в зависимости от того, следует за ним ()
или нет. В Gecko start_upload
в этой ситуации во всех случаях разрешается до элемента, а затем вы пытаетесь вызвать элемент.
Ответ №3:
Каким-то образом ваш код также работает без сбоев в Firefox (предполагается, что у вас есть функция define start_upload). Вот мой код, который отлично работает. Также смотрите, у вас есть close </a>
два раза (это не должно быть проблемой).
<body>
<div align="left">
<a href="#" onClick="start_upload();"
onMouseOver="start_upload.src='/Images/Buttons/Upload-glow.gif'"
onMouseOut="start_upload.src='/Images/Buttons/Upload.gif'">
<img src="/Images/Buttons/Upload.gif" id="start_upload" width="90" height="25" border="0">
</a>
</div>
</body>
</html>
<script>
function start_upload()
{
alert ("a");
}
</script>
Комментарии:
1. «Также смотрите, у вас есть close «» два раза» — где именно?
2. Просто проверьте свой опубликованный код, вы закрыли </ a> два раза. Также работал ли приведенный мной код или выдавал какие-либо ошибки?
3. Извините, исправлено ваше сообщение — StackOverflow позволяет вам использовать простые HTML-элементы, такие как
<a>
, в ваших сообщениях, поэтому ваше было удалено.