如何在不重新加载页面的情况下加载下拉菜单中的选定选项?

How to load selected option in dropdown menu without having to reload the page?

我有一个简单的表格,用户可以在其中提交拨号代码和 phone 号码!在数据库中添加新实例时,它工作正常。但是,我在编辑现有实例时遇到了一些问题。在数据库中,我将 dialcode 保存为 integer,将 phone number 保存为 integer(例如,213 将存储阿尔及利亚的拨号代码,而 1234567890 phone个)

我设法解决了这个问题,但仍有问题!这按预期工作,但我将不得不重新加载页面以使其执行。如何一次且仅一次执行下面的代码,以及何时以类似方式加载其余数据(姓名、电子邮件、twitter、phone_number)?

换句话说,如何在下拉菜单中设置所选选项,因为我知道值是多少。

<script type="text/javascript">

  //select tag
  let country_code = document.getElementById("country_code_dropdown");    
  
  //set correct option according to numeric value:
  window.onload = function(){
    //get current dial code value:
    let dialCode = document.getElementById("country_phone_code_input").value; //357

    //Loop through
    Array.from(document.querySelector("#country_code_dropdown").options).forEach(function(option_element) {
        let option_value = option_element.value;

        if(option_value == dialCode){ //if value matches:
          option_element.selected = true; //set <option> to selected: true
          document.getElementById("phone_number_input").innerHTML  = "+" + option_value; //and change span
        }
    });
  };
</script> 

第 1 阶段:


第二阶段:

这听起来像是您在尝试设置经典输入绑定,而您 运行 遇到了 Turbolinks 问题。由于 Turbolinks 使用 ajax 执行页面替换,您需要编写幂等事件处理程序而不是将处理程序直接附加到元素:

function handleCountryPhoneCodeInput(source) {
  let opt = source.form.querySelector(`#country_code_dropdown option[value="${source.value}"]`);
  if (opt) {
    opt.selected = true;
  } else {
    console.log('Computer says no.');
  }
}

document.addEventListener('change', (event) => {
  let el = event.target;
  if (el.matches('#country_phone_code_input')) {
    handleCountryPhoneCodeInput(el);
  } else if (el.matches('#country_code_dropdown')) {
    let target = el.form.querySelector('#country_phone_code_input');
    target.value = el.value;
  }
});

// Set initial value on page load
// Use `turbolinks:load` instead if you are using turbolinks.
window.addEventListener('load', (event) => {
  let el = document.getElementById('country_phone_code_input');
  if (el) { handleCountryPhoneCodeInput(el) };
});
<form>
  <label>
    Access code 
    <input id="country_phone_code_input" name='user[country_phone_code_input]' value="456">
  </label>
  <label>
    Select an access code
    <select id="country_code_dropdown">
      <option value="123">123</option>
      <option value="456">456</option>
      <option value="789">789</option>
    </select>
  </label>
</form>

此代码应放置在您的资产或包中,具体取决于您使用的是 Sprockets 还是 Webpacker。对 Rails 中的内联脚本标签说不,因为它会破坏 turbolinks,因为你有一个持久的浏览器会话。

您也可以直接在服务器端设置初始 selected 值,以避免输入更改时 select 突然更改。