iBooks JavaScript环境-无效的元素名称
iBooks JavaScript Environment - invalid element name
所以,我已经将我的错误(好吧,至少是第一个)缩小到这个函数:
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()"返回的内容。。。
- ReactJS - 元素类型无效错误
- 输入元素模式属性的Javascript正则表达式在reFiddle上有效,但在页面上无效
- 未捕获错误:不变冲突:元素类型无效:应为字符串
- 未捕获的不变冲突:元素类型无效(react、webpack、循环导入)
- addClass”;输入无效”;输入dos't显示,直到我在输入元素外部单击为止
- React:未捕获的不变量冲突:ReactDOM.render():无效的组件元素
- ReactJS的dropzone元素无效
- 函数调用者无效元素
- 未捕获的语法错误:无法在“元素”上设置“innerHTML”属性:提供的标记是无效的 XML
- 脚本 600:此操作的目标元素无效.(仅限 IE)
- TinyMCE没有阻止无效元素
- 显示:元素的none/block在Firefox中有效,在Safari或Chrome中无效
- 在IE中使用.innerHTML添加选项元素无效
- 追加到空元素无效
- jQuery-更改时多选元素无效
- IE 9出错-'SCRIPT600:此操作的目标元素无效
- SCRIPT 600错误:此操作的目标元素无效
- 通过id获取元素无效
- 使用正则表达式替换数组中的匹配元素:无效字符
- jQuery height()函数对元素无效