SYNTAX_ERR: исключение DOM 12 - Hmmm
Я работал над небольшим слайд-шоу/публичным дисплеем для клиента, который использует HTML5 Rock код слайд-шоу. Я столкнулся с DOM Exception 12 - синтаксической ошибкой, которая предположительно связана с селекторами CSS - при этом обезьяна с ним... но я не могу отследить ее до изменений, которые я сделал в коде. Я думаю, что это может быть что-то, что было обнаружено, когда я добавил функции.
Я проследил его до этого объекта (live version здесь):
var SlideShow = function(slides) {
this._slides = (slides || []).map(function(el, idx) {
return new Slide(el, idx);
});
var h = window.location.hash;
try {
this.current = h;
} catch (e) { /* squeltch */ }
this.current = (!this.current) ? "landing-slide" : this.current.replace('#', '');
if (!query('#' + this.current)) {
// if this happens is very likely that someone is coming from
// a link with the old permalink format, i.e. #slide24
alert('The format of the permalinks have recently changed. If you are coming ' +
'here from an old external link it\ very likely you will land to the wrong slide');
this.current = "landing-slide";
}
var _t = this;
doc.addEventListener('keydown',
function(e) { _t.handleKeys(e); }, false);
doc.addEventListener('touchstart',
function(e) { _t.handleTouchStart(e); }, false);
doc.addEventListener('touchend',
function(e) { _t.handleTouchEnd(e); }, false);
window.addEventListener('popstate',
function(e) { if (e.state) { _t.go(e.state, true); } }, false);
};
Активация SlideShow()
(строка 521 в main.js):
var slideshow = new SlideShow(queryAll('.slide'));
Вызов queryAll('.slide')
возвращает массив всех слайдов с классом .slide
. Однако при передаче queryAll('.slide')
в качестве параметра для экземпляра SlideShow()
он возвращает ошибку DOM Exception 12
.
Кто-нибудь видел это раньше?
Ответы
Ответ 1
В документе используются незаконные id-атрибуты (незаконные до HTML5), например. 2-slide
. Исправьте их.
Чтобы объяснить:
для решения известного неправильного поведения element.querySelectorAll()
селектор .slide
будет внутренне переписан (с использованием идентификатора элемент). Это приведет к чему-то вроде этого:
#2-slide .moreselectors
... и заставляет ошибку, поскольку идентификатор может не начинаться с номера.
Смотрите скрипту: http://jsfiddle.net/doktormolle/FGWhk/
Ответ 2
Если вы придете сюда после поиска этой ошибки в слайдах горных пород HTML5:
По какой-то причине они удаляют класс 'to-build' со следующим:
toBuild[0].classList.remove('to-build', '');
Это ломает все слайды на сборке, даже демонстрация Google сейчас сломана.
Просто измените строку 220 на default.js на
toBuild[0].classList.remove('to-build');
все хорошо!
Ответ 3
В моем случае он использовал self.postMessage(e.data); в основной теме при использовании веб-работников.
Я знаю, что это не связано с проблемой OP, но это странная ошибка, поэтому я оставляю это здесь, надеюсь, что она помогает другим.
Ответ 4
Такая же проблема для меня, но в моем случае попытайтесь получить элементы из их атрибута
document.querySelectorAll('input[name="path"]')
и SYNTAX_ERR: исключение DOM 12 произошло только в Safari. Поэтому я изменил его, чтобы получить элемент непосредственно из класса и теперь отлично работает.
Ответ 5
Вы можете избежать кавычек, например, в applescript, а затем нет проблем на сафари
do JavaScript "document.querySelector('span[" & attrName & "=\"" & attrValue & "\"]').click();"