KnockoutJS:Internet Explorer 中的多选问题
KnockoutJS: multiselect issue in Internet Explorer
我有一个非常简单的案例,使用带有 KnockoutJS 3 的 multiselect select
元素。如果你使用 selectedOptions
绑定与带有 IE 的 multiselect 元素(任何版本),当 select 一个新选项时,select 元素总是跳到最底部的 selected 元素。我看到很多文章似乎与此有些相关并且非常过时,但没有确定的解决方案。任何帮助表示赞赏。
此处为简单示例:
http://jsfiddle.net/unp9j9dc/1
通过单击项目 1,按住控件,单击项目 20,然后返回到项目 2 进行重现。UI 将弹回到项目 20。
此外,我应该提到,虽然 JSFiddle 使用的是 knockout 3.0.0,但我在本地使用的是 3.2.0,结果相同。我很快就会尝试 3.3.0。
更新:与 Knockout 3.3.0 的结果相同。
我明白了。我正在广泛使用订阅和双向绑定,所有这些似乎仍然可以正常工作。
基本上,KO 基础设施只是在 UI 或模型更新时通过并同步 UI 与更新后的模型绑定。因此,它在 UI 更新上设置每个选项的 selected
属性,当它 "re-selects" 最后一个时,IE 决定将其滚动到视图中。
我使用了 Knockout 3.2.0 的调试版本并编辑了第 305-310 行,如果它已经等于正在设置的任何内容,则不尝试更新所选的选项 属性。我计划在有空时为此提交一个拉取请求,但如果其他人遇到这个问题,就在这里。
更新:
再次感谢@JamesThorpe,here is the source I edited.
setOptionNodeSelectionState: function (optionNode, isSelected) {
// IE6 sometimes throws "unknown error" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser.
if (ieVersion < 7)
optionNode.setAttribute("selected", isSelected);
else if (optionNode.selected != isSelected)
optionNode.selected = isSelected;
},
我有一个非常简单的案例,使用带有 KnockoutJS 3 的 multiselect select
元素。如果你使用 selectedOptions
绑定与带有 IE 的 multiselect 元素(任何版本),当 select 一个新选项时,select 元素总是跳到最底部的 selected 元素。我看到很多文章似乎与此有些相关并且非常过时,但没有确定的解决方案。任何帮助表示赞赏。
此处为简单示例:
http://jsfiddle.net/unp9j9dc/1
通过单击项目 1,按住控件,单击项目 20,然后返回到项目 2 进行重现。UI 将弹回到项目 20。
此外,我应该提到,虽然 JSFiddle 使用的是 knockout 3.0.0,但我在本地使用的是 3.2.0,结果相同。我很快就会尝试 3.3.0。
更新:与 Knockout 3.3.0 的结果相同。
我明白了。我正在广泛使用订阅和双向绑定,所有这些似乎仍然可以正常工作。
基本上,KO 基础设施只是在 UI 或模型更新时通过并同步 UI 与更新后的模型绑定。因此,它在 UI 更新上设置每个选项的 selected
属性,当它 "re-selects" 最后一个时,IE 决定将其滚动到视图中。
我使用了 Knockout 3.2.0 的调试版本并编辑了第 305-310 行,如果它已经等于正在设置的任何内容,则不尝试更新所选的选项 属性。我计划在有空时为此提交一个拉取请求,但如果其他人遇到这个问题,就在这里。
更新: 再次感谢@JamesThorpe,here is the source I edited.
setOptionNodeSelectionState: function (optionNode, isSelected) {
// IE6 sometimes throws "unknown error" if you try to write to .selected directly, whereas Firefox struggles with setAttribute. Pick one based on browser.
if (ieVersion < 7)
optionNode.setAttribute("selected", isSelected);
else if (optionNode.selected != isSelected)
optionNode.selected = isSelected;
},