【问题标题】:prevent selecting the same option from a different select box防止从不同的选择框中选择相同的选项
【发布时间】:2013-03-21 21:47:48
【问题描述】:

来自 W3schools 示例(不要对 W3Schools 发表任何评论,我只是将其用作示例)。 选择选项如下所示:

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select> 

假设我有两个 select 选项具有相同的 name

<select name="name[]">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select> 

<select name="name[]">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select> 

现在,我想使用 jQuery 完成什么,如果有人从第一个选择中选择了一个选项.. 他/她不能从第二个选择中选择它。我怎样才能做到这一点?即如果在第一个选择中选择了Volvo,我如何从第二个选择中自动删除它? 如果无法使用 jQuery,那么我该如何使用 PHP 来防止它呢?

我的猜测是使用array_unique

    foreach(array_unique($_POST['name']) as $name){
        if (!empty($name)){
               // do something
        }

[发布问题后编辑]

这个question 与我的相关。但是,我不希望禁用该选项。我希望删除或隐藏该选项。另外,我想看看如何使用 PHP 来完成

【问题讨论】:

    标签: php jquery html


    【解决方案1】:

    您可以使用hidden 属性(或简单地.hide()display: none)暂时隐藏必要的选项,从而无法选择它:

    var $second = $('.select-two');
    $('.select-one').change(function() {
        $second.find('option').prop('hidden', false)
        .filter('[value="' + $(this).val() + '"]').prop('hidden', true);
        $(this).val() == $second.val() && $second.val('');
    });
    

    http://jsfiddle.net/FDRE7/

    当然我们也可以让它双向工作:

    var $select = $('.select').change(function() {
        var $other = $select.not(this);
        $select.find('option').prop('hidden', false)
        .filter('[value="' + $(this).val() + '"]').prop('hidden', true);
        $(this).val() == $other.val() && $other.val('');
    });
    

    http://jsfiddle.net/FDRE7/1/

    您可能还想在服务器端验证这些数据。在这种情况下,如果用户选择了相同的值,那么 POST 数组将如下所示:

    Array
    (
        [name] => Array
            (
                [0] => mercedes
                [1] => mercedes
            )
    )
    

    所以很容易检查:

    if ($_POST['name'][0] == $_POST['name'][1]) {
        // not allowed, redirect back
    }
    

    if (count(array_unique($_POST['name'])) == 1) {
        // not allowed, redirect back
    }
    

    【讨论】:

    • 这适用于第一个选择。我希望它适用于两个选择。每当您从第二个值中选择一个值时.. 它应该从第一个值中删除.. 反之亦然。
    • 正是我想要的。请解释如何防止使用 PHP 存储相同的选项,以便我可以选择这个答案作为正确答案。
    • 这可能是我的错......而不是你的错,因为我没有充分解释我的问题。您的代码中有很多流程。首先,jquery 代码只能在两个选择上工作。它不能在两个以上的情况下工作。 count() 不是验证的有效解决方案。必须有更好的方法。再次,如果我有两个以上的选择元素怎么办?
    • 如果可以有更多元素if (count(array_unique($_POST['name'])) != count($_POST['name'])).
    【解决方案2】:

    小提琴:http://jsfiddle.net/jFMhP/

    要完成所有选择,请将 javascript 设置为:

    $('select').change(function() {
        var myOpt = [];
        $("select").each(function () {
            myOpt.push($(this).val());
        });
        $("select").each(function () {
            $(this).find("option").prop('hidden', false);
            var sel = $(this);
            $.each(myOpt, function(key, value) {
                if((value != "") && (value != sel.val())) {
                    sel.find("option").filter('[value="' + value +'"]').prop('hidden', true);
                }
            });
        });
    });
    

    这将从所有其他选择中删除选项。

    备用选项

    仅使用“命名”选择器 jsFiddle 的替代选项:http://jsfiddle.net/jlawrence/HUkRa/2/ 代码:

    $('select[name="name[]"]').change(function() {
        var myName = '[name="name[]"]';
        var myOpt = [];
        $("select"+ myName).each(function () {
            myOpt.push($(this).val());
        });
        $("select"+ myName).each(function () {
            $(this).find("option").prop('hidden', false);
            var sel = $(this);
            $.each(myOpt, function(key, value) {
                if((value != "") && (value != sel.val())) {
                    sel.find("option").filter('[value="' + value +'"]').prop('hidden', true);
                }
            });
        });
    });
    

    【讨论】:

    • (对于 PHP,请参阅来自 dfsq 的最后一条评论 ^^)
    • $(...).find(...).prop 不是函数
    • 我用'.attr'而不是'.prop'
    • 令人惊讶的是,这并不能否定 .prop 是一个函数并且它可以工作的事实。
    • 这个答案解决了我的问题。工作得很好。干杯
    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 2011-03-01
    • 2021-06-14
    • 2021-02-14
    • 2014-05-06
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多