我最近在公司内部网站上实施了 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 所必需的,因为这可能会导致浏览器出现严重的性能问题。
注意:此问题不能准确反映标题中所述的问题,因此我对其进行了更新以提供更好的搜索!几周后回到这个问题后,我意识到我最初的调试导致我走错了路。对不起,伙计们,但我已经提供了一个答案,希望对您有所帮助!:)