代码之家  ›  专栏  ›  技术社区  ›  almailer

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

  •  1
  • almailer  · 技术社区  · 13 年前

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

    如果我在PrinceXML中启用javascript并尝试加载MathJax库,我会在初始化代码中得到一个“TypeError:null-value is not a object”。追踪到这一点,发现以下原因导致了错误:

    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 为null。然而,当在Firefox中完成时(请参阅fiddle: http://jsfiddle.net/9ZHMR/ )当src属性丢失时,element.src返回空字符串,所以我在浏览器中工作时没有看到这个问题。

    哪种行为是“正确的”-如果脚本元素的src属性不存在,它应该是null还是空字符串?这是现实生活中与标准之间的对比吗?

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

    3 回复  |  直到 5 年前
        1
  •  1
  •   Boris Zbarsky    13 年前

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

     attribute DOMString src;
    

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

        2
  •  1
  •   Konstantin Dinev    13 年前

    这取决于 HtmlScriptElement 。如果特定实现将src属性预定义为空字符串,就像FireFox中的情况一样,则src将作为空字符串返回。如果它最初被定义为null,那么src将被返回为null。

        3
  •  1
  •   Fenton    13 年前

    你可以通过这个小的修改来避免这个错误,它在使用src之前会检查它:

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

    或者长手。。。

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

    如果scripts[i].src为null,则其计算结果为“false”。

    推荐文章