“select”元素发生变化时,如何在javascript中模拟用户点击提交按钮?

问题描述 投票:0回答:3

我有一个简单的 html 表单。当“select”元素发生变化时,我想模拟用户点击 javascript 中的提交按钮。 因此,我尝试使用选择的 onchange 函数来做到这一点。我不知道如何编写发送表单的函数。我已经搜索过这个网站,但没有找到任何适合我的东西。它根本没有做任何事情。它没有发送表格。也许我只需要包括一些东西,但我没有,所以也许如果我这样做了,它就会起作用。我真的不知道。我是 JavaScript 的新手。我会非常感谢一段 java 脚本代码(函数),如果需要的话,也许还有我需要的 CDN 或文件。

<!DOCTYPE html>
<html>
<head>

//probably I need to include something here (if so, could you please send me the CDN?)

</head>
<body>


<form method="post" id="theForm" enctype="multipart/form-data">

<select id="year_start"  name="year_start" onchange="myFunction()"> 
    <option>2009</option>       
    <option>2010</option>       
    <option>2011</option>       
    <option>2012</option>       
    <option>2013</option>       
    <option>2014</option>       
    <option>2015</option>       
    <option>2016</option>       
    <option>2017</option>       
    <option>2018</option>       
  </select> 
<select id="month_start"  name="month_start" onchange="myFunction()"> 
    <option>January</option>       
    <option>February</option>       
    .
    .      
    <option>December</option>       
</select> 
 <select id="day_start" name="day_start" onchange="myFunction()" >
    <option>1</option>       
    <option>2</option>       
    .
    .
    .
    <option>30</option>       
    <option>31</option>       
  </select> 

  <input type="submit" id="submit" value="submit">

</form>

<script>
function myFunction(){
//what should I do there? - I want to simulate user's click on the "submit" button
}
</script>

<?php

//I want to do some stuff there after some of the selects was changed
echo $POST['year_start'];
echo $POST['month_start'];
echo $POST['day_start'];

?>

</body>
javascript forms
3个回答
1
投票

您可以使用

.click()
函数从javascript点击提交函数。

function myFunction(){
  document.getElementById('submit').click();
}

并避免在 html 中使用内联函数。


1
投票

为什么不在提交按钮上手动触发

click
事件,为什么不调用表单上的
submit()
方法呢?

function myFunction(){
    document.getElementById('theForm').submit();
}

因为你使用的只是 vanilla JS,你不需要包含任何库:这就是编写 vanilla JS 的美妙之处。

专业提示:您可能需要考虑避免内联 JS 绑定,并使用

addEventListener
来检查从
change
元素触发的
<select>
事件(假设您想要绑定到所有
<select>
元素):

var formEl = document.getElementById('theForm');
var selectEls = formEl.querySelectorAll('select');

[].prototype.slice.call(selectEls).forEach(function(selectElement) {
    // Bind event listener to each select element
    selectElement.addEventListener('change', function() {
        formEl.submit();
    });
});

否则,您也可以在

querySelectorAll()
方法中使用逗号分隔的 ID 选择器,例如:

var selectEls = formEl.querySelectorAll('#year_start, #month_start, #day_start');

重要提示

根据您的评论,我感觉您希望 JS 在 PHP 代码中执行某种操作。请记住,PHP 是一种服务器端语言,因此如果您想使用 JS 通过 PHP 触发某种服务器状态突变,则需要使用 AJAX。


这是一个概念验证示例:

var formEl = document.getElementById('theForm');
var selectEls = formEl.querySelectorAll('select');

Array.prototype.slice.call(selectEls).forEach(function(selectElement) {
  // Bind event listener to each select element
  selectElement.addEventListener('change', function() {
    // Here is just dummy code to show you how binding works
    console.log('Will submit form');
  
    // Uncommt this line to perform actual form submission
    //formEl.submit();
  });
});
<form method="post" id="theForm" enctype="multipart/form-data">

  <select id="year_start" name="year_start">
    <option>2009</option>
    <option>2010</option>
    <option>2011</option>
    <option>2012</option>
    <option>2013</option>
    <option>2014</option>
    <option>2015</option>
    <option>2016</option>
    <option>2017</option>
    <option>2018</option>
  </select>
  <select id="month_start" name="month_start">
    <option>January</option>
    <option>February</option>
    <option>December</option>
  </select>
  <select id="day_start" name="day_start">
    <option>1</option>
    <option>2</option>
    <option>30</option>
    <option>31</option>
  </select>

  <input type="submit" id="submit_button">Submit</button>

</form>


0
投票

有时别无选择,只能创建自己的临时按钮并模拟点击作为最后的手段。

const simulateSubmit = () => {
    const button = document.createElement('button')

    button.type = 'submit'
    document.body.appendChild(button)
    button.click()
    document.body.removeChild(button)
}

而不是

document.body
使用表单内的元素或表单本身。

© www.soinside.com 2019 - 2024. All rights reserved.