代码之家  ›  专栏  ›  技术社区  ›  Robert Andrews

如何从两个相同的web表单中提交?

  •  2
  • Robert Andrews  · 技术社区  · 6 年前

            <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是否需要唯一?

    无论哪个

    3 回复  |  直到 6 年前
        1
  •  0
  •   Lenny86    6 年前

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


    1. Option 1 Js Fiddle

    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
  •  0
  •   Iguatemi Garin    6 年前

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

    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
  •  0
  •   Jerreck    6 年前

    一审有效是因为 getElementById 只返回元素的一个实例,该实例的id与您传递给它的id相同—如果页面上有多个实例,则只返回第一个实例。

    你可以用 getElementsByName 不需要太多地更改脚本或标记,但是如果其中一个表单没有任何输入,或者可能两个表单都有输入(比如有人输入了两个表单的文本输入),则还需要进行一些额外的验证。看起来让身份证独一无二会更容易更快。

    至于让多个表单执行同一个操作,您可能能做的最干净的事情就是创建一个方法来侦听页面上表单的提交事件并使用它 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>