所以,我把我的错误(至少是第一个)缩小到这个函数:
var genArray = function () {
var arr, len, i;
if(arguments.length > 0) {
len = [].slice.call(arguments, 0, 1)[0];
arr = new Array(len);
for(i = 0; i < len; i++) {
arr[i] = genArray.apply(null, [].slice.call(arguments, 1));
}
} else {
return null; //or whatever you want to initialize values to.
}
return arr;
}
然后,我得到了一个非常无益的错误:
error on line 71 at column 23: StartTag: invalid element name
Below is a rendering of the page up to the first error
现在,该功能在第71行显然不(也许它在编译的ePub中,但我不知道它们是如何相关的)。此外,我不知道该错误在JavaScript上下文中意味着什么。此外,此代码在浏览器中可以正常工作(包括Safari)。
任何可能导致问题的想法?
编辑:一时兴起,我通过将[]
更改为Array()
来检查{{1}}是否是问题。没有运气。
答案 0 :(得分:4)
好的,所以我发现了解决问题的方法。我只需要将我的JavaScript包含在CDATA标签中,如下所示:
//<![CDATA[
var genArray = function () {
var arr, len, i;
if(arguments.length > 0) {
len = [].slice.call(arguments, 0, 1)[0];
arr = new Array(len);
for(i = 0; i < len; i++) {
arr[i] = genArray.apply(null, [].slice.call(arguments, 1));
}
} else {
return null; //or whatever you want to initialize values to.
}
return arr;
}
//]]>
我通过使用epubcheck工具发现了这一点,该工具说明文件必须具有正确形成的字符或其他内容。我不记得确切的消息。无论如何,这让我想起了我在脚本中遇到的问题,我使用了一些unicode字符。我记得CDATA解决了它。然后我找到了this stackoverflow问题,基本上说当你的页面必须被解释为XML / XHTML时也是必要的,这就是ePubs的情况。
因此,故事的道德是在ePubs或iBooks的CDATA标签中包装javascript。
编辑:应该注意的是,围绕所有的JavaScript做这件事是值得的。我的问题是<
小于运算符被解释为标记的开头。但是,在所有JavaScript中包含CDATA标记而不是尝试隔离问题的来源可能更简洁。
编辑2:为了将信息汇总给任何认为这个答案有用的人,还应该注意的是,在外部文件中拥有所有的JavaScript也可能有效(根据我在问题的答案中链接的来源)与...相关联。我现在不关心测试这个,但它应该工作,因为外部JavaScript不会被解析为XML,就像在<script>
标记内一样。
答案 1 :(得分:0)
听起来更像是一个XHTML错误。当您在浏览器中运行时如果不将其作为XHTML文件打开,请执行此操作并查看它是否中断。浏览器往往比EPUB读者更宽松。您最有可能使用切片创建某种无效的HTML元素,让整页确切地标识'getArray()'返回的内容会很棒......
答案 2 :(得分:0)
您报告的错误表示XHTML文件来源出错。我想看看,问题是XHTML文件的第71行第23行。什么东西在那里?它可能是<StartTag>
吗?是以某种方式以编程方式生成XHTML吗? EPUB不是“编译”的;它们只是压缩,此行/列信息是指EPUB中XHTML文件中的实际位置。 epubcheck
说什么?
通过脚本创建的任何动态HTML中的问题都会产生 这种错误消息;那些会产生DOMError
。
我的猜测是iBooks在解析时在函数中发现了一些错误,它在XHTML解析完成之前终止了解析过程,并且可以报告XHTML错误。但是,我无法想象错误可能是什么;我怀疑它是函数末尾缺少的分号,但可能取决于下一行的内容。
完全不重要,但
len = [].slice.call(arguments, 0, 1)[0];
与
相同len = arguments[0];