Должен ли атрибут src тега скрипта быть нулевым или пустая строка, если отсутствует?

Я использую PrinceXML, чтобы сделать несколько PDF-файлов из HTML, который включает в себя некоторую разметку MathJax. Чтобы правильно отобразить математику, Javascript, обрабатывающий математический рендеринг, должен быть запущен на странице перед преобразованием в PDF.

Если я включаю javascript в PrinceXML и пытаюсь загрузить библиотеку MathJax, я получаю "TypeError: значение null не является объектом" в коде инициализации. Отслеживая это, оказывается, что следующее вызывает ошибку:

var scripts = (document.documentElement || document).getElementsByTagName("script");
var namePattern = new RegExp("(^|/)"+BASENAME+"\\.js(\\?.*)?$");
for (var i = scripts.length-1; i >= 0; i--) {
if (scripts[i].src.match(namePattern)) { // <--- Error thrown here
  STARTUP.script = scripts[i].innerHTML;
  if (RegExp.$2) {
    <etc...>

Ошибка генерируется в элементе сценария без атрибута src (MathJax использует элементы сценария для хранения кода LaTeX). PrinceXML, по-видимому, обрабатывает отсутствующие атрибуты src, возвращая null при доступе к отсутствующему атрибуту src - следовательно scripts[i].src.match(namePattern) выдает ошибку как src нулевой. Однако, когда это делается в Firefox (см. Fiddle: http://jsfiddle.net/9ZHMR/), element.src возвращает пустую строку, когда атрибут src отсутствует, и поэтому я не видел этой проблемы при работе в браузере.

Какое поведение является "правильным" - должен ли атрибут src элемента script быть нулевым или пустой строкой, если атрибут не существует? Это случай из реальной жизни против стандартов?

РЕДАКТИРОВАТЬ Меня в первую очередь интересует, определяется ли это поведение стандартом где-то, поэтому я знаю, следует ли публиковать отчет об ошибках в Firefox или PrinceXML или, если стандарта нет, публиковать отчет об ошибках в MathJax для обработки этого случая.

3 ответа

Решение

Спецификация на http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html гласит:

 attribute DOMString src;

Это не обнуляемое возвращаемое значение строки, поэтому возвращение нулевого значения из.src не допускается спецификацией.

Вы могли бы, вероятно, избежать ошибки с этой незначительной поправкой, которая проверяет src перед его использованием:

if (scripts[i].src && scripts[i].src.match(namePattern)) {
    ...

Или длинная рука...

if (scripts[i].src) {
    if (scripts[i].src.match(namePattern)) {
        ...

Если scripts[i].src имеет значение null, он будет оцениваться как "falsey".

Это зависит от конкретной реализации для HtmlScriptElement. Если конкретная реализация имеет атрибут src, предопределенный как пустую строку, как это имеет место в FireFox, тогда src будет возвращен как пустая строка. Если он изначально определен как ноль, то src будет возвращен как ноль.

Другие вопросы по тегам