【问题标题】:How to set a slotted input field's form attribute to a form inside shadow dom?如何将开槽输入字段的表单属性设置为 shadow dom 内的表单?
【发布时间】:2018-12-07 20:59:50
【问题描述】:

我有一个这样的自定义元素:

<my-magic-form>
    #shadowRoot:
    <form id="some_id_name_invisible_to_end_users">
      <input disabled name="entry_id"></input>
      <slot name="fields_toFill"></slot>
    </form>
</my-magic-form>

我的小部件的用户应该像这样添加自己的输入字段:

<my-magic-form>
  <input slot="fields_toFill" value="some_value1"/>
  <textarea slot="fields_toFill"/>
</my-magic-form>

我的问题是:如何将这两个开槽的&lt;input&gt;&lt;textarea&gt; 控件链接到我的小部件的影子DOM 内的&lt;form&gt; 元素?最终用户不需要知道我的widget的内部表单的id,所以他们在创作时不能设置form属性;我已经尝试以编程方式设置此属性,但发现此属性是只读的!

【问题讨论】:

    标签: javascript forms web-component shadow-dom


    【解决方案1】:

    一个简单的解决方案是将 light DOM 移动到 Shadow DOM 内容中。 监听slotchange 事件,然后将assignedNodes() 移到&lt;slot&gt; 元素之前。

    var form = this.shadowRoot.querySelector( 'form' )
    var slot = this.shadowRoot.querySelector( 'slot' )
    
    slot.addEventListener( 'slotchange', () => {
        for (var field of slot.assignedNodes()) {
            form.insertBefore( field, slot ) 
        } 
    } )
    

    或者,如果您不想移动轻量级 DOM 字段,则应将它们复制为 &lt;input type="hidden"&gt; 字段,例如提交 &lt;form&gt; 时。

    【讨论】:

    • 谢谢。这样的蛮力突破光影界限有什么潜在的弊端吗?我希望有更优雅的方式?
    • 取决于用例。更优雅的方式是替代方式
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 2013-06-08
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多