javascript - 为什么 <select multiple> 框在 Chrome 中使用 preventDefault 滚动到顶部

标签 javascript html google-chrome preventdefault

<分区>

每次我添加一个事件监听器以某种方式对选择框的更改执行 preventDefault 时,它会滚动到顶部。

下面是一个最小的例子:

document.getElementById('foo').onmousedown = function(e) {
  e.target.parentElement.focus();
  e.target.selected = !e.target.selected;
  e.preventDefault();
  return false;
}
<select multiple size="5" id="foo">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
</select>

重现这种奇怪行为的步骤是:

  1. 点击选项 2
  2. 向下滚动一点
  3. 点击任何选项元素

您的 View 现在应该向上滚动以在最顶部显示选项 2

这对我来说似乎很奇怪,这真的很烦人。

对此的后续问题:我怎样才能阻止这种情况发生?我正在尝试制作一个脚本,使 select multiple 框的行为就像始终按下 ctrl 键一样(请参阅 https://stackoverflow.com/a/48217702/1256925 )但是当 size 大于列出的选项数量。

编辑:我已经在 MS Edge 中对其进行了测试(我在这台 PC 上没有安装 Firefox),它似乎可以正确处理这个问题,所以这可能是一个仅限 Chrome 的错误。如果是这样,我的后续问题仍然存在:如何防止 Chrome 这样做? (另外,有人可以告诉我这是否也发生在 FF 中吗?)

最佳答案

试试这个解决方法(它至少在 Chrome 中有效):

document.getElementById('foo').onmousedown = function(e) {
  e.preventDefault();
  var st = this.scrollTop;
  e.target.selected = !e.target.selected;
  setTimeout(() => this.scrollTop = st, 0);
  this.focus();
}

document.getElementById('foo').onmousemove= function(e) {
    e.preventDefault();
}
<select multiple size="5" id="foo">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
</select>

关于javascript - 为什么 <select multiple> 框在 Chrome 中使用 preventDefault 滚动到顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48218077/

相关文章:

html - Windows 批处理/解析来自 html 网页的数据

javascript - 不能多次使用 Web 组件

vb.net - Google Chrome 提供的 XPath 不正确

javascript - Chrome找不到firefox和eclipse的功能

javascript - PHP 代码在 chrome 中返回空,在 firefox 中返回值,我该如何调查原因?

javascript - 如何在javascript中打开没有地址栏,书签栏等任何栏的浏览器窗口?

javascript - 如何使用jquery ajax post方法[Codeigniter]将textarea数据保存到 session ?

html - 上传前批量替换数百个html文件的div内容

javascript - 嵌套 promise 返回未定义

javascript - Sitemesh 出现 ERR_CONTENT_LENGTH_MISMATCH 错误