脚本标记的src属性应该为null还是空字符串(如果缺少)?

时间:2012-09-27 08:24:15

标签: javascript firefox standards princexml

我正在使用PrinceXML制作一些HTML的PDF,其中包含一些MathJax标记。为了正确渲染数学,处理数学渲染的javascript需要在转换为PDF之前在页面上运行。

如果我在PrinceXML中启用javascript并尝试加载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中完成时(参见小提琴:http://jsfiddle.net/9ZHMR/),element.src在缺少src属性时返回空字符串,因此在浏览器中工作时我没有看到此问题。

哪种行为是'正确的' - 如果脚本元素的src属性为null,或者如果该属性不存在则为空字符串?这是真实生活与标准的对比吗?

编辑我主要感谢这个行为是否由某个地方的标准指定,所以我知道是否要向Firefox或PrinceXML发布错误报告,或者如果没有标准,请发布一个错误报告MathJax来处理这种情况。

3 个答案:

答案 0 :(得分:1)

这取决于HtmlScriptElement的具体实施。如果特定实现具有预定义为空字符串的src属性,因为在FireFox中似乎是这种情况,那么src将作为空字符串返回。如果最初定义为null,则src将返回null。

答案 1 :(得分:1)

你可以通过这个小修改来避免错误,它在使用前检查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”。

答案 2 :(得分:1)

http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#the-script-element的规范说:

 attribute DOMString src;

这不是可以为空的字符串返回值,因此规范不允许从.src返回null。