使用.filter()的Select(ListBox)中的程序化更改适用于Chrome但不适用于IE11

时间:2015-10-19 15:29:28

标签: jquery google-chrome internet-explorer-11

我有一个由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中有效?有没有更简洁的方法来增加兼容性?

1 个答案:

答案 0 :(得分:1)

如果您在整个过程中使用Knockout或者根本没有使用Knockout,那么它将更清晰,更具跨平台兼容性。 Knockout旨在通过viewmodel处理DOM的所有操作。将它与jQuery DOM操作相结合可能会导致战斗。

看起来你在这里所做的工作正是如果select具有正确的绑定就会自动处理的事情。在Knockout中没有“selectChange”绑定这样的东西。应该有options绑定和value绑定。如果有event: { change: selectionChanged }绑定,只需将其取出并使用jQuery处理该事件。