Должен ли атрибут 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 будет возвращен как ноль.