微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Web组件自定义元素表单元素提交

如何解决Web组件自定义元素表单元素提交

我正在处理仅由自定义元素构成的表单。当我点击按钮时,应该提交表格。自定义元素之间的通讯存在一些问题。当我单击该按钮时,它调用表单提交,但未调用onsubmit函数,但确实出现了警报。你能帮我吗?

    <form-element action="" method="POST">
        <textfield-element name="number" validation="[0-9]+"> </textfield-element>
        <textfield-element name="subject"> </textfield-element> 
        <button-element> Send </button-element>
 element</button> -->
    </form-element>
class ButtonElement extends HTMLElement {
    constructor() {
        super();

        this.onclick = () => {
            const form = this.closest('form');
            form.submit();
        }
    }
}

window.customElements.define('button-element',ButtonElement)
class FormElement extends HTMLElement {
    constructor() {
        super();

        this.formNode = this.shadowRoot.querySelector('form')

        for (let i = 0; i < this.childNodes.length; i++) {
            if(this.childNodes[i].localName === 'textfield-element' || this.childNodes[i].localName === 'button-element'){
                this.formNode.appendChild(this.childNodes[i])
            }
        }
        this.onsubmit = () => {
            alert('hey')
        }

    }
}

window.customElements.define('form-element',FormElement)

解决方法

您是否要在<form>的影子DOM中找到一个<form-element> this.closest('form');?您必须执行类似this.closest('form-element').shadowDOM.querySelector('form')的操作。 除此之外,您还可以在表单上调用submit()。我不喜欢这种解决方案,因为以编程方式提交时,表单不会发出SubmitEvent。作为使用您的组件的开发人员,我希望表单能够发出该事件。我认为不使用它是一个非常严重的限制,并且可能很难弄清。

查询表单以调用submit()是我所知道的3个解决方案之一。 最明显的方法是在<button type="submit">内使用<button-element>,但不能使用影子DOM,这会阻止click事件到达表单。我见过的另一种解决方案很笨拙:单击<button-element>时,在影子DOM之外创建一个按钮,以编程方式单击它并将其删除。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。