自定义搜索DOM元素

时间:2013-02-08 09:48:06

标签: javascript dom

我正在编写一个自定义方法来返回DOM元素引用,但它似乎适用于所有现代浏览器,如Chrome,Firefox,Safari但在IE 9中失败...返回的元素未定义它表明我不确定是什么我做错了

var searchEle = function (parent, ref) {
var refEle;
if (typeof document.getElementByClassName === "function") {
    if (ref.substr(0, 1) === ".") {
        refEle = parent.getElementsByClassName(ref.replace(".", ""));
    } else {
        refEle = parent.getElementsByTagName(ref);
    }
} else {
    if (ref.substr(0, 1) === "#") {
        refEle = parent.getElementById(ref.replace("#", ""));
    } else if (ref.substr(0, 1) === ".") {
        refEle = parent.querySelector(ref);
    }
}
return refEle;
};

在IE9上查看演示:http://jsbin.com/ubokop/5/edit

由于

1 个答案:

答案 0 :(得分:1)

首先,将此polyfill用于getElementsByClassName,因为这是唯一需要一个的函数。它并不完美,但它足够接近。

// Add a getElementsByClassName function if the browser doesn't have one
// Limitation: only works with one class name
// Copyright: Eike Send http://eike.se/nd
// License: MIT License
if (!document.getElementsByClassName) {
    document.getElementsByClassName = function(search) {
        var d = document, elements, pattern, i, results = [];
        if (d.querySelectorAll) { // IE8
            return d.querySelectorAll("." + search);
        }
        if (d.evaluate) { // IE6, IE7
            pattern = ".//*[contains(concat(' ', @class, ' '), ' " + search + " ')]";
            elements = d.evaluate(pattern, d, null, 0, null);
            while (i = elements.iterateNext()) {
                results.push(i);
            }
        } else {
            elements = d.getElementsByTagName("*");
            pattern = new RegExp("(^|\\s)" + search + "(\\s|$)");
            for (i = 0; i < elements.length; i++) {
                if ( pattern.test(elements[i].className) ) {
                    results.push(elements[i]);
                }
            }
        }
        return results;
    }
}

<强>(Source of this polyfill

然后,这就足够了:

var searchEle = function (ref) {
    if (ref.charAt(0) === "#") {
        return document.getElementById(ref.substr(1));
    }else if (ref.charAt(0) === ".") {
        return document.getElementsByClassName(ref.substr(1));
    }else{
        return document.getElementsByTagName(ref);
    }
};