iBooks JavaScript环境 - 无效的元素名称

3

所以,我已经将我的错误缩小了(至少是第一个错误)到这个函数:

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(),但没有任何效果。
3个回答

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的情况。

因此,故事的寓意是将javascript用CDATA标签包装起来,以适用于ePubs或iBooks。

编辑:值得注意的是,最好在所有的JavaScript周围都这样做。在我的情况下,问题出在小于号操作符<被解释为标签的开始。然而,只需在所有JavaScript周围包含CDATA标记可能更加清晰。

编辑2:为了汇总信息,让这个答案对找到它有用的人更有用,还应该注意将所有JavaScript放在外部文件中也可能有效(根据我链接的问题的答案中链接的来源)。 我现在不想测试这个,但它应该有效,因为外部JavaScript不会像在<script>标签内部那样被解析为XML。


1
将你的JS放在外部文件中不仅“可能也能工作”,而且强烈建议这样做。 - user663031
1
+1。哈哈,我保证这只是普通的网页开发。:) 我只是想快速验证一下概念,而不必在学习ePub结构时处理清单。 - Logan

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];

好的。我稍后阅读了一些有关ePub格式的内容,并发现它们是zip文件。出于某种奇怪的原因,我从未想过重新打开文件并查看它所指的行。然而,这并没有什么帮助。for(i = 0; i < len; i++) {就是问题所在的确切行。具体来说,< len是它所指的内容,因为第23列紧随其后的是< - Logan

0
听起来更像是XHTML错误。如果您在浏览器中运行时没有将其作为XHTML文件打开,请这样做并查看是否会出现错误。浏览器往往比EPUB阅读器更宽容。您很可能正在使用切片创建某种无效的HTML元素,最好拥有完整页面以准确确定“getArray()”返回的内容...


genArray 返回一个具有参数维度的数组。例如,genArray(64,64) 返回一个 64x64 的数组。因此,该函数实际上并不返回一个“元素”。我同意这听起来更像是一个 XHTML 错误,但是删除这个函数声明(即使它没有被调用)可以修复错误。不幸的是,我需要这个函数。 - Logan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接