【问题标题】:What's the best way to detect if a given Javascript object is a DOM Element? [duplicate]检测给定 Javascript 对象是否为 DOM 元素的最佳方法是什么? [复制]
【发布时间】:2010-09-12 07:49:04
【问题描述】:

例如,我正在编写一个旨在接受多种参数类型的函数:

var overloaded = function (arg) {
    if (is_dom_element(arg)) {
        // Code for DOM Element argument...
    }
};

实现 is_dom_element 以便它以相当准确的跨浏览器工作的最佳方式是什么?

【问题讨论】:

    标签: javascript dom cross-browser


    【解决方案1】:

    怎么样

    obj instanceof HTMLElement
    

    【讨论】:

    • 不知道为什么这在没有任何解释的情况下被否决,但这也有效,而且似乎比一个神奇的数字更可靠。
    • 这个答案是完全多余的,因为 Armin 之前发布了同样的事情,并且正如 bobince 对该答案的评论所表明的那样,这是不可靠的。我的回答并非不可靠,那个“幻数”是defined in the specification
    • 这在 Chrome 中不起作用,因为 HTMLElement 是那里的功能
    【解决方案2】:

    jQuery 检查 nodeType 属性。所以你会有:

    var overloaded = function (arg) {
        if (arg.nodeType) {
            // Code for DOM Element argument...
        }
    };
    

    虽然这会检测到所有 DOM 对象,而不仅仅是元素。如果你只想要元素,那就是:

    var overloaded = function (arg) {
        if (arg.nodeType && arg.nodeType == 1) {
            // Code for DOM Element argument...
        }
    };
    

    【讨论】:

    • 太好了,如果它对 jQuery 来说足够好,它应该可以满足我的需求。谢谢!
    【解决方案3】:

    这里可能是这个:

    node instanceof HTMLElement
    

    这应该适用于大多数浏览器。否则你必须直接输入它(例如typeof x.nodeType != 'undefined'

    【讨论】:

    • HTMLElement 作为构造函数未定义为可通过任何标准访问,并且在 IE 8 之前的版本中也不是。
    • @bobince:HTMLElement 是在 DOM 级别 2 中定义的。IE7 及更早版本不支持它并不意味着它没有标准化。你不应该使用instanceof的原因是因为如果你在做跨框架开发,它就行不通了。
    • 实际上,在某些情况下,它不能跨框架工作甚至可能是一个优势:通常,外部节点需要特殊处理(即导入),因此它们不能使用相同的代码-path 作为本地节点...
    猜你喜欢
    • 2016-03-11
    • 2012-05-22
    • 2010-11-15
    • 2015-09-04
    • 2011-06-12
    • 2018-03-03
    • 2020-09-07
    • 2011-06-13
    • 2017-06-09
    相关资源
    最近更新 更多