1

我正在尝试序列化一些具有自定义属性(例如 id)的文本节点,这些属性需要以序列化形式保留。

通过查看此页面,看起来最好的方法可能是使用包含自定义属性的特殊标记来包装每个 Text 元素。例如:

<P>some text</P>

可能序列化为:

<P><custom-text id='node27'>some text</custom-text></P>

当然,当我反序列化时,我可以通过并获取“自定义文本”标签的所有实例,并手动将每个实例替换为具有自定义属性的文本节点。但是我读到可以为标签创建一个自定义构造函数,这让我相信我可以在解析阶段自动完成这个转换,这样就不需要在完成后重新编写文档。

但是,我对如何做到这一点有点模糊。我可以将原型指定为 的第二个参数document.registerElement,所以我想我只需将原型设置为创建一个 Text 节点,并使用一个 getter 和一个 setter 来处理自定义 id 属性:

var textId = document.registerElement('custom-text', {
    prototype: Object.create(Text.prototype, {
        id: {
            get: function() { return this.id; },
            set: function(value) { this.id = value }
        }
    })
});

但是当custom-text标签被解析时,它不会创建一个文本节点,它会创建一个 HTML 节点。我正在使用 Chrome 33,并且registerElement存在于document对象中,这应该是我需要检查的全部内容。我会尝试创建一个包装 Object.create 调用的函数,以尝试发出警报或其他东西以查看它是否被击中,但我没有看到有关原型的值应该在任何地方的文档。

4

1 回答 1

1

您的自定义元素应基于 HTMLElement 原型(或 HTMLSpanElement 原型):

var textId = document.registerElement('custom-text', {
    prototype: Object.create(HTMLElement.prototype)
    })
})

无需添加 Id 属性,因为它已经存在。

于 2015-07-31T14:02:22.610 回答