【问题标题】:Show/hide Select options by class按类别显示/隐藏选择选项
【发布时间】:2013-02-24 11:40:26
【问题描述】:

我正在为 apx 预先选择最常用的选项。 300 选择元素,并希望区分这些值何时仍处于初始预选/默认状态vs.当用户通过单击表单元素主动选择该值时 (表明他们做出了一个积极的决定,将其设置为该值)

为了做到这一点,我为每个预选的值创建了一对选项(值略有不同,即value="50"value="50_Default"),当单击该元素时,我想隐藏预选选项并显示常规选项。我想将类用作选择器,以便该函数适用于所有 Select 元素,而不管它们的值如何。

我无法使 jQuery 的显示/隐藏方法适应这种情况,和/或修改我在 SO 帖子上看到的类似问题的答案,这些问题需要指定函数中的每个选项(即 jQuery disable SELECT options based on Radio selected (Need support for all browsers).我确实找到了一种按类显示/隐藏选择选项的解决方案,但是代码对我来说有点太复杂了,无法自己适应,所以如果这是最好的方法,我会很感激修改它https://stackoverflow.com/a/5924965/1056713

我正在尝试按照这些思路做一些事情(这些功能都不起作用)

JS

$(".default_set").click(function(){
    $(this).children("select option .default_field").hide();
    $(this).children("select option .selected_field").show();
});

// Store the hidden options (necessary in IE)
$(".hidden_field").hide();
$(this).parent("select option .default_field").removeAttr("selected");
$(this).parent("select option .default_field").hide();
$(this).parent("select option .selected_field").show();

HTML

<select name=min_jeans class="default_set">
    <option value=0>$0</option>
    <option value="50_Default" class="default_field" selected=selected>$50</option>
    <option value="50" class="selected_field" style="display:none">$50</option>
    <option value=100>$100</option>
    <option value=150>$150</option>
    <option class="hidden_field" value="hidden_field" style="display:none;"></option>    
</select>

这是我得到的最接近的(在@kasdega 的帮助下)http://jsfiddle.net/chayacooper/VN2Su/13/,使用值而不是类。它也不能正常工作 - 在单击元素之前,小提琴不显示默认值,当我在计算机上运行代码时,我遇到了相反的问题 - 它在单击元素之前显示默认值,但没有应该隐藏的时候不要隐藏它。

【问题讨论】:

  • 我不明白你的实现。为什么不默认禁用&lt;select&gt; 字段并告知$50 是默认值。如果他们想改变它,他们会点击一些东西(比如一个按钮/复选框,上面写着“我想使用我自己的价值”),这会启用下拉菜单并允许用户选择价格?
  • 我希望这对用户来说是无缝的。从他们的角度来看,他们看不到值之间的差异,但它允许我为值分配不同的权重,等等。

标签: jquery select show-hide option


【解决方案1】:

我不会使用隐藏/显示。我只会操纵元素

$('select').focus(function() {
    var option = $(this).find("option[value*=Default]");
    option.attr('value', option.attr('value').match(/[0-9]+/));
});

http://jsfiddle.net/JHAPp/2/

使用focus 来检测用户是否与选择进行了交互。发生这种情况时,请从值中删除 _Default 部分(它实际上只是匹配数字)。

提交表单而不触及任何内容会返回50_Default。触摸select后会返回50

【讨论】:

  • 我总是喜欢发现解决问题的不同方法 :-) 这是否适用于所有值,无论它们的“_Default”长度/位置如何?另外我假设如果选择了另一个选项,它会从选项中删除 selected=selected?
  • 当我想更改格式以引起他们对未回答问题的注意时,这也可能对我有所帮助:-)
  • 您不需要像那样操作选定的道具。而是使用$('select').val(200) 来选择具有该值的选项。这样做是在选项值的任何位置查找Default。然后它只查找数字并重新分配值。您可以将.replace('_Default', '') 用于其他值。
  • 当我在 php 中提交它时,它看起来工作得很好,我只是感到困惑,因为它在 html 源代码中没有改变:-) 我不熟悉什么“*=”或“/[0-9]+/”表示。您介意解释一下,以便我了解如何随着代码的发展而修改内容吗?我试图用谷歌搜索它们(结合匹配等),但很难找到关于特定字符的答案
【解决方案2】:

下面将在选择中显示默认选项,然后在单击项目时将其隐藏并选择它的关联值。

$(".default_set").focus(function () {
    $(".default_field").hide();
    if ($(".default_field").is(":selected")) {
        $(".selected_field").show().prop("selected", true);
    }
});

DEMO

【讨论】:

  • 这就是我一直在寻找的 :-D 一个问题 - 我从您的代码中假设它正在将 selected=selected 从“.default_field”更改为“.selected_field”,但它仍然显示 value=选择框中的“50_Default”将其隐藏在选项中
  • @ChayaCooper 我更新了我的答案以使用.focus() 而不是.click(),这解决了这个问题。
  • 这似乎仍然是一个问题:-(如果你点击它改变的新值,但如果你没有真正点击 $50 它离开“.default_field”(我检查您添加的方便的警报按钮 ;-) )
  • @ChayaCooper 你是对的。我最初在 Chrome 中进行了测试,但是在 Firefox 和 IE 中,隐藏选项并将它们设置为打开时的选择行为似乎有所不同。如果它满足您的整体意图,我建议您使用 Steve Robbins 提供的答案,因为它避免处理选项隐藏。
  • 我对此进行了一些阅读,似乎让它跨浏览器工作的方法是添加一个额外的隐藏选项,并将隐藏选项存储在那里。我很乐意让它与显示/隐藏一起使用,因为我不太了解史蒂夫使用的方法(这总是让事情变得复杂)
【解决方案3】:

我会这样写:

$(".default_set").focus(function () {
if ($('.default_field:selected')) {
    $('.default_field').hide();
    $('.selected_field').show();
    $('.default_field').removeAttr('selected');
}
});

希望这对你有帮助

【讨论】:

  • 我怎样才能让它也将 selected=selected 添加到'.selected_field'?
猜你喜欢
  • 2017-04-10
  • 2014-11-23
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2012-03-24
  • 2014-05-28
  • 2015-07-07
  • 1970-01-01
相关资源
最近更新 更多