我有一个由selectionChange事件调用的函数,该函数将可见选择框中的选择复制到隐藏但相同的选择框。我用来执行此操作的代码适用于Chrome,但在IE11中失败(删除隐藏选择框中的所有选项)。
self.selectionChanged = function () {
$('select#ListHidden option').removeAttr("selected");
$('#ListVisible option:selected').each(function (n, item) {
$('#ListHidden option').filter(function () { return $.trim($(this).text()) === item.text; }).attr('selected', true);
});
};
我能够通过使用下面的庞大代码替换.filter()方法来修复错误。
self.selectionChanged = function () {
$('select#ListHidden option').prop("selected", false);
$('#ListVisible option:selected').each(function (n, item) {
var a = $.trim($(this).text());
$('#ListHidden > option').each(function() {
var c = $.trim($(this).text());
if (a === c) {
$(this).prop('selected', true);
}
});
});
};
它适用于改变的方法,但我只是好奇为什么我的第一次尝试不起作用。我是否错误地实施了这种方法?如果是这样,为什么它在Chrome中有效?有没有更简洁的方法来增加兼容性?
答案 0 :(得分:1)
如果您在整个过程中使用Knockout或者根本没有使用Knockout,那么它将更清晰,更具跨平台兼容性。 Knockout旨在通过viewmodel处理DOM的所有操作。将它与jQuery DOM操作相结合可能会导致战斗。
看起来你在这里所做的工作正是如果select具有正确的绑定就会自动处理的事情。在Knockout中没有“selectChange”绑定这样的东西。应该有options
绑定和value
绑定。如果有event: { change: selectionChanged }
绑定,只需将其取出并使用jQuery处理该事件。