ColumnChooser free-jqgrid 不适用于 IE9

ColumnChooser free-jqgrid is not working on IE9

将我的应用程序从 jqGrid 4.6 升级到 free-jqgrid 4.8 后,columnChooser 功能不起作用。它仅适用于 IE9。此处提供演示:http://jsfiddle.net/2tkkqbeq/15/(请在 IE9 模式下打开它)。
我认为问题出在jqGrid库中的apply_perm函数中:

   apply_perm: function () {
        var perm = [];
        $("option", select).each(function () {
            if ($(this).is("[selected]")) {
                $self.jqGrid("showCol", colModel[this.value].name);
            } else {
                $self.jqGrid("hideCol", colModel[this.value].name);
            }
        });
    }

当我将 if ($(this).is("[selected]")) 更改为 if ($(this).is(":selected")) 时,它开始工作了。

is("[selected]")is[":selected"]有什么区别?

感谢您的错误报告!我喜欢可以用来重现问题的演示问题。

这是 jqGrid 4.7 中的错误(参见 jqGrid 4.6 的 the line and compare it with the corresponding line)。所选选项的最佳测试是 .is(":selected") 的用法。 jQuery 的相应实现使用不同版本的 Web 浏览器中实现的所有细节。选择器 .is("[selected]") 表示 selected 属性存在并具有某个值。通常,属性 selected 的值应为 "selected" (selected="selected")。我使用您的演示进行的测试表明,在 IE9 的情况下,一个具有 selected="" 值,而测试 .is("[selected]") returns 错误值 true 而不是 .is(":selected") 提供了正确的值false.

我将免费 jqGrid 代码中的行和关闭选择器 $("option[selected]", select) 修复为 $("option", select).filter(":selected")

我已将修复程序发布到 github。因为您在演示中使用了 URL //rawgit.com/free-jqgrid/jqGrid/master/js/jquery.jqgrid.src.js 那么演示现在将使用修改后的代码。您可以验证它现在在 IE9 中是否正常工作。

我有与此过滤器相关的问题 :selected。 同样在演示中,如果您删除一列并立即读取该列而不关闭列选择器,该列将保持隐藏状态,因为 $(this).is(":selected") return false (我不明白原因但这发生在 chrome 和我测试过的边缘) 如果我改用 [selected] 它会起作用...