javascript - 更改单选按钮的顺序 : display the checked above the drop down list

标签 javascript html list radio-button

我希望 3 个 radio 可见,其他 radio 隐藏在下拉菜单中。 当从下拉列表中选择一个 radio 时,我希望它移动到可见 radio 中的第一个位置。第三个(或现在是第四个)可见 radio 应移至下拉列表中,以便我始终只有 3 个可见 radio 。

我不能简单地更改标签,因为我在剩余脚本中使用了 radio 的 ID(参见下面 js 脚本中的最后一行):

我只想使用普通 JS (没有 Jquery...)。

这是我的 html:

<div id="sourcecontainer">
    <div> From
        <div>
            <input type="radio" id="fr" name="source" value="fr">
            <label for="fr">fr</label>
        </div>
        <div>
            <input type="radio" id="en" name="source" value="en">
            <label for="en">en</label>
        </div>
        <div>
            <input type="radio" id="auto" name="source" value="auto" checked>
            <label for="auto">auto</label>
        </div>
        <nav id="topNav">
            <a href="#" title="Others" id="othersLanguageSource">Others</a>
            <ul id="listothersLanguageSource" style="list-style: none; display:none;">
                <li><input type="radio" id="pr1" name="source" value="1">Preset 1</li>
                <li><input type="radio" id="pr2" name="source" value="2">Preset 2</li>
                <li><input type="radio" id="pr3" name="source" value="3">Preset 3</li>
                <li><input type="radio" id="pr4" name="source" value="4">Preset 4</li>
            </ul>
        </nav>
    </div>
    <input id="text" type="text" value="" autofocus />
</div>

这是我的js:

... 
var menuTopNav = document.getElementById('topNav');
menuTopNav.addEventListener('mouseover', function () {
    var listothersLanguageSource = document.getElementById("listothersLanguageSource")
    listothersLanguageSource.style.display = "block";
    listothersLanguageSource.style.display = "block";
}, false);
menuTopNav.addEventListener('mouseout', function () {
    var listothersLanguageSource = document.getElementById("listothersLanguageSource")
    listothersLanguageSource.style.display = "none";
    listothersLanguageSource.style.display = "none";
}, false);

var sourceLang = document.querySelector('input[name="source"]:checked').value;
...
...

最佳答案

试试这个

let langs = [
  { id: 'en', value: 'en', text: 'en' },
  { id: 'fr', value: 'fr', text: 'fr' },
  { id: 'auto', value: 'auto', text: 'auto', checked: true },
  { id: 'pr1', value: 'pr1', text: 'Preset 1' },
  { id: 'pr2', value: 'pr2', text: 'Preset 2' },
  { id: 'pr3', value: 'pr3', text: 'Preset 3' }
];

function render() {
  let mainLanguageSource = '';
  let othersLanguageSource = '';

  langs.forEach((item, index) => {
    if (index <= 2) {
      mainLanguageSource += '<div>'
        + '<input type="radio" id="' + langs[index].id + '" name="source" value="' + langs[index].value + '" ' + (langs[index].checked ? 'checked' : '') + '>'
        + '<label for="' + langs[index].id + '">' + langs[index].text + '</label>'
        + '</div>';
    } else {
      othersLanguageSource += '<li>'
        + '<input type="radio" id="' + langs[index].id + '" name="source" value="' + langs[index].value + '" ' + (langs[index].checked ? 'checked' : '') + '>'
        + '<label for="' + langs[index].id + '">' + langs[index].text + '</label>'
        + '</li>';
    }
  });


  document
    .getElementById('mainLanguageSource')
    .innerHTML = mainLanguageSource;

  document
    .getElementById('listothersLanguageSource')
    .innerHTML = othersLanguageSource;

  // add event listeners
  document.querySelectorAll('[name="source"]').forEach(function(input) {
    input.addEventListener('change', function(event) {
      let position;
      
      langs.forEach((item, index) => {
        if (item.id === event.target.value) {
          position = index;
          item.checked = true;
        } else {
          delete item.checked;
        }
      });
      
      langs.unshift(langs.splice(position, 1)[0]);
      
      render();
    });
  });
}

render();
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<div id="sourcecontainer">
    <div> From
        <div id="mainLanguageSource">
            <!-- Filled from js -->
        </div
        <nav id="topNav">
            <a href="#" title="Others" id="othersLanguageSource">Others</a>
            <ul id="listothersLanguageSource" style="list-style:">
              <!-- Filled from js -->
            </ul>
        </nav>
    </div>
    <input id="text" type="text" value="" autofocus />
</div>
</body>
</html>

关于javascript - 更改单选按钮的顺序 : display the checked above the drop down list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374043/

相关文章:

r - 测试列表的所有元素(列表本身)是否相等

python - 在 Python 中将两个列表合并为一个

javascript - setTimeout 有或没有匿名函数?有什么不同?

html - 改变单选按钮的大小

javascript - 需要将 2 个不同的 div 拉伸(stretch)到屏幕,中间有一个 div

php - OnClick 事件并检查 MySQL 结果

javascript - 切换 boolean 原型(prototype)中的 boolean 值

javascript - typeof 创建具有未定义值的新变量(如果它不存在或不存在)

javascript - 需要建议 : Use server time or user machine's time?

list - 与 2 个示例相关的参数未充分实例化