【问题标题】:How to submit from either of two identical web forms?如何从两个相同的 Web 表单中的任何一个提交?
【发布时间】:2018-10-05 16:03:44
【问题描述】:

我在同一页面上使用了以下简单表单两次...

        <form>
          <div class="input-group input-group-lg mb-3 p-2 bg-warning rounded">
            <input type="text" class="form-control" placeholder="My company name" aria-label="My company name" aria-describedby="basic-addon2" id="mycompany">
            <div class="input-group-append">
              <button class="btn btn-primary btn-lg" type="button" id="mybutton">Get started!</button>
            </div>
          </div>
        </form>

以下 JavaScript 抓取文本输入并使用它为我们发送给用户的 URL 形成 URL 参数...

  <script>
    document.getElementById('mybutton').addEventListener(
      "click", function(){
        const inputValue = document.getElementById('mycompany').value;
        window.open("https://airtable.com/myformidgoeshere?prefill_Company=" + encodeURIComponent(inputValue));
      }
    )
  </script>

我学到了这么多。 它适用于第一个表单实例 - 但不是第二个。

问题是,如何保证任何一个的小表格都能产生同样的效果?

文本输入和按钮的 id 是否需要唯一?

而且,无论哪种方式,相同的 JavaScript 函数如何处理提交的任何一个表单的窗口打开?

【问题讨论】:

    标签: javascript forms window.open


    【解决方案1】:

    The id global attribute defines a unique identifier (ID) which must be unique in the whole document


    1. Option 1 Js Fiddle。更改 ID,使它们在文档中变得唯一(示例 id="mybutton1", id="mybutton2" 与“mycompany”相同) 并为每个按钮分别添加事件侦听器。将回调函数定义为全局函数,并在每个按钮上调用它。

    function newWindow(inputArea) { //pass input field ID as argument
        const inputValue = document.getElementById(inputArea).value;
        window.open("https://airtable.com/myformidgoeshere?prefill_Company=" + encodeURIComponent(inputValue));
    }
    
    document.getElementById('mybutton1').addEventListener('click', newWindow.bind(this, 'mycompany1', false));
    document.getElementById('mybutton2').addEventListener('click', newWindow.bind(this, 'mycompany2', false));
    

    1. Option 2 Js fiddle。将 ID 替换为类并遍历表单。

    <form>
    <div class="input-group input-group-lg mb-3 p-2 bg-warning rounded form">
        <input type="text" class="form-control" placeholder="My company name" aria-label="My company name" aria-describedby="basic-addon2">
        <div class="input-group-append">
            <button class="btn btn-primary btn-lg mybutton" type="button">Get started!</button>
        </div>
    </div></form>
    

    //get DOM elements and return an array
    let form = [].slice.call(document.querySelectorAll('.form'));
    
    //loop through each form
    form.forEach(e => {
        function openWindow() {
            let inputField = e.querySelector('.form-control').value;
            window.open("https://airtable.com/myformidgoeshere?prefill_Company=" + encodeURIComponent(inputField));
        }
        e.querySelector('.mybutton').addEventListener("click", openWindow)
    })
    

    【讨论】:

      【解决方案2】:

      是的,您必须使用唯一的按钮 ID 来捕获每个事件。

      下面我建议另一种方法,使用 querySelctors 来遍历 DOM。

      document.querySelectorAll('form') // loop each form
        .forEach(form => form.querySelector('#mybutton').addEventListener('click', (e) => { //add the vent to the corresponding form button
          const inputValue = form.querySelector('#mycompany').value
          window.open("https://airtable.com/myformidgoeshere?prefill_Company=" + encodeURIComponent(inputValue));
        }))
      <form>
        <div class="input-group input-group-lg mb-3 p-2 bg-warning rounded">
          <input type="text" class="form-control" placeholder="My company name" aria-label="My company name" aria-describedby="basic-addon2" id="mycompany">
          <div class="input-group-append">
            <button class="btn btn-primary btn-lg" type="button" id="mybutton">Get started!</button>
          </div>
        </div>
      </form>
      
      <form>
        <div class="input-group input-group-lg mb-3 p-2 bg-warning rounded">
          <input type="text" class="form-control" placeholder="My company name" aria-label="My company name" aria-describedby="basic-addon2" id="mycompany">
          <div class="input-group-append">
            <button class="btn btn-primary btn-lg" type="button" id="mybutton">Get started!</button>
          </div>
        </div>
      </form>

      【讨论】:

        【解决方案3】:

        它适用于第一个实例,因为getElementById 仅返回具有您传递给它的 id 的元素的单个实例 - 如果页面上有多个实例,它仅返回第一个实例。

        正如您所建议的,您可以使 id 独一无二,这可能是我将做的快速简便的解决方案。

        您可以改用getElementsByName,而无需过多更改脚本或标记,但是您还必须对其中一个表单没有任何输入以及是否可能两者都有任何输入进行一些额外的验证输入(例如,如果有人输入了两种形式的文本输入)。似乎使 id 独一无二会更容易和更快。

        就让多个表单执行相同的操作而言,您可以做的最简洁的事情可能是创建一个方法来侦听页面上表单的提交事件并使用event.target.elements['elementName'] 按名称获取特定输入.像这样的:

        <form>
            <div class="input-group input-group-lg mb-3 p-2 bg-warning rounded">
                <input type="text" class="form-control" placeholder="My company name" aria-label="My company name"
                    aria-describedby="basic-addon2" name="mycompany">
                <div class="input-group-append">
                    <input class="btn btn-primary btn-lg" type="submit" name="mybutton">Get started!</button>
                </div>
            </div>
        </form>
        
        <form>
            <div class="input-group input-group-lg mb-3 p-2 bg-warning rounded">
                <input type="text" class="form-control" placeholder="My company name" aria-label="My company name"
                    aria-describedby="basic-addon2" name="mycompany">
                <div class="input-group-append">
                    <input class="btn btn-primary btn-lg" type="submit" name="mybutton">Get started!</button>
                </div>
            </div>
        </form>
        
        <script>
            document.addEventListener("submit", function(e) {
                e.preventDefault();
                const inputValue = e.target.elements['mycompany'].value;
                window.open("https://airtable.com/myformidgoeshere?prefill_Company=" + encodeURIComponent(inputValue));
            }, false);
        </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-03
          • 1970-01-01
          • 2016-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多