SYNTAX_ERR: Исключение DOM 12 - Хммм

Я работал над небольшим слайд-шоу/общедоступным дисплеем для клиента, использующего код слайд-шоу от HTML5 Rock. Я столкнулся с DOM Exception 12 — синтаксической ошибкой, которая предположительно связана с селекторами CSS — во время экспериментов с ней... но я не могу отследить ее до каких-либо изменений, которые я внес в код. Я думаю, что это может быть что-то, что было обнаружено, когда я добавлял функции.

Я проследил это до этого объекта (активная версия здесь):

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\'s 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.

Кто-нибудь видел это раньше?


person Isaac Lewis    schedule 06.09.2011    source источник
comment
Вы уверены, что он возвращает массив или может возвращать список узлов?   -  person Mike Samuel    schedule 06.09.2011
comment
DOM Exception 12 является синтаксической ошибкой, например. свойство было установлено неправильно. Я предполагаю, что это ваши прослушиватели событий - то есть их установка. Я думаю, что браузеры, которые не поддерживают полностью addEventListener или не поддерживают такие события, как «touchstart», «touchend» и «popstate», не любят, что вы пытаетесь их слушать. Какой браузер вы использовали кстати?   -  person Alex    schedule 06.09.2011


Ответы (5)


Вы используете недопустимые атрибуты id (незаконные до HTML5) внутри документа, например. 2-slide . Исправьте их.

Объяснить: устранить известную ошибку element.querySelectorAll() селектор .slide будет внутренне переписан (с использованием идентификатора элемента). Это приведет к чему-то вроде этого:

#2-slide .moreselectors

... и вызывает ошибку, потому что идентификатор не может начинаться с числа.

См. скрипт: http://jsfiddle.net/doktormolle/FGWhk/

person Dr.Molle    schedule 06.09.2011
comment
Большое спасибо... такая глупая проблема - я думаю, сейчас 1:00 по моему времени. Был долгий день. Спасибо еще раз! - person Isaac Lewis; 06.09.2011
comment
В HTML5 идентификатор может начинаться с цифры. Если вы хотите выбрать этот элемент на основе на его идентификаторе, вам просто нужно экранировать идентификатор, чтобы он стал действительным идентификатором CSS. Вот инструмент, который сделает это за вас: mothereff.in/css-escapes#02-slide - person Mathias Bynens; 19.06.2014

Если вы пришли сюда после поиска этой ошибки в слайдах HTML5 Rocks:

По какой-то причине они удаляют класс «для сборки» со следующим:

toBuild[0].classList.remove('to-build', '');

Это ломает все слайды, которые использует сборка, даже демоверсия Google прямо сейчас сломана.

Просто измените строку 220 файла default.js на

toBuild[0].classList.remove('to-build');

все хорошо!

person wesbos    schedule 22.01.2013

В моем случае это использовалось self.postMessage(e.data); в основном потоке при использовании веб-воркеров.

Я знаю, что это не связано с проблемой ОП, но это странная ошибка, поэтому я оставляю это здесь в надежде, что это поможет другим.

person Drazisil    schedule 07.08.2013

У меня та же проблема, но в моем случае попробуйте получить элементы из их атрибута.

document.querySelectorAll('input[name="path"]')

и SYNTAX_ERR: Исключение DOM 12 возникало только в Safari. Поэтому я изменил его, чтобы получить элемент непосредственно из класса, и теперь он работает нормально.

person Martino    schedule 30.01.2017

Вы можете избежать кавычек, как в applescript, тогда нет проблем с сафари

do JavaScript "document.querySelector('span[" & attrName & "=\"" & attrValue & "\"]').click();"
person vhanahrni    schedule 11.12.2017