首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确处理对下拉菜单的任何更改操作?

如何正确处理对下拉菜单的任何更改操作?
EN

Stack Overflow用户
提问于 2015-07-13 18:40:17
回答 6查看 63关注 0票数 1

我有一个下拉菜单,当我点击它们时,我想触发一些东西.我不确定是否应该使用.change.click,也不确定这样的最佳实践是哪一种。

但现在我使用.click

HTML

代码语言:javascript
复制
<div id="dd" class="wrapper-dropdown-1" tabindex="1"> <span class="summary-texts">Summary</span>
    <ul class="dropdown">
       <!-- Dynamic List will added here  -->
   </ul>
</div>

我曾经拥有的

代码语言:javascript
复制
$('#group-0').click(function() {
  updateInfo("0");
  chart.draw( data[0] , options);
  $("#dd.wrapper-dropdown-1 .summary-texts").text('Group 0 ');
});
$('#group-1').click(function() {
  updateInfo("1");
  chart.draw( data[1] , options);
  $("#dd.wrapper-dropdown-1 .summary-texts").text('Group 1 ');
});
$('#group-2').click(function() {
  updateInfo("2");
  chart.draw( data[2] , options);
  $("#dd.wrapper-dropdown-1 .summary-texts").text('Group 2 ');
});
$('#group-3').click(function() {
  updateInfo("3");
  chart.draw( data[3] , options);
  $("#dd.wrapper-dropdown-1 .summary-texts").text('Group 3 ');
});
$('#group-4').click(function() {
  updateInfo("4");
  chart.draw( data[4] , options);
  $("#dd.wrapper-dropdown-1 .summary-texts").text('Group 4 ');
});

它不像你所看到的那么好,很多硬代码值。所以我重构了我的代码。

我现在所拥有的

代码语言:javascript
复制
for (var assignment in objects.assignments ) {

$('#group-'+assignment).click(function() {
  updateInfo(assignment);
  chart.draw( data[assignment] , options);
  $("#dd.wrapper-dropdown-1 .summary-texts").text('Group '+assignment);
});

}

结果

当我从下拉菜单中选择任何内容时,它都会继续显示Group 4.我不知道为什么会这样。

我是不是用正确的方法优化了它?

如何处理下拉菜单中的任何更改操作?

任何帮助/暗示/建议对我都是很大的帮助。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-07-13 19:04:02

让我们考虑一下您的代码当前正在做什么:

遍历objects.assignments,将assignment定义为当前执行上下文中的变量。在每次迭代中,使用object.assignments的下一个可枚举属性并将其交给assignments

例如,如果在完成for循环之后,您添加了console.log(assignment),您会发现它写入了for循环中给assignment的最后一个值: 4。为什么?因为变量assignment不限于for循环。For循环不创建自己的作用域

因此,当调用任何单击处理程序时,它们将访问给assignment的最后一个值,即4。

我们可以通过使用jQuery的each()函数来避免这个问题,因为函数确实创建了自己的作用域

代码语言:javascript
复制
$.each(objects.assignments, function(index, value) {
    $('#group-' + index).click(function() {
        updateInfo(index);
        chart.draw(data[index] , options);
        $("#dd.wrapper-dropdown-1 .summary-texts").text('Group ' + index);
    });
});
票数 1
EN

Stack Overflow用户

发布于 2015-07-13 18:56:38

我会去掉for循环,只使用jquery。选择器中的^=侦听以group-开头的in。要获得实际的组号,您需要删除group-,否则分配将类似于group-2,而不仅仅是2

代码语言:javascript
复制
$('#dropdown li').on('click',function(){
  var assignment=$(this).attr('id').replace('group-','');
  updateInfo(assignment);
  chart.draw( data[assignment] , options);
  $("#dd.wrapper-dropdown-1 .summary-texts").text('Group '+assignment);
});
票数 2
EN

Stack Overflow用户

发布于 2015-07-13 18:48:47

而不是为每个项目添加一个新的单击事件(当一个项目与您的模式“group-x”不匹配时会发生什么?)在"ul“元素上添加一个单击事件,如果有必要,对每个"li”元素添加一个单击事件,并使用DOM元素的"innerText“或"textProperty”属性获取文本。

下面是一些示例:

get the text in a list item and modify it with javascript

How to get Value / Text of a List item Javascript

我会亲自尝试将click事件设置得尽可能高,以使页面上的代码保持干净,并降低加载时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31390994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档