【问题标题】:What is IE doing with my select statement?IE 对我的 select 语句做了什么?
【发布时间】:2018-01-25 23:09:03
【问题描述】:

我遇到过这样一种情况,这些代码行单独工作,但在我将它们放入的结构中却没有。至少,在 IE 11 中没有。

如果您运行此代码,JS 会根据字母顺序重新排列选择框中的选项,然后选择顶部的项目。在 Chrome 和 Firefox 中,这是可行的。

在 IE v11 中,元素会重新排序,但顶部的项目(“五个”)不会被选中。更奇怪的是,如果您在 IE 控制台中运行最后一行,它实际上会选择最上面的项目。所以,问题不在于 IE 不理解语法。 那么,它是什么?

(我相信这在早期版本的 IE 中可以正常工作,但我不确定。)

$('#it option').sort(function(a,b){
	return ( $(a).text() > $(b).text() ) ? 1 : -1;
}).appendTo( $('#it') );

$('#it option')[0].selected = 'selected';
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="it">
	<option val="0">zero</option>
	<option val="1">one</option>
	<option val="2">two</option>
	<option val="3">three</option>
	<option val="4">four</option>
	<option val="5">five</option>
	<option val="6">six</option>
</select>

最后一行$('#it option')[0].selected = 'selected';肯定会在所有浏览器中执行,至少如果你在它之前和之后放置一个console.log(),你会看到它们输出到控制台。那么这个IE不喜欢的结构到底是什么?


到目前为止建议的一些答案仍然无效:

这些解决方案仍然存在在 IE (v11) 中无法按预期运行的完全相同的问题。

  1. 换行:$('#it option')[0].selected = 'selected'; 至:$('#it option')[0].prop('selected',true);

  2. 换行:}).appendTo( $('#it') ); 至:}).detach().appendTo( $('#it') );

【问题讨论】:

  • 什么版本的IE?
  • @JasonB,绝对是一个重要的问题,我已更新以包含该信息。
  • 在 IE 上有什么功能吗?说真的,IE 问题太大了,如果你搜索 "IE selected option not working",你会得到大量的问题/答案,但每个问题/答案都是由不同的问题引起的。
  • 您的排序比较函数无效。当文本相等时,比较器应返回 0。您可以使用内置的.localeCompare() 函数以适用于排序的方式比较字符串。
  • @Pointy,这真的不是问题,没有两个值相等。

标签: javascript internet-explorer


【解决方案1】:

这真的很奇怪。我无法解释,但我找到了两种解决方法:

  1. 超时运行“选择”代码(因此它会在下一个滴答声中运行)
  2. 使用jQuery的.prop

那就是:

$('#it option').sort(function(a,b){
  return ( $(a).text() > $(b).text() ) ? 1 : -1;
}).appendTo( $('#it') );

$('#it option:eq(0)').prop('selected', true);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="it">
	<option val="0">zero</option>
	<option val="1">one</option>
	<option val="2">two</option>
	<option val="3">three</option>
	<option val="4">four</option>
	<option val="5">five</option>
	<option val="6">six</option>
</select>

或者:

$('#it option').sort(function(a,b){
  return ( $(a).text() > $(b).text() ) ? 1 : -1;
}).appendTo( $('#it') );

setTimeout(
  function() { $('#it option')[0].selected = 'selected'; }
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="it">
	<option val="0">zero</option>
	<option val="1">one</option>
	<option val="2">two</option>
	<option val="3">three</option>
	<option val="4">four</option>
	<option val="5">five</option>
	<option val="6">six</option>
</select>

【讨论】:

  • 超时函数 sn-p 对我来说不能正常工作,但 .prop 方法版本可以。这不是你的错 - 这是微软的错。
  • prop 版本在我的 IE 中没有更好的工作。实际上,在来到这里之前,我最初在我的代码中尝试了超时策略,但由于它实际存在的更复杂的结构,所以我使用它作为解决方案存在问题。
  • 该死的,这里 0 换 2。您将使用什么版本的 IE?
  • 实际上,刚刚再次测试,.prop 在 Stackoverflow 上不起作用,但在 Codepen 上可以。 setTimeout 两者都适用。所以,是的,这几乎摧毁了我支持 IE 的任何希望。
【解决方案2】:

简短的回答是,这似乎是 selectedIndex 的问题。下面记录了 IE11 中的 selectedIndex 6,在排序的选择框中是“零”选项。我的代码如下:

$('#it option').sort(function(a,b){
    return ( $(a).text() > $(b).text() ) ? 1 : -1;
}).appendTo( $('#it') );

$('#it option')[0].selected = 'selected';
console.log($('#it')[0].selectedIndex);  //logs 6

我找到了两种解决方法:

$('#it')[0].selectedIndex=0;
$("#it").val($("#it option")[0].text);

【讨论】:

  • 第一个解决方案真的适合您吗?第二个对我有用。我想相当有信心,我确定的最终代码将在尽可能多的浏览器中运行。
  • 两者都适用于 Chrome(63)、Firefox(57) 和 IE11。我将创建一个小提琴,以便我们可以在同一页面上。 IE 问题可能很烦人。
  • 啊,是的,你是对的,当我尝试你的第一行时,我没有引用第零个 select 元素。两者都工作正常。我得等 4 个小时才能给你赏金。
  • 没问题,很乐意提供帮助。
  • 解决方法很好。很高兴知道为什么 IE 确实理解 elem.selected = 'selected',但不是在它理解 sort().appendTo() 之后。
【解决方案3】:

问题在于重新排序元素。您可以分离它们,然后将它们放回去,控件将重新呈现。

$('#it option').sort(function(a,b){
	return ( $(a).text() > $(b).text() ) ? 1 : -1;
}).detach().appendTo( $('#it') );

$('#it option')[0].selected = 'selected';
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="it">
	<option val="0">zero</option>
	<option val="1">one</option>
	<option val="2">two</option>
	<option val="3">three</option>
	<option val="4">four</option>
	<option val="5">five</option>
	<option val="6">six</option>
</select>

【讨论】:

  • 如果这确实适用于 IE11 中的任何人,请把 cmets 留在这里。
  • 我只是仔细检查了一下,它在 IE 中有效 - 但在 Chrome 中无效! - 我会选择 .prop() 解决方案。
  • 我在这里看到的和@Sidney 一样。
猜你喜欢
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
相关资源
最近更新 更多