iBooks JavaScript环境 - 元素名称无效

时间:2013-06-25 23:48:59

标签: javascript epub ibooks epub3

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

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}}是否是问题。没有运气。

3 个答案:

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