【问题标题】:How to access html form values from nested inputs如何从嵌套输入中访问 html 表单值
【发布时间】:2018-03-08 05:09:29
【问题描述】:

我正在尝试验证来自此表单的输入:

        <form id = "mpath" name = "mpath" action = './../cgitest.cgi' method="POST" onsubmit = "return validateForm(this)">

            Total Time (in ms): <input type = "text" name = "ttime">
            Number of Cars (1-10): <input type = "text" name = "carnum">
            Initial Speed (fps): <input type = "text" name = "initspeed"><br>

            <!--extraRowTemplate will be repeated for every change in the accleration of the
                head car -->
            <p class = "extraRowTemplate" name = "extraRowTemplate">
                Change:
                <select name="change">
                <option value="acc">Acceleration</option>
                <option value="dec">Deceleration</option>
                </select>

                Start time: <input type = "text" name="starttime">
                End time: <input type = "text" name="endtime">
                Amount (in fps): <input type = "text" name="amount"><br>
            </p>

            <div id = 'container'></div>

            <a href="#" id = "addRow"><i class="icon-plus-sign"></i>Add Change</a><br>

            <input type="submit" value="Load Head Car">
        </form>

使用这个函数(我还没有写任何实际的验证):

<script type="text/javascript">
        function validateForm(form){

            var tt = document.forms[0].ttime.value;
            var cn = document.forms[0].carnum.value;
            var is = document.forms[0].initspeed.value;
            var sta = form.elements[4].value;

            console.log(tt);
            console.log(cn);
            console.log(is);
            console.log(sta);


            if(tt == ""){
                alert("starttime must be filled out");
                return false;
            }

            //return false;
        }
    </script>

但是当我尝试提交值时,它只找到 ttime、carnum 和 initspeed 的值,而不是 starttime、endtime 或 amount 的值。此外,即使我将其设置为“减速”,更改的值也始终为“加速”。

对于那些想知道我为什么不简单地删除 extraRowTemplate 的人,我需要将这些输入选项放在一个嵌套部分中,因为我可以选择复制它们。

我尝试将表单作为参数传递给函数(如图所示),并且只使用 document.forms[0] 来访问它。都不会产生正确的结果。

另外,当我从 form.elements[4].value 中删除 .value 并设置时:

var sta = form.elements[4]; 

控制台打印出来:

 <input type = "text" name = "starttime">

有人知道我如何访问嵌套输入的值吗?

我想我还应该说该表单以其他方式正常工作,当我将它发送到 cgitest.cgi 时,我可以访问所有输入。我只是不想验证服务器端的输入。

编辑:

如果不使用 onsubmit 函数(在我的例子中为 validateForm),我使用事件监听器:

<script type="text/javascript">
        var button = document.querySelector('input[type=submit]')

        button.addEventListener('click', function onClick(event) {
          var ttime = document.querySelector('input[name=ttime]')
          var carnum = document.querySelector('input[name=carnum]')
          var initspeed = document.querySelector('input[name=initspeed]')
          var change = document.querySelector('select[name=change]')
          var starttime = document.querySelector('input[name=starttime]')
          var endtime = document.querySelector('input[name=endtime]')
          var amount = document.querySelector('input[name=amount]')

          console.info('ttime', ttime.value)
          console.info('carnum', carnum.value)
          console.info('initspeed', initspeed.value)
          console.info('change', change.value)
          console.info('starttime', starttime.value)
          console.info('endtime', endtime.value)
          console.info('amount', amount.value)

          event.preventDefault()
        })
    </script>

输入 ttime = 1, carnum = 2, initspeed = 3, change = "acc", starttime = 4, endtime = 5, amount = 6,我得到以下控制台输出:

(index):70 ttime 1
(index):71 carnum 2
(index):72 initspeed 3
(index):73 change acc
(index):74 starttime 
(index):75 endtime 
(index):76 amount 

可以看出,除了 initspeed 之外的所有值(extraRowTemplate 中的所有内容)都是空的。就像我之前说的,它们在发送到表单操作 url 时不是空的。

【问题讨论】:

  • 您可以使用 HTML5 的 required 属性保存一些代码。

标签: javascript html forms


【解决方案1】:

您能否尝试删除extraRowTemplate 并提交。如果它工作正常,那么您可以尝试使用不同的 id 在里面生成元素,因为现在您有重复的项目,没有区别。

【讨论】:

    【解决方案2】:

    您目前正在使用document.forms[0]. 以一种迂回的方式访问元素,而且我没有看到任何代码来获取starttime 输入的值。您正在if 中测试tt,但它被分配了ttime 的值。

    document.querySelector

    我可以建议使用document.querySelector 直接按名称访问表单元素吗?此方法接受 CSS 选择器并返回匹配的第一个元素。使用简单的 CSS3 选择器,我们可以按名称选择元素,并假设这些名称在页面上是唯一的,我们将获得正确的输入。如果名称仅在表单中是唯一的,您也可以使用 form.querySelector。

    示例

    var myInput = document.querySelector('input[name=ttime]')
    

    我发现document.querySelector 和document.querySelectorAll(获取与 CSS 选择器匹配的所有元素)非常有用,并且一直在使用它们。

    可运行代码sn-p

    运行这个 sn-p 并按下表单提交按钮以打印输入的值。尝试一下,看看它是如何工作的。

    var button = document.querySelector('input[type=submit]')
    
    button.addEventListener('click', function onClick(event) {
      var ttime = document.querySelector('input[name=ttime]')
      var carnum = document.querySelector('input[name=carnum]')
      var initspeed = document.querySelector('input[name=initspeed]')
      var change = document.querySelector('select[name=change]')
      var starttime = document.querySelector('input[name=starttime]')
      var endtime = document.querySelector('input[name=endtime]')
      var amount = document.querySelector('input[name=amount]')
    
      console.info('ttime', ttime.value)
      console.info('carnum', carnum.value)
      console.info('initspeed', initspeed.value)
      console.info('change', change.value)
      console.info('starttime', starttime.value)
      console.info('endtime', endtime.value)
      console.info('amount', amount.value)
      
      event.preventDefault()
    })
    <form id = "mpath" name = "mpath" action = './../cgitest.cgi' method="POST" onsubmit = "return validateForm(this)">
    
                Total Time (in ms): <input type = "text" name = "ttime">
                Number of Cars (1-10): <input type = "text" name = "carnum">
                Initial Speed (fps): <input type = "text" name = "initspeed"><br>
    
                <!--extraRowTemplate will be repeated for every change in the accleration of the
                    head car -->
                <p class = "extraRowTemplate" name = "extraRowTemplate">
                    Change:
                    <select name="change">
                    <option value="acc">Acceleration</option>
                    <option value="dec">Deceleration</option>
                    </select>
    
                    Start time: <input type = "text" name="starttime">
                    End time: <input type = "text" name="endtime">
                    Amount (in fps): <input type = "text" name="amount"><br>
                </p>
    
                <div id = 'container'></div>
    
                <a href="#" id = "addRow"><i class="icon-plus-sign"></i>Add Change</a><br>
    
                <input type="submit" value="Load Head Car">
            </form>

    【讨论】:

    • 我用了querySelector,还是有一些问题:
    • 抱歉,我点击进入太快了。我使用了 querySelector,但仍然存在一些问题:当我简单地将您提供的代码放在我的页面上时,控制台会在我单击提交时打印所有输入的值。但是,当我在 validateForm 函数中使用它们时,仍然没有给出嵌套输入的值(而 ttime、carnum 和 initspeed 是)。我需要将它们放在 validateForm 函数中,因为如果输入无效,我不希望表单操作发生。
    • 也许编辑您的问题以添加不适合您的实际代码的更完整示例可能会有所帮助。就目前而言,我无法真正理解问题所在。
    • 我根据您的建议编辑了我的问题和代码,但我遇到了与我最初遇到的问题相同的问题。我可能只是删除 extraRowTemplate 并以另一种方式复制输入字段。
    • @J.Page 实际上你的编辑并没有澄清......你说 可以看出,除了 initspeed 之外的所有值(extraRowTemplate 中的所有内容)都是空的。 但它不能可见,因为您的代码 sn-p 不可运行。 Use the insert code snippet button to make a runnable snippet... 我敢打赌它会表明实际上,这些值打印得很好。顺便说一句,如果答案对您有帮助,请点赞。
    【解决方案3】:

    我可以使用任一方法访问 Firefox/Chrome/Opera 中“开始时间”字段的值

    var sta = document.forms[0][4].value
    

    或

    var sta = document.forms[0].starttime.value
    

    【讨论】:

    • 这两个选项都不适合我。我只能使用该符号访问 extraRowTemplate 之外的字段。
    【解决方案4】:

    我能够弄清楚出了什么问题。在我的CSS中我设置:

    .extraRowTemplate {
         display: none;
    }
    

    这阻止了输入值的发送。一旦我删除了这个,我的问题就消失了。设置“可见性:隐藏”是一个很好的选择,它允许提交值并且模板不可见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-04
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多