【问题标题】:iBooks JavaScript Environment - invalid element nameiBooks JavaScript 环境 - 无效的元素名称
【发布时间】:2013-06-25 23:48:59
【问题描述】:

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

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() 来检查问题是否存在。没有运气。

【问题讨论】:

    标签: javascript epub ibooks epub3


    【解决方案1】:

    好的,所以我找到了解决问题的方法。我只需要将我的 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。

    编辑:应该注意的是,围绕你的 all JavaScript 执行此操作是值得的。我的问题是 &lt; 小于运算符被解释为标签的开头。但是,在所有 JavaScript 中都包含 CDATA 标记可能更简洁,而不是尝试隔离问题的根源。

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

    【讨论】:

    • 将您的 JS 放入外部文件中不仅“可能也可以工作”,强烈建议这样做。
    • +1。大声笑我保证我这样做是为了正常的网络开发。 :) 在学习 ePub 的结构时,我只是想要一个快速的概念证明,而不需要处理清单。
    【解决方案2】:

    您报告的错误表明 XHTML 文件 source 有错误。我会看一下,呃,有问题的 XHTML 文件的第 71 行第 23 列。什么东西在那里?会不会是&lt;StartTag&gt;? 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 &lt; len; i++) { 是有问题的确切行。具体来说,&lt; len 就是它它所指的第 23 列就在 &lt; 之后。
    【解决方案3】:

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

    【讨论】:

    • genArray 返回一个包含参数维度的数组。即,genArray(64,64) 返回一个 64x64 数组。因此,这个函数实际上并不返回一个“元素”。我同意这听起来更像是一个 XHTML 错误,但是去掉这个函数声明(即使它没有被调用)修复了这个错误。不幸的是,我需要这个功能。
    猜你喜欢
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 2022-11-04
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多