如何使document.querySelector在IE6中工作

时间:2015-01-28 14:31:41

标签: javascript internet-explorer-6

我在一个网站上工作,我得到了一个在Internet Explorer 6中不起作用的javascript函数。 我知道

document.querySelector(selector)

只能工作in Internet Explorer 8+

我该怎么做才能让它在IE6中运行?

(我不会试图让它变得有趣;))

2 个答案:

答案 0 :(得分:9)

我强烈建议您不要再尝试支持IE6了。


但您可以使用this very clever trick from an Ajaxian article添加document.querySelectordocument.querySelectorAll。这篇文章实际上有点不对劲,它添加了一个名为querySelector的东西来代替querySelectorAll。我在这里修改了这个名字:

/*@cc_on
if (!document.querySelectorAll)
    document.querySelectorAll = function(selector)
    {
        var head = document.documentElement.firstChild;
        var styleTag = document.createElement("STYLE");
        head.appendChild(styleTag);
        document.__qsResult = [];

        styleTag.styleSheet.cssText = selector + "{x:expression(document.__qsResult.push(this))}";
        window.scrollBy(0, 0);
        head.removeChild(styleTag);

        var result = [];
        for (var i in document.__qsResult)
            result.push(document.__qsResult[i]);
        return result;
    }
@*/

虽然我会永远表示使用for-in这样的表情; details and alternatives in this other answer

通过推理,querySelector

/*@cc_on
if (!document.querySelector)
    document.querySelector = function(selector)
    {
        var head = document.documentElement.firstChild;
        var styleTag = document.createElement("STYLE");
        head.appendChild(styleTag);
        document.__qsResult = [];

        styleTag.styleSheet.cssText = selector + "{x:expression(document.__qsResult.push(this))}";
        window.scrollBy(0, 0);
        head.removeChild(styleTag);

        // Return first result only               
        return document.__qsResult[0] || null;
    }
@*/

请注意,上述内容均未添加Element#querySelectorElement#querySelectorAll(仅在元素中显示的版本),仅document.querySelectordocument.querySelectorAll。并且你不能在IE6上添加Element版本而不将它们添加到每个单独的元素,因为IE6不支持元素原型。

答案 1 :(得分:3)

你可以使用polyfill,就像这个one一样,但仍然使用IE6,是一种死灵法的IT模拟。

上面提到的polyfill基于 polyfill.js ,可以找到here,这为许多ECMA 5函数提供了polyfill。

我将发布脚本的当前状态,也许它将来会有用(虽然我真的希望,它不会是:)):

if (!document.querySelectorAll) {
    document.querySelectorAll = function (selectors) {
        var style = document.createElement('style'), elements = [], element;
        document.documentElement.firstChild.appendChild(style);
        document._qsa = [];

        style.styleSheet.cssText = selectors +
                '{x-qsa:expression(document._qsa && document._qsa.push(this))}';
        window.scrollBy(0, 0);
        style.parentNode.removeChild(style);

        while (document._qsa.length) {
            element = document._qsa.shift();
            element.style.removeAttribute('x-qsa');
            elements.push(element);
        }
        document._qsa = null;
        return elements;
    };
}

if (!document.querySelector) {
    document.querySelector = function (selectors) {
        var elements = document.querySelectorAll(selectors);
        return (elements.length) ? elements[0] : null;
    };
}