1

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

如果我在 PrinceXML 中启用 javascript 并尝试加载 MathJax 库,我会在初始化代码中得到“TypeError:null value is not an 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 属性 - 因此会像nullscripts[i].src.match(namePattern)一样抛出错误。src但是,当在 Firefox 中完成时(参见小提琴: http: //jsfiddle.net/9ZHMR/),当缺少 src 属性时 element.src 返回空字符串,因此在浏览器中工作时我没有看到这个问题。

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

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

4

3 回答 3

1

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

于 2012-09-27T08:30:25.363 回答
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”。

于 2012-09-27T08:33:03.123 回答
1

The spec at http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#the-script-element says:

 attribute DOMString src;

That's not a nullable string return value, so returning null from .src is not allowed by the spec.

于 2012-09-28T04:34:23.920 回答