我正在尝试创建一个可在表单元素中使用的 Web 组件,该组件具有name
和value
. 我认识到我可以创建一个 Webextends
组件HTMLInputElement
:
<input is="very-extended">
但我正在尝试创建一个全新的元素。
创建常规 Web 组件时,您可以从常规HTMLElement
( HTMLElement.prototype
) 的原型创建它。这使我假设我可以使用HTMLInputElement
( HTMLInputElement.prototype
) 的原型创建不同的元素。您实际上extending
在输入元素的 API 时使用了该原型,那么为什么我不能使用该原型来创建一个在表单中工作的全新元素呢?
如果您查看常规输入字段的 shadow 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>
为什么在表单中找不到名称、值对,如何创建自定义表单元素?