6

我最近在公司内部网站上实施了 Selectivizr,因为我们需要支持 IE7/8。不幸的是,我们的网站通过 jQuery/AJAX 加载了大量动态内容。

为了解决这个问题,我重载了 jQuery 就绪函数,以便在 Selectivizr 执行它所设定的任何任务后重新加载它。我的代码如下所示:

$(function () {
    if ($('body.ie8, body.ie7, body.comp-view8, body.comp-view7').length > 0) {
        (function () {
            var original = jQuery.fn.ready;
            var getSelectivizr;
            jQuery.fn.ready = function () {
                // Execute the original method.
                original.apply(this, arguments);

                clearTimeout(getSelectivizr);
                getSelectivizr = setTimeout(function () {
                    $.getScript(selectivizr);
                }, 50);
            }

        })();
    }
});

很简单。然而,一位队友最近发现了一个似乎相关的错误。在 IE8/7 中,任何动态加载到页面中的选择下拉列表(我不确定是否会影响静态下拉列表以及这些页面都没有),需要单击两次才能打开它。

更具体地说,在 IE8/7 中,第一次单击似乎将“焦点”放在下拉列表上,而第二次单击则将其打开。它的兼容性视图,它实际上打开了一瞬间然后关闭。第二次单击打开它就好了(只要您仍然专注于下拉菜单)。

我曾认为这可能是 Selectivizr 正在做的事情的问题,因为它并不是真正设计用于处理动态加载的内容,但经过一些调试后,似乎是 setTimeout 导致了这种奇怪的行为。

我完全不知道如何在不删除我的 Selectivizr 实现的情况下解决这个问题

可能值得注意的是,如果进行不同的 AJAX 调用,setTimeout 是防止浏览器尝试多次加载 Selectivizr 所必需的,因为这可能会导致浏览器出现严重的性能问题。

注意:此问题不能准确反映标题中所述的问题,因此我对其进行了更新以提供更好的搜索!几周后回到这个问题后,我意识到我最初的调试导致我走错了路。对不起,伙计们,但我已经提供了一个答案,希望对您有所帮助!:)

4

1 回答 1

3

所以,我终于有机会回到这个错误,似乎解决方案一直盯着我看,由于我最初的调试搞砸了,我完全错过了它。

事实证明,这一直是一个选择性问题。不幸的是,对 IE8 及更低版本中的选择框进行任何类型的动态更改 (JS) 会导致它被重绘,这会迫使它关闭(或永远不会打开,具体取决于版本/模式)。selectivizr 的工作方式是它离散地为元素添加一个类,例如“slvzr-focus”,使用 JS 来模仿伪类的行为;在这种情况下“:焦点”。

因此,简单地限制 selectivizr 应用这种补丁来选择焦点框是有意义的。我的解决方案如下,尽管它可能不适合所有人(或者,您可以简单地确保您的 CSS 中不存在 ":focus" 选择器,这将导致 selectivizr 永远不会触发事件):

1) 在 selectivizr.js 中找到以下行:

if (!hasPatch(elm, patch)) {

    if (patch.applyClass && (patch.applyClass === true || patch.applyClass(elm) === true)) {

        cssClasses = toggleClass(cssClasses, patch.className, true);
    }

}

2) 用以下if语句包装它:

if (!(elm.tagName == 'SELECT' && patch.className == 'slvzr-focus')) {
}

3) 完成后,该块应如下所示:

if (!(elm.tagName == 'SELECT' && patch.className == 'slvzr-focus')) {
    if (!hasPatch(elm, patch)) {

        if (patch.applyClass && (patch.applyClass === true || patch.applyClass(elm) === true)) {

            cssClasses = toggleClass(cssClasses, patch.className, true);
        }
    }
}

希望能帮助那里的人。

谢谢S/O!

于 2012-10-17T12:19:28.623 回答