我正在尝试使用 jquery 在 div 中注入以下跨度。
HTML:
<span epub:type="pagebreak" id="pagePrefix" title="1"></span>
JS:
$('div').html('<span epub:type="pagebreak" id="pagePrefix" title="1"></span>');
并得到以下错误,SyntaxError: DOM Exception 12
有什么解决方法吗?
我正在尝试使用 jquery 在 div 中注入以下跨度。
HTML:
<span epub:type="pagebreak" id="pagePrefix" title="1"></span>
JS:
$('div').html('<span epub:type="pagebreak" id="pagePrefix" title="1"></span>');
并得到以下错误,SyntaxError: DOM Exception 12
有什么解决方法吗?
当您将innerHTML
序列化的 DOM 节点传递给$('div').html()
. 只要您DOCTYPE
是html
. 但是,DOCTYPE
您的序列化 DOM 节点在插入文档之前xhtml
必须清除一些额外的情况。根据W3.org,包含Attr
节点、Text
节点、CDATASection
节点、Comment
节点或ProcessingInstruction
节点的序列化 DOM 节点,其数据包含与 XML Char 产品不匹配的字符(包括 U+003A COLON “:”)必须引发INVALID_STATE_ERR
异常。
W3还指定了用户代理在 XML(XHTML) 上下文中设置innerHTML
DOM 属性HTMLElements
时必须运行的算法。HTMLDocuments
该算法的第 2 步是:
如果
innerHTML
在一个元素上设置属性,用户代理必须向刚刚创建的解析器提供与该元素的开始标记相对应的字符串,声明 DOM 中该元素范围内的所有命名空间前缀,以及声明DOM 中该元素范围内的默认命名空间(如果有)。
用户代理不知道您已epub
在父元素上指定命名空间,因为当前上下文位于根上下文之外。因此,您需要在追加到 DOM 时为序列化的 DOM 节点指定命名空间。
$('div').html('<span xmlns:epub="http://www.idpf.org/2007/ops"
epub:type="pagebreak" id="pagePrefix" title="1"></span>');
转义冒号:
$('div').html('<span epub\:type="pagebreak" id="pagePrefix" title="1"></span>');
$('div').append('<span />').attr('epub\:type', 'pagebreak').attr('id', 'pagePrefix').attr('title', '1');