【问题标题】:Disable selection based on previous Dropdown menu selection禁用基于先前下拉菜单选择的选择
【发布时间】:2015-02-27 22:10:49
【问题描述】:

遇到了导致一些障碍的问题。我正在为我的公司制作产品配置器。本质上,我们所有的产品都是定制的,因此不同的组件可能与其他组件不兼容。

我要做的是根据以前的下拉菜单选择禁用不同下拉菜单上的选择。

即1。如果我在“控制器类型”部分选择通用,在“系列类型”部分,我希望所有选项都变灰。

即2。如果我在“控制器类型”部分中选择 EAFV 底座安装(水平),在“系列类型”部分中,我希望所有选项都可用。

即3。如果我在“控制器类型”部分中选择 EAFV 底座安装(垂直),在“系列类型”部分中,我想要除 4:1 和 6:1 之外的所有选项。

如果可能的话,我想用 Javascript/Jquery 来做这件事。我查看了 Stackoverflow 和各种 Google 搜索结果来寻找答案,但它们没有提供我需要的帮助。感谢您对此提供的任何和所有帮助,并且可以提供所需的任何其他信息。

谢谢!

【问题讨论】:

标签: javascript jquery html drop-down-menu selection


【解决方案1】:

先定义你的规则怎么样:

var controllerTypeFunctions = {
    Default:function(){
        $('#series option').prop('disabled',false);   
    },
    UV: function(){
        $('#series option').prop('disabled',true);   
    },
    EAFVH: function(){
        $('#series option').prop('disabled',false);   
    },
    EAFVV: function(){
        $('#series option').filter(function(){
           return this.value == "4" || this.value == "6"
        }).prop('disabled',true);   
    }    
}

然后根据值调用正确的规则:

$('#type').on('change',function(){
    controllerTypeFunctions.Default(); //resets all to enabled

    var val = $(this).val();
    controllerTypeFunctions[val]();
});

下面的实例:

var controllerTypeFunctions = {
    Default:function(){
        $('#series option').prop('disabled',false);   
    },
    UV: function(){
        $('#series option').prop('disabled',true);   
    },
    EAFVH: function(){
        $('#series option').prop('disabled',false);   
    },
    EAFVV: function(){
        $('#series option').filter(function(){
           return this.value == "4" || this.value == "6"
        }).prop('disabled',true);   
    }    
}


$('#type').on('change',function(){
    controllerTypeFunctions.Default();
    
    var val = $(this).val();
    controllerTypeFunctions[val]();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<b>Controller Type</b><br>
    <select id="type">
    <option value="">Select One</option>
    <option value="CR">Rack Mount</option>
    <option value="CS">Portable</option>
    <option value="EAFVV">EAFV Base Mount (Vertical 62 Series)</option>
    <option value="EAFVH">EAFV Base Mount (Horizontal Base)</option>
    <option value="CC">Chassis Box (Hoffman Enclosure)</option>
    <option value="PAFV">PAFV Base Mount</option>
    <option value="UV">Universal</option>
    <option value="HO">High Output Single Channel</option>
    <option value="LO">Low Output Single Channel</option>
</select>
<br>
<br>
     <b>Series Type</b><br>
     <p class="series"><font size="1">Only applies to certain controller  types</font></p>
    <select id="series" onchange="updateText('series')">
     <option value="">Select One</option>
     <option value="1" data-temp="EAFVV">1:1</option>
     <option value="2">2:1</option>
     <option value="4">4:1</option>
     <option value="6">6:1</option>
</select>
<br>

【讨论】:

  • 感谢您提供此代码,它在“运行代码片段”中完美运行。但是,我仍然无法让它在我的网站上运行。如果我犯了愚蠢的错误,我很抱歉,我只用了几个星期的代码。目前,我将其作为 JSFiddle 中的代码复制我的 HTML 和您的 Javascript/JQuery:jsfiddle.net/ro2dv5k1/5。 Javascript/JQuery 脚本在我的 HTML 中调用,位于:flexotherm.net/templates/yoo_corona/js/tso.js。它在 JSFiddle 上不起作用,我在屏幕上看不到任何控制台错误。
  • @FlexMarket 你在那个小提琴中有同样的错误信息,我在 ReferenceError: invalid assignment left-hand side if (parseInt($(this).attr('data-temp')) = type) { 之前指出
  • 我终于找到了您看到该错误的位置。似乎我忘了废弃仍在调用这些变量的旧 Javascript/Jquery 脚本。很抱歉我的错误!该代码终于可以在我的网站上正常运行了!非常感谢!
  • 很抱歉再次打扰您,但我会使用相同的 Javascript/Jquery 代码来影响其他选择吗?就像我可以选择“通用”,这会使整个“系列类型”部分变灰,然后根据“通用”选择,“电压”下的 240V 和 480V 也变灰?与往常一样,如果您有时间看,我的代码就在这里:jsfiddle.net/m31kcf54
  • @FlexMarket - 你可以在每个函数中做任何你喜欢的事情。请参阅this update - 我注释掉了一行并添加了一行,然后将您已经拥有的电压代码复制到该函数中。您可以开始编写可以调用的函数而不是复制/粘贴代码,我将把它留给您作为练习;)
【解决方案2】:

试试这个:

$("#type").change(function () {
    var selectList = document.getElementById("type");
    if (selectList.value === "UV") {
        $("#series option").attr("disabled", "disabled");
    } else if (selectList.value === "EAFVH") {
        $("#series option").removeAttr("disabled");
    } else if (selectList.value === "EAFVV") {
        $("#series option").removeAttr("disabled");
        $("#series option:nth-child(4)").attr("disabled", "disabled");
        $("#series option:nth-child(5)").attr("disabled", "disabled");
    } else {
        $("#series option").removeAttr("disabled");
    } 
});

【讨论】:

  • 感谢您的帮助!但是,我修改了控制器类型的 onchange 属性,不幸的是它仍然无法正常工作。修改后的代码(仅控制器类型的顶部到末尾)位于此处:jsfiddle.net/ro2dv5k1。您给我的正在加载的 Javascript/Jquery 代码位于:flexotherm.net/templates/yoo_corona/js/tempsensoroptions.js。如果你有时间,你能看看我是不是做错了什么?
  • 我已将代码修改为不需要 onchange 属性。您现在需要做的就是将其粘贴进去,如果您的 HTML 自发布以来没有任何更改,则应该可以。试试编辑后的版本,告诉我进展如何。你也不应该需要文档准备位。
  • 输入元素的启用/禁用状态应该使用prop而不是attr来处理。 "属性通常会影响 DOM 元素的动态状态,而不会更改序列化的 HTML 属性。示例包括输入元素的 value 属性、输入和按钮的 disabled 属性或复选框的 checked 属性。 ) 方法应该用于设置禁用和检查,而不是 .attr() 方法。"
  • @AshtonFrench 感谢您提供的所有帮助。不幸的是,它仍然无法正常工作。我将更新的代码带到了 JSFiddle,但它也无法正常工作。这是页面:jsfiddle.net/ro2dv5k1/2。我尝试了使用和不使用文档就绪代码均无济于事。
  • @FlexMarket - 你在那个小提琴中有一个javascript错误(使用=而不是==进行评估),注意控制台!
猜你喜欢
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2012-10-27
  • 2013-06-13
相关资源
最近更新 更多