Свойство innerHTML
на самом деле еще не стандартизировано, хотя все современные браузеры поддерживают его, и черновой стандарт HTML5 включает определение того, как оно должно работать . Согласно спецификации HTML5 :
При вставке с использованием метода <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/apis-in-html-documents.html#dom-document-write" rel="nofollow noreferrer">document.write()</a>
элементы <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#script" rel="nofollow noreferrer">script</a>
выполняются (обычно синхронно), но при вставке с использованием атрибутов <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/apis-in-html-documents.html#dom-innerhtml" rel="nofollow noreferrer">innerHTML</a>
и <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/apis-in-html-documents.html#dom-outerhtml" rel="nofollow noreferrer">outerHTML</a>
они не выполняются вообще.
innerHTML
впервые был представлен в Microsoft Internet Explorer 4 и благодаря своей популярности среди авторов был принят всеми другими браузерами, что и привело к его включению в HTML5. Итак, давайте проверим документацию Microsoft :
При использовании innerHTML для вставки сценария необходимо включить атрибут DEFER в элемент script .
Таким образом, очевидно, что в IE вы можете запускать сценарии через innerHTML
, но только если вы добавляете атрибут defer
(у меня нет IE передо мной, чтобы проверить это). defer
- еще одна функция, впервые добавленная в IE; он был включен в HTML 4.01 , но долгое время не использовался ни одним из других браузеров. HTML5 включает в себя гораздо более подробное описание того, как <script defer>
должен работать, хотя кажется, что оно немного несовместимо с тем, как оно работает в IE, так как не позволяет выполнять сценарии, добавленные через innerHTML
. Определение HTML5 <script defer>
, по-видимому, реализовано в Firefox 3.5 и Safari 4 .
Таким образом, innerHTML
на самом деле еще не стандартизирован, а вместо этого просто реализован всеми поставщиками браузеров немного другими способами. В IE, первоначальной реализации, он не поддерживал выполнение сценариев, кроме как с атрибутом defer
, а defer
не поддерживался в других браузерах до недавнего времени, и поэтому другие браузеры просто не поддерживают выполнение сценариев, добавленных с использованием innerHTML
. Это поведение является тем, что стандартизирует HTML5, поэтому, если объекты Microsoft, вероятно, не будут тем, что входит в стандарт.
Похоже, что браузер, с которым вы работаете, не так хорошо реализовал совместимый innerHTML
, поскольку он выполняет скрипты, добавленные с использованием innerHTML
, несмотря ни на что. Это неудивительно, поскольку поведение не стандартизировано, поэтому его необходимо либо пересмотреть, либо почерпнуть из прочтения документации других браузеров (которые, возможно, не учитывали этот факт в прошлом). Одна из основных целей HTML5 - записать все эти неписаные предположения и недокументированное поведение, чтобы в будущем кто-то, реализующий браузер, мог это сделать, не будучи введенным в заблуждение спецификацией, не соответствующей действительности, или не имея сделать попытку реверс-инжиниринга существующих браузеров.
Мне кажется, что вам, возможно, придется использовать Метод 2 во встроенном браузере и Метод 1 , если вы хотите работать в обычных браузерах для настольных компьютеров. Вероятно, было бы неплохо сначала попробовать Метод 1 и вернуться к Метод 2 , если это не сработает, а затем выполнить ошибку (или молча завершиться ошибкой, в зависимости от ваших потребностей). ) если ни один из них не работает.