Недопустимое исключение DOM персонажа в IE9
Следующий фрагмент JS, который использовался для работы в IE8, теперь не работает в IE9.
document.createElement('<iframe id="yui-history-iframe" src="../../images/defaults/transparent-pixel.gif" style="position:absolute;top:0;left:0;width:1px;height:1px;visibility:hidden;"></iframe>');
Я получаю следующее исключение: SCRIPT5022: исключение DOM: INVALID_CHARACTER_ERR (5)
Является ли вышеуказанный фрагмент кода не стандартным. Какое исправление для проблемы?
Ответы
Ответ 1
API для createElement указывает, что конструктор хочет string
, что вид - имя элемента. Похоже, что IE9 более строго соответствует стандартам. Вы можете выполнить то же самое, что вы пытаетесь сделать со следующим кодом:
var iframe = document.createElement("iframe");
iframe.setAttribute("id", "yui-history-iframe");
iframe.setAttribute("src", "../../images/defaults/transparent-pixel.gif");
iframe.setAttribute("style", "position:absolute;top:0;left:0;width:1px;height:1px;visibility:hidden;");
http://msdn.microsoft.com/en-us/library/ms536389(v=vs.85).aspx
Ответ 2
Для jQuery.bgiframe.js было бы лучшим решением для исправления неправильного теста IE6?
Как насчет замены этого:
if($.browser.msie&&/6.0/.test(navigator.userAgent)
с чем-то вроде этого:
if ($.browser.msie && $.browser.version=="6.0")
Ответ 3
Для jquery.bgiframe.js:
Я загрузил версию 1.1.3 pre at
https://github.com/brandonaaron/bgiframe/blob/master/jquery.bgiframe.js
и это решило проблему.
Ответ 4
Эта ошибка может возникнуть при случайном использовании стандартных имен функций JavaScript в качестве собственных имен функций, если вы не используете пространства имен. Например, у меня есть концепция под названием "Атрибут", и я хотел попробовать новую функцию, которая создала новую из них:
<button onclick="createAttribute('Pony')">Foo</button>
<button onclick="createAttribute('Magical pony')">Bar</button>
<script type="text/javascript">
function createAttribute(name) { alert(name); }
</script>
- Нажатие "Foo" ничего не дает
- Щелчок по Foo дает вам
INVALID_CHARACTER_ERR (5)
или InvalidCharacterError: DOM Exception
5
- Открытие консоли разработчика и запуск
createAttribute('Django')
дает вам предупреждение
Что происходит, так это то, что кнопки вызывают document.createAttribute()
, и ваша консоль dev вызывает функцию, которую вы объявили.
Решение: используйте другое имя функции или еще лучше - пространство имен.
Ответ 5
Если вы готовы пожертвовать небольшим успехом и можете использовать внешнюю библиотеку, я бы предложил использовать:
Прототип JS
var el = new Element('iframe', {
id: "<your id here>",
src: "<your source here>",
style: "<your style here>"
});
JQuery
var el = jQuery('<iframe>', {
id: '<your id here>',
src: "<your source here>",
style: "<your style here>"
})[0];
Это касается всех несоответствий между браузерами, а также намного красивее: -)
Примечание. Это непроверенный псевдокод - см. официальные страницы документации Prototype JS и jQuery для получения дополнительной информации.
Ответ 6
Это решение для jquery jquery.bgiframe.js.
if ( $.browser.msie && /9.0/.test(navigator.userAgent) ) {
var iframe = document.createElement("iframe");
iframe.setAttribute("class", "bgiframe");
iframe.setAttribute("frameborder", "0");
iframe.setAttribute("style", "display:block;position:absolute;z-index:-1;filter:Alpha(Opacity=\'0\');top:expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\');left:expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\');width:expression(this.parentNode.offsetWidth+\'px\');height:expression(this.parentNode.offsetHeight+\'px\');");
this.insertBefore( iframe, this.firstChild );
} else {
this.insertBefore( document.createElement(html), this.firstChild );
}