【问题标题】:Scrolling select element jumps to top when removing options from DOM in IE从 IE 中的 DOM 中删除选项时,滚动选择元素跳转到顶部
【发布时间】:2016-04-22 13:00:46
【问题描述】:

此问题似乎与 Internet Explorer 无关:

当使用 JavaScript 双击它们时,我将 option 标记从一个 select 移动到另一个。 select 元素可以有很多项目,所以我用overflow: auto; 设置了高度,以便它们滚动。如果您向下滚动列表并双击要移动的项目,select 列表将在删除 option 时向上滚动到顶部,而不是像在 Chrome 或 Firefox 中那样停留在当前滚动到的位置.

我在这里做了一个基本的例子来证明这一点:https://jsfiddle.net/yk8LeLbw/1/

Javascript 非常简单:

 $(".listBoxSelectorAvail").dblclick(function() {
     $(this).find("option:selected").remove().appendTo(".listBoxSelectorAssigned");
 });
 $(".listBoxSelectorAssigned").dblclick(function() {
   $(this).find("option:selected").remove().appendTo(".listBoxSelectorAvail");
 });

我无法找到发生这种情况的任何具体原因 - 我不确定这是错误还是预期行为,但有什么可以做的吗?

编辑:使标题更清晰

编辑 2:我希望 stop 滚动,但到目前为止我提出的最佳解决方案是在项目移动后重新滚动,如下所示: https://jsfiddle.net/yk8LeLbw/2/

【问题讨论】:

  • 我使用的是 IE 11,它似乎可以按预期工作。
  • 有趣 - 我也在使用 IE11,它对我来说跳到了列表的顶部。
  • "...选择的列表在 Internet Explorer 中跳到顶部,而不是保留它的位置..." - 保留它的位置到底是什么意思?它不会保留其位置,因为它已被删除并附加到另一个列表中。
  • @Brett 抱歉,我没有解释清楚:我的意思是,当您在 select 元素中向下滚动并双击 select 滚动回顶部的项目时列表而不是停留在它所在的滚动位置。更新问题。
  • IE 的行为不同。浏览器就像雪花,没有两个是一样的。您可能必须将select 包装在div 中,并使用一些CSS 规则让div 控制滚动。阅读this

标签: javascript jquery html internet-explorer


【解决方案1】:

问题在于 IE 的行为不同。因此,我们必须解决这种不受欢迎的行为。解决方案是将select 包装在div 中并使用一些CSS。

这是一个有效的jsFiddle

注意我是如何在每个select 周围包裹一个div 并将size="50" 属性替换为multiple="true" 属性。这会移除 select 元素上的滚动条。

$(document).ready(function() {
  var arr1 = [];
  var arr2 = [];
  arr1.push("<div class='scroll'><select class='listBoxSelectorAvail' multiple='true'>");
  arr2.push("<div class='scroll'><select class='listBoxSelectorAssigned' multiple='true'>");
  for (var i = 0; i < 20; i++) {
    arr1.push("<option value=\"" + i + "\">Option " + i + "</option>");
  }
  arr1.push("</select></div>");
  arr2.push("</select></div>");
  $("body").append(arr1.join(""));
  $("body").append(arr2.join(""));
  $(".listBoxSelectorAvail").dblclick(function(e) {
    $(this).find("option:selected").remove().appendTo(".listBoxSelectorAssigned");
  });
  $(".listBoxSelectorAssigned").dblclick(function(e) {
    $(this).find("option:selected").remove().appendTo(".listBoxSelectorAvail");
  });
});

这是修改后的 CSS。

select {
  width: 200px;
  height: 200px;
}
.scroll {
  overflow: auto;
  display: inline-block;
  margin-left: 10px;
}

【讨论】:

  • 我更喜欢这种方式而不是强制重新滚动 - 我看到的唯一问题是multiple="true" 将允许选择多个而不是一次选择一个。这不是我的问题,但我实际上是根据当前选择在select 元素下方显示信息,所以这对我的具体情况造成了一些问题。无论如何,我认为这是最好的解决方案,谢谢!
  • 我明白了。我不确定是否有更好的方法来做到这一点。您可以使用一些 jQuery 来强制只选择一个元素。众所周知,在所有浏览器中修改 select 样式和行为非常困难。这就是为什么许多 UI 框架只是从 divinput 框而不是 select 框中构建自己的下拉列表。
  • 是的,情况并不理想,但我认为情况已经很好了。我在我的解决方案中使用 jQuery UI,我会检查是否有任何东西可以更好地适应这个。
猜你喜欢
  • 1970-01-01
  • 2020-07-06
  • 2022-07-12
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 2019-11-26
  • 2013-01-04
  • 1970-01-01
相关资源
最近更新 更多