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

iBooks JavaScript Environment - invalid element name

本文关键字:元素 无效 JavaScript 环境 iBooks      更新时间:2023-09-26

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

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(),检查它是否有问题。运气不好。

好的,所以我找到了问题的解决方案。我只需要在CDATA标签中包围我的JavaScript,比如:

//<![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解决了这个问题。然后我发现了这个stackoverflow问题,它基本上说,当你的页面必须被解释为XML/XTML时,这是必要的,ePubs就是这样。

所以,这个故事的寓意是将javascript封装在ePubs或iBooks的CDATA标签中。

编辑:需要注意的是,围绕所有的JavaScript做这件事是值得的。在我的案例中,问题是<less小于运算符被解释为标记的开始。然而,只在所有JavaScript中包含CDATA标记可能会更干净,而不是试图隔离问题的来源。

第2版:为了将信息汇总给任何觉得这个答案有用的人,还应该注意的是,将自己的所有JavaScript都保存在外部文件中可能也有效(根据我链接到的问题答案中链接的来源)。目前我不想对此进行测试,但它应该可以工作,因为外部JavaScript不会像<script>标记中那样被解析为XML。

您报告的错误表明XHTML文件源有错误。我想看看,嗯,XHTML文件的第71行第23列。那里有什么?可能是<StartTag>吗?XHTML是以某种方式通过程序生成的吗?EPUB未"编译";它们只是压缩过的,行/列信息指的是EPUB中XHTML文件中的实际位置。epubcheck说什么?

这种错误消息不会由通过脚本创建的任何动态HTML中的问题生成;这些将导致CCD_ 7。

我的猜测是,iBooks在解析时发现函数中存在一些错误,这将在XHTML解析完成并报告XHTML错误之前终止解析过程。然而,我无法想象这个错误可能是什么;我怀疑这是函数末尾缺少的分号,但可能取决于下一行的内容。

完全是次要的,但

len = [].slice.call(arguments, 0, 1)[0];

与相同

len = arguments[0];

听起来更像是XHTML错误。当您在浏览器中运行时,如果您没有将其作为XHTML文件打开,请执行此操作并查看它是否损坏。浏览器往往比EPUB阅读器更宽容。您很可能正在用切片创建某种无效的HTML元素,最好有完整的页面来准确识别"getArray()"返回的内容。。。