我正在使用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来处理这种情况。
答案 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。