我正在尝试创建一个可以在表单元素中使用的 Web 组件,该组件具有 name
和 value
。我知道可以创建一个扩展了 HTMLInputElement
的 Web 组件:
<input is="very-extended">
但我正在尝试创建一个全新的元素。
创建普通 web 组件时,您可以从常规 HTMLElement
(HTMLElement.prototype
) 的原型中创建它。这让我认为我可以使用 HTMLInputElement
(HTMLInputElement.prototype
) 的原型创建不同的元素。实际上,您在扩展输入元素的 API 时使用了该原型,那么为什么我不能使用该原型来创建完全适用于表单的新元素?
如果您查看常规输入字段的阴影 DOM:
您会发现里面有一个 div。我理解这个 HTMLInputElement
有方法和属性、getter/setter 等等。那么当我尝试创建我的组件时,为什么它无法成为表单中找到的名称-值对的一部分呢?
以下是我尝试创建此 Web 组件的示例:
请注意,这应在支持 Web 组件的浏览器中进行测试。
(function() {
var iconDoc = (document._currentScript || document.currentScript).ownerDocument;
var objectPrototype = Object.create(HTMLInputElement.prototype);
Object.defineProperty(objectPrototype, 'name', {
writable: true
});
Object.defineProperty(objectPrototype, 'value', {
writable: true
});
objectPrototype.createdCallback = function() {
var shadow = this.createShadowRoot();
var template = iconDoc.querySelector('#test');
shadow.appendChild(template.content.cloneNode(true));
};
document.registerElement('custom-input', {
prototype: objectPrototype
});
})();
console.log(
$('form').serialize()
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<template id="test">
<div>This is a special input</div>
</template>
<form>
<input name="regular" value="input">
<custom-input name="foo" value="bar"></custom-input>
</form>
extends: input
,你仍然无法添加到输入框的shadow DOM中。这似乎非常有限制性。如果你想要向DOM中添加东西,似乎没有选择余地。 - Walt无法在已经托管用户代理阴影树的主机上创建阴影根
。 - Walt