onclick вызывает «не является функцией» в FF, но IE в порядке

#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> , в ваших сообщениях, поэтому ваше было удалено.