如何检查 JavaScript 对象是否是 DOM 对象?

2024-03-24

我试图得到:

document.createElement('div')  //=> true
{tagName: 'foobar something'}  //=> false

在我自己的脚本中,我曾经只使用它,因为我从来不需要tagName作为财产:

if (!object.tagName) throw ...;

因此,对于第二个对象,我想出了以下作为快速解决方案 - 这基本上是有效的。 ;)

问题是,它取决于浏览器强制执行只读属性,但并非所有浏览器都这样做。

function isDOM(obj) {
  var tag = obj.tagName;
  try {
    obj.tagName = '';  // Read-only for DOM, should throw exception
    obj.tagName = tag; // Restore for normal objects
    return false;
  } catch (e) {
    return true;
  }
}

有好的替代品吗?


这可能会令人感兴趣:

function isElement(obj) {
  try {
    //Using W3 DOM2 (works for FF, Opera and Chrome)
    return obj instanceof HTMLElement;
  }
  catch(e){
    //Browsers not supporting W3 DOM2 don't have HTMLElement and
    //an exception is thrown and we end up here. Testing some
    //properties that all elements have (works on IE7)
    return (typeof obj==="object") &&
      (obj.nodeType===1) && (typeof obj.style === "object") &&
      (typeof obj.ownerDocument ==="object");
  }
}

它是的一部分DOM,二级 http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html.

Update 2:这就是我在自己的库中实现它的方式: (前面的代码在 Chrome 中不起作用,因为 Node 和 HTMLElement 是函数而不是预期的对象。此代码在 FF3、IE7、Chrome 1 和 Opera 9 中进行了测试)。

//Returns true if it is a DOM node
function isNode(o){
  return (
    typeof Node === "object" ? o instanceof Node : 
    o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
  );
}

//Returns true if it is a DOM element    
function isElement(o){
  return (
    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
    o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName==="string"
);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 JavaScript 对象是否是 DOM 对象? 的相关文章

  • 使用Javascript自动打开弹出新窗口[重复]

    这个问题在这里已经有答案了 如何使用Javascript加载页面时打开弹出新窗口 我希望 当网站加载时 它会自动打开弹出新窗口 我使用以下内容 不行 尝试这个
  • 选择多选选项最多 2 个

    我正在对不同主题使用多重选择 我想将选择限制为最多 2 个 并且如果用户取消选择 则以相同的方式禁用其他选项 同样 该选项必须可供用户使用
  • Javascript 函数指针,以参数作为函数中的参数

    不确定标题的措辞是否正确 或者是否有更好的表达方式 但我认为还可以 无论如何 到目前为止我了解以下内容 a b a b c foo 其中 foo 是在其他地方定义的函数 不接受任何参数 只会导致函数 a b 使用上述参数运行 然后可以在函数
  • 在 ES5 中创建自定义元素 v1,而不是 ES6

    现在 如果您严格遵循自定义元素规范 v1 https html spec whatwg org multipage custom elements html custom elements 无法在不支持类的浏览器中使用自定义元素 有没有办法
  • 使用 jQuery live() 初始化插件?

    使用 jQuery 在特定类的所有当前和未来元素上自动初始化插件的最佳方法是什么 例如 假设我想要全部
  • Durandal SPA 与打字稿有关的问题

    我使用 TypeScript 1 8 将我的 durandal SPA 应用程序从 VS 2012 更新到 VS 2015 它将生成 JavaScript ECMA5 我解决了所有构建错误 但我无法修复一个名为 return 语句只能在函数
  • 如何使用 JavaScript 压缩文件?

    有没有办法使用 JavaScript 来压缩文件 例如 在雅虎邮件中 当您选择下载电子邮件中的所有附件时 它会被压缩并下载到单个 zip 文件中 JavaScript 能够做到这一点吗 如果是这样 请提供一个编码示例 我发现这个图书馆叫js
  • AngularJS 服务并承诺最佳实践

    我有一个 AngularJS 应用程序services 调用 http资源并返回promise我在控制器中解决了这个问题 这是我正在做的事情的示例 app service Blog function http q var deferred
  • 如何格式化折线图谷歌图表材料上的轴?

    我在格式化材料图表的轴时遇到问题 Using classic line chart if I would like to format my vertical axis with a dollar sign I would do vAxes
  • linkedin js 如何是有效的 javascript

    LinkedIn Javascript 集成是通过以下方式完成的 我不明白 这怎么是一个有效的javascript 为什么 api key 没有被引用 脚本标签的主体带有src永远不会被执行 但是 加载的脚本可以像访问任何其他元素的内容一样
  • React setState回调返回值

    我是 React 新手 我希望实现这种流程 set the state execute a function f an async one which returns a promise set the state again return
  • axios 如何将 blob 与 arraybuffer 作为响应类型处理?

    我正在下载一个 zip 文件axios https www npmjs com package axios 为了进一步处理 我需要获取已下载的 原始 数据 据我所知 Javascript 有两种类型 Blob 和 Arraybuffers
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • 从数组创建树并将父字段的表示形式更改为对象而不是 ID

    我堆满了琐碎的问题 但找不到解决方案 任何帮助将不胜感激 我有一个对象数组 id 1 title home parent null id 2 title about parent null id 3 title team parent 2
  • 鼠标输入时反应显示按钮

    我有一个反应组件 它包含如下方法 mouseEnter console log this is mouse enter render var album list const albums this props if albums user
  • 单击 html 中的按钮后如何从 javascript 函数写入文件

    我正在尝试编写真正基本的代码 在 html 文件上按下按钮后 通过 JavaScript 函数在本地写入 txt 文件 这不可能吗 我可以仅使用 javascript 文件写入文件 但在尝试同时使用两者时则不能
  • 阻止 PM2 上不同时运行的请求

    在我的 Express 应用程序中 我在应用程序中定义了 2 个端点 一种用于 is sever up 检查 另一种用于模拟阻塞操作 app use status req res gt res sendStatus 200 app use
  • 如何在 getStaticPaths 内添加 params 值数组

    我有一个页面 其结构如下 read slug number 我想要得到slug每个对应的值number in the getStaticPaths这是代码 export async function getStaticPaths const
  • 如何加载Jquery Tiny滚动条

    所以我想自定义一个滚动条 我发现了一个很小的滚动条 这是一个jquery插件 http baijs nl tinyscrollbar http baijs nl tinyscrollbar 问题是 无论如何我都无法让它工作 我将 Jquer
  • 调用一个从 AngularJS 表达式本地计算值的函数是不是很糟糕?

    我读了关于使用范围的一些 AngularJS 陷阱的文章 http thenittygritty co angularjs pitfalls using scopes 并且它指出您不应在表达式中使用函数 并且我知道每次框架认为需要时都可能会

随机推荐

  • 在 TCSH Shell 中启用历史记录

    如何启用在 tcsh shell 中输入的所有命令的日志记录 我试过了 将 history 变量设置为 100 savehist 到 99 将 histfile 设置为 home history 在 shell 中键入命令不会将命令保存在历
  • 让 gcc 警告隐式转换[重复]

    这个问题在这里已经有答案了 可能的重复 我可以让 GCC 在将太宽的类型传递给函数时发出警告吗 https stackoverflow com questions 310108 can i make gcc warn on passing
  • 从 Java (Scala) 调用 PHP 代码并获取结果

    这似乎在几个地方被问到 并被标记为 关闭 和 偏离主题 然而 人们似乎不断遇到这个问题 从java调用php方法 https stackoverflow com questions 614894 invoking a php method
  • 读/写简单 BMP 图像 C++

    我正在尝试读取简单的 BMP 文件 并且在不执行任何操作的情况下将其再次写回文件 我不知道读取文件或写回文件时出错在哪里 我在阅读和写作时添加了填充 文件读取 std vector
  • 使用 LINQ 获取一个 List<> 中不在另一个 List<> 中的项目

    我假设有一个简单的 LINQ 查询可以做到这一点 我只是不太确定如何做 鉴于这段代码 class Program static void Main string args List
  • jTable 中的 jButton 不可点击

    我遇到了问题 我无法单击按钮 它们的行为就像只是带有按钮设计的文本字段 my Main tableModStudents DefaultTableModel studentsTable getModel studentsTable getC
  • C# - 哪个更快:String.Contains() 或 Regex.isMatch()? [复制]

    这个问题在这里已经有答案了 可能的重复 Regex IsMatch 与 string Contains https stackoverflow com questions 2962670 regex ismatch vs string co
  • 为什么 System.out.print 会导致自动刷新?

    System out 是一个 PrintStream 对象 我阅读了有关 PrintStream 的文档 我不明白的是为什么 System out print 会导致缓冲区被刷新 这种情况不应该只发生在 println 中吗 这种情况不应该
  • IndexError:读取 python 的 CSV 文件中的列表索引超出范围

    我有一个包含 30000000 个条目的 csv 文件 像这样 3 2 2 2 2 2 2 当我尝试颠倒词序时 我收到以下错误 Traceback most recent call last File home grpus dg py li
  • 如何在 CodeIgniter 中创建库类的多个实例?

    我想在 CodeIgniter 中创建一个类的多个实例 我已将我的类创建为一个库 但无法弄清楚用于创建多个实例的语法 来自 CodeIgniter 用户指南 CI 用户指南 加载器类 http codeigniter com user gu
  • 将 puppeteer 与 imgui-js 结合使用

    如果问题的长度可能很吓人 问题的摘要是如何从节点服务器与前端应用程序交互 我相信 Puppeteer 的使用应该伴随着该请求的解决 问题很大 因为我解释了我在浏览器中实现后端代码 傀儡师 工作的所有失败尝试 除了构建和运行存储库之外 尽管按
  • Android Fragment 中的 EditText 值不刷新

    我正在使用Viewpager在 3 之间切换fragments 一切工作正常 除了第二个选项卡的刷新 或fragment 在这个选项卡中 我有一张图片 一些静态的Textviews 一些动态TextViews还有一些EditText fie
  • 如何生成 pool_transactions_genesis 和domain_transactions_genesis?

    我正在尝试创建 Hyperledger Indy 网络 并且一直在遵循阅读文档 https hyperledger indy readthedocs io projects node en latest start nodes html 我
  • 在 SQL 中的 CAST 中使用 & 符号

    SQL Server 2005 上的以下代码片段在与号 上失败 select cast
  • 在两个片段之间拖放

    我正在研究用户界面上同时可见的两个不同片段之间的拖放操作 我想将视图从一个片段拖到另一个片段中 我可以在片段之间拖动它 但我面临的不好的是我无法在第二个片段上监听 onDrag 以获取第一个片段的视图 简而言之 第二个片段上的 OnDrag
  • 如何将 Play 与自定义模块和持续集成结合使用

    如何在 CI 系统中设置 Play 应用程序和 自定义 Play 模块的构建 以便当模块的构建良好时 构建会将模块工件安装在本地存储库中和 或将它们部署到远程存储库 并且应用程序使用该存储库中的工件 该解决方案也应该适合在本地工作的开发人员
  • Android 应用内计费 v3:“无法执行操作:queryInventory”

    我第一次使用新的 v3 API 设置应用内结算 它在我的设备上运行正常 但我收到了其他用户的很多错误报告 其中之一是 java lang IllegalStateException IAB helper is not set up Can
  • 如何定义,系统中DEP为ON

    德尔福Xe XP Vista Win7 WAR 2008R2 0 支持DEP 数据执行保护 CPU Function isCpuDEP bool begin Result end 1 如何定义系统中DEP为ON Function isEna
  • 无法获取用户列表[重复]

    这个问题在这里已经有答案了 我想在我的应用程序中显示用户列表 我使用默认的Auth来自 firebase 的系统 但回复总是空的 FIRDatabase database reference child users queryOrdered
  • 如何检查 JavaScript 对象是否是 DOM 对象?

    我试图得到 document createElement div gt true tagName foobar something gt false 在我自己的脚本中 我曾经只使用它 因为我从来不需要tagName作为财产 if objec