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(). 没运气。

4

3 回答 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 解决了它。然后我发现了这个stackoverflow问题,它基本上说当你的页面也必须被解释为XML/XHTML时是必要的,ePubs就是这种情况。

因此,这个故事的寓意是在 ePubs 或 iBooks 的 CDATA 标记中包装 javascript。

编辑:应该注意的是,围绕你的所有JavaScript 都值得这样做。我的问题是<小于运算符被解释为标签的开头。但是,在所有 JavaScript 中都包含 CDATA 标记可能比尝试隔离问题的来源更简洁。

编辑 2:为了将信息汇总给任何认为此答案有用的人,还应注意,将所有 JavaScript 放在外部文件中也可能有效(根据我已链接到的问题的答案中链接的源代码) )。我现在不想测试它,但它应该可以工作,因为外部 JavaScript 不会像在<script>标签内那样被解析为 XML。

于 2013-06-26T20:09:18.653 回答
0

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

于 2013-06-26T14:16:36.447 回答
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];
于 2013-06-26T19:17:34.987 回答