【问题标题】:Change select to check boxes using javascript使用 javascript 将选择更改为复选框
【发布时间】:2016-07-17 07:41:16
【问题描述】:

我想这样做的原因是它会根据情况而定。如果用户登录,他们将看到下拉菜单。如果没有,他们将看到一个文本列表。理想情况下只是纯文本,但我不知道这是否可能,所以我想我可以将 <select> 转换为复选框并使用 CSS 隐藏复选框。

基本上,我们不希望未登录的用户觉得他们可以选择任何东西,因为他们将无法订购,这可能会导致挫败感。但我们仍然希望他们将每个产品的可用选项视为不可选择的文本。如果有比我想的更好的方法来做到这一点,我将不胜感激。目前,这是我拼凑在一起的,但它不会将选择更改为复选框。

我从这里抓取了一些代码作为起点:http://www.w3schools.com/jsref/met_element_setattribute.asp

另外,我无法通过 id 抓取 上。

<select id="unique_id" class="unique_class"  data-attribute_name="unique_attribute_name" name="unique_name">
    <option value="" selected="selected">Choose an option</option>
    <option class="attached enabled" value="516">5/16"</option>
    <option class="attached enabled" value="38">3/8"</option>
</select>

Javascript:

function myFunction() {
    document.getElementsByTagName("SELECT")[0].setAttribute("type", "checkbox"); 
}

这是一个小提琴:https://jsfiddle.net/d4qdekom/

【问题讨论】:

    标签: javascript html select checkbox attributes


    【解决方案1】:

    如果我正确地理解了您的目标,您可以将 div 放入并隐藏/显示或启用/禁用 div,具体取决于用户是否登录。因此,将您的选择包装在一个 div 中,然后切换它。

    这将避免尝试通过简单地显示/隐藏或启用/禁用您希望用户看到的内容来更改 html。

    【讨论】:

    • 您好,德文郡,感谢您的回答。我不确定这是否是一个解决方案。当用户未登录时,我可以隐藏下拉菜单,但我仍然想显示这些值,以便他们可以在不选择它们的情况下查看它们。如果我按照你的建议去做(如果我错了,请纠正我)我仍然需要找到一种方法从选择菜单中提取值,这让我回到了第 1 格。
    • 所以当你做第二个 div 时(当用户没有登录时)不要让它在任何地方提交。它可以只是一个包含所有相同数据但不提交的表单。
    • 或者你总是可以在提交表单(完成订单等)之前使用某种形式的 JavaScript 或 PHP 验证来检查他们是否已登录。根据表单提交的位置,您可以要求用户在那里登录以完成他们的订单或您正在做的任何事情。
    • 我目前正在使用&lt;?php if (!is_user_logged_in()): ?&gt; 隐藏选择并添加到购物车按钮,但我的目标是从下拉列表中取出选项并将它们显示为未登录用户的纯文本。我不希望他们在可选择的上下文中看到它,因为那将是糟糕的用户体验。因此,如果我使用可以显示/隐藏的第二个 div,那么第二个 div 将不知何故需要知道选择中存在哪些选项。所以我想知道我该怎么做。
    • 您可以使用 jQuery 获取您选择的所有项目。 $("#selectID 选项").each(function() { console.log($(this).val()); });
    【解决方案2】:

    这应该将您的选择转换为复选框,前提是有一个 ID 为“容器”的 HTML 元素来附加新的复选框。

    这是 HTML

    <select id="unique_id" class="unique_class" data-attribute_name="unique_attribute_name" name="unique_name">
        <option value="" selected="selected">Choose an option</option>
        <option class="attached enabled" value="516">5/16"</option>
        <option class="attached enabled" value="38">3/8"</option>
    </select>
    
    <div id="container"></div>
    

    将选择转换为下面的复选框的 JavaScript 函数

    function myFunction() {
        var select = document.getElementById('unique_id');
        var container = document.getElementById('container'); 
        var i;
        for (i = 0; i < select.length; i++) {
            var checkbox = document.createElement('input');
            checkbox.type = 'checkbox';
            checkbox.name = 'option';
            checkbox.id = 'randomId' + i;
            checkbox.value = select.options[i].text;
            var label = document.createElement('label')
            label.htmlFor = 'randomId' + i;
            label.appendChild(document.createTextNode(select.options[i].text));
            container.appendChild(checkbox);
            container.appendChild(label);
        }
    }
    

    然后您可以继续从 DOM 中删除选择。我想所有这些都应该用 JQuery 变得更容易

    这是使用 getElementsByTagName 的更新:

    var selects = x.getElementsByTagName('SELECT');  // this is a node list
    for (var i = 0; i < y.length; i++) {
      var select = selects[i]; // this is a single select element
      // You can call the above function on each select here...
    }
    

    This is a working jsFiddle

    我希望这会有所帮助。

    【讨论】:

    • 嗨 Mustapha,谢谢你,这是非常接近的!唯一的问题是,正如我在问题中提到的那样,我无法通过 ID 获取它。因为我需要在每次选择时都这样做,所以有 17 个,所以我必须写 getElementById 17 次。如果这是唯一的方法,我想我可以做到。你怎么看?
    • 如果我说得对,而您无法通过 ID 获取,使用 getElementsByTagName 应该会给您想要的 SELECT,您可以遍历它们并调用函数来转换每个值每次迭代中的选择到您想要转换的任何内容,即使不是复选框。
    • 感谢您的快速回复:) 不过我遇到了问题。我正在将var select = document.getElementById('unique_id'); 换成var select = document.getElementsByTagName("SELECT");,但这不起作用。我正在查看正在工作的 jsFiddle,但我不知道为什么这种交换不起作用。我错过了什么吗?
    • 是的 document.getElementsByTagName("SELECT") 返回一个类似数组的节点列表。所以你需要先遍历节点列表。这意味着您将进行两次迭代。第一个循环遍历节点列表,第二个循环遍历节点列表中的每个SELECT(元素)
    • 更新了答案和 jsFiddle 以反映使用 getElementsByTagName 的更改
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2018-04-20
    • 2016-08-13
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多