【问题标题】:How to append select options after detaching them using jQuery如何在使用 jQuery 分离后附加选择选项
【发布时间】:2014-09-14 08:18:12
【问题描述】:

在根据表单的初始选择选项的值分离选择选项后,我无法弄清楚如何附加选择选项。

这是我的表单的 HTML:

<form id="booking-form" action="#" method="post">
<legend class="bold">Bookings</legend>
<div class="input clearfix required">
    <label for="cinema">Cinema</label>
    <select name="cinema" id="cinema">
        <option value></option>
        <option value="maxima">Cinema Maxima</option>
        <option value="rivola">Cinema Rivola</option>
    </select>   
<div class="error">
    <p>Please select a cinema</p>
</div>  
</div>
<div class="input clearfix required">   
    <label for="day">Day</label> 
    <select name="day" id="day">
        <option value></option>
        <option value="monday">Monday</option>
        <option value="tuesday">Tuesday</option>
        <option value="wednesday">Wednesday</option>
        <option value="thursday">Thursday</option>
        <option value="friday">Friday</option>
        <option value="saturday">Saturday</option>
        <option value="sunday">Sunday</option>
    </select>
<div class="error">
    <p>Please select a time</p>
</div>  
</div>
<div class="input clearfix required">   
    <label for="time">Time</label> 
    <select name="time" id="time">
        <option value></option>
        <option value="12">12pm</option>
        <option value="3">3pm</option>
        <option value="4">4pm</option>
        <option value="6">6pm</option>
        <option value="7">7pm</option>
        <option value="9">9pm</option>
    </select>
<div class="error">
    <p>Please select a time</p>
</div>  
</div>
<div class="input">
    <input type="submit" value="Submit">
</div>
</form>

这是我编写的 jQuery 代码:

$(document).ready(function(){   

// ***** Begin Booking Form Manipulation ***** //

// If Cinema Maxima is selected, remove Cinema Rivola time options

$('#cinema').change(function() {

    if( $('#cinema').val() == 'maxima') {
            $('#time option[value="12"]').detach();
            $('#time option[value="4"]').detach();
            $('#time option[value="7"]').detach();
        }

// Else, remove Cinema Maxima time options

    else {
            $('#time option[value="3"]').detach();
            $('#time option[value="6"]').detach();
            $('#time option[value="9"]').detach();
        }

});

// If Cinema Maxima is selected but weekend session is not selected, remove 3pm time option

    $('#day').change(function() {

        if( $('#cinema').val() == 'maxima' && $('#day').val() != 'saturday' || 'sunday') {
            $('#time option[value="3"]').detach();
    }   
});



});

// ***** End Booking Form Manipulation ***** //

在过去几个小时浏览了 stackoverflow 之后,我不确定我是否正在以最好的方式解决这个问题,但我似乎找不到解决方案!对初学者的任何建议将不胜感激!

我已经在这里将我的代码上传到 jsfiddle:http://jsfiddle.net/nness/L9v6ejvt/

您难道不知道吗?使用 Chrome 时,.show() 和 .hide() 在我的 PC 上似乎可以完美运行!还有其他人在 Mac 上使用 Chrome 吗?.. 如果是这样,有什么想法为什么它会播放吗?最可悲的是,如果我从一开始就使用 PC,这将为我节省一天中最好的时间!谢谢大家的建议,非常感谢!

【问题讨论】:

  • 隐藏或取消隐藏然后使用.hide().show()
  • 这是我最初尝试做的,但没有任何成功(使用 chrome)...这将是最简单的解决方案!
  • 为我工作。我刚刚注意到你在小提琴中的内容 - 我很快就会看看。注意.detach() 不是一个好的解决方案,因为您需要将每个选项分配给一个变量,以便以后可以.append() 它。
  • Created new fiddle - 适用于电影院,但我不确定您使用 $('#day').change(.. 功能想要达到什么目的
  • 关于如何让它在 Chrome 上工作有什么想法吗?.. 这在 Firefox 上很有效(尚未测试 Safari)......但我需要这个才能在 Chrome 上工作,由于某种原因它没有!为回答您的问题,我们只在周六和周日举行下午 3 点的会议。

标签: jquery html forms select options


【解决方案1】:

如果可以为select添加对应的类如下:

<select name="time" id="time">
        <option value></option>
        <option value="12" class="rivola">12pm</option>
        <option value="3" class="maxima">3pm</option>
        <option value="4" class="rivola">4pm</option>
        <option value="6" class="maxima">6pm</option>
        <option value="7" class="rivola">7pm</option>
        <option value="9" class="maxima">9pm</option>
</select>

您可以简单地隐藏和显示它们

$(document).ready(function () {
  $('#cinema').on('change', function (ev) {
    $('#time option').hide();
    $("."+this.value).show();
  });
});

Updated Fiddle

旁注:不必要的DOM 操作真的很糟糕......

【讨论】:

  • 太棒了,这听起来像是一个很好的解决方案......我最初尝试使用 .hide() 和 .show();与 .remove() 或 .detach() 相反,但没有任何运气(使用 chrome)......会试一试!感谢您的回复!
  • 你介意我问一下你使用的是什么浏览器吗?与我最初尝试的非常相似,但不得不尝试使用 .remove() 或 .detach() 因为我似乎无法在 Chrome 上使用它!
  • 是的,我做到了,在运行 Mac OSX 的本地计算机上,我无法在 Chrome 上运行任何小提琴......可能会尝试在 PC 上启动它!干杯,扎克。
  • PS - 再次感谢您的所有回复 T J,非常感谢,如果我之前以错误的方式摩擦您,我们深表歉意!
【解决方案2】:

您可以设置自定义 HTML 属性,然后使用 jQuery
&lt;option value="maxima" exceptitems="12,9"&gt;Cinema Maxima&lt;/option&gt;

JQuery

$(document).ready(function(){
    $('#cinema').on('change', function(ev) {
        $('#time option').show();
        var opt=$("option:selected", this);
        var exceptItems=opt.attr('exceptitems');
        if(exceptItems)
        {
            var items=exceptItems.split(",");
            for (i = 0; i < items.length; i++) {
                $('#time option[value="'+items[i]+'"]').hide();
            }           
        }
    });  
});

DEMO1

更新 1: 我有很好的解决方案

&lt;option value="maxima" data-command="$('#time option[value=12]').hide()"&gt;Cinema Maxima&lt;/option&gt;

JQuery

$(document).ready(function(){
    $('#cinema').on('change', function(ev) {                
        var opt=$("option:selected", this);
        var strCommand=opt.data("command");
        eval(strCommand);
    });  
});

DEMO2

更新 2: 便于管理

$.fn.extend({
    executeCommand: function() {
        return this.on('change', function(ev) {
            var opt=$("option:selected", this);
            var strCommand=opt.data("command");
            eval(strCommand);
        });  
    }
});
$('#cinema').executeCommand();

DEMO3

【讨论】:

  • 那么所选日期的其他条件呢?这个解决方案太难管理了。
  • 恕我直言,最好使用 html5 data- 属性而不是无效的自定义属性。
  • 好的,看看我的Update 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2020-05-04
  • 2020-12-15
  • 2016-04-24
  • 2011-06-01
  • 2018-01-06
相关资源
最近更新 更多