为什么在删除元素/属性之前要检查它?

2024-02-02

In the 使用属性节点中的章节学习 Javascript - 现代 Javascript 基础知识实践指南 http://learningjsbook.com/,作者 Tim Wright 在第 73 页说道:

删除属性就像获取属性一样简单。我们只针对元素节点并使用该方法removeAttribute()把它从那里拿出来。如果您尝试删除不存在的属性,则不会引发 Javascript 异常,但最好的做法仍然是使用相同的hasAttribute()我们前面提到的方法,如清单4.6.4所示

清单 4.6.4 用于删除图像的类值的 JavaScript

if(document.getElementById("pic").hasAttribute("class")) {
    document.getElementById("pic").removeAttribute("class");
}

如果两种方式都没有抛出异常,那么检查它是否存在不是多余的吗?将会出现同样的结果。这本书说的论点是,在删除参数之前检查参数可以节省浏览器解析不必要的代码,但是if(document.getElementById("pic").hasAttribute("class")) {}甚至比document.getElementById("pic").removeAttribute("class");在其自己的!

Why那么这是最佳实践吗?


在我看来,你的假设是绝对正确的。我认为书中的“建议”有点灾难性(用一个戏剧性的术语)。以前从未听说过这种“最佳实践”。使用绝对无法实现任何目标element.hasAttribute在删除/更改属性之前但会减慢代码速度。浏览器并没有神奇地有一个属性查找列表来检查它们是否存在,但在设置或获取属性时不会使用该列表。它may在作者看来,这是生产的最佳实践readable and 可以理解的不过,代码。

此外,我认为你永远不应该使用setAttribute根本!使用setAttribute只有这样,才没有内置的标准方法来获取或设置某个属性。这里class有问题,使用

element.className = 'myclass';

代替

element.setAttribute('class', 'myclass');

浏览器在使用这种标准化方法时已经优化了例程。如果在向元素分配或删除属性时未使用该属性,则浏览器必须弄清楚它是什么类型的属性,并且之后可能会触发特殊操作 - 并非每次都需要。

您可以检查浏览器是否支持特定的属性方法,如下所示

if (typeof window.document.body.className === 'string') {
   //className is supported for node elements
}

大多数属性方法的行为类似于 getter 和 setter。您可以阅读和写作,并且使用某些方法甚至比其他方法更有效。例子 :

element.outerHTML = '';

清理的内存比

element = null;

它当然不是元素的属性,而是为了说明为什么人们应该更喜欢使用针对元素特定部分的内置方法。

有很多很多标准方法,例如element.className您可以用于定位特定的标准属性。它们大多以驼峰命名法命名为属性名称。使用setAttribute only对于您自己的自定义属性,例如

element.setAttribute('data-my-custum-attribute', 'hello');

根据 HTML5 标准,这是完全合法的标记。或者,如果浏览器不支持某种属性方法,则将其用作后备。对于非常旧的浏览器可能会出现这种情况。不过IE6也支持className.


我会推荐两本我认为对于深入理解 javascript 非常有价值的书(并不是说我完全理解了,但这些书对我帮助很大):

Javascript - 好的部分 http://shop.oreilly.com/product/9780596517748.do,道格拉斯·克罗克福德
JavaScript 忍者的秘密 https://rads.stackoverflow.com/amzn/click/com/193398869X,作者:John Resig(jQuery 背后的人)

买书吧!它们是黄金,可以作为您办公桌上的参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在删除元素/属性之前要检查它? 的相关文章

  • 如何使用 JavaScript 创建链接?

    我有一个标题字符串和一个链接字符串 我不知道如何将两者放在一起以使用 JavaScript 在页面上创建链接 任何帮助表示赞赏 我试图解决这个问题的原因是因为我有一个 RSS 源并且有一个标题和 URL 列表 我想将标题链接到 URL 以使
  • 在 contenteditable div 中选择范围

    我有一个contenteditablediv 和其中的一些段落 这是我的代码 div style border solid 1px black width 300px height 300px div Hello world div div
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清理 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • Angular - CSS - 自定义类型=文件输入,如何使用按钮而不是标签?

    我制作了一个类型为 file 的自定义输入字段 因为我不喜欢默认的输入字段 为了实现这一目标 我做了
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 在 HTML5 画布中,如何用我选择的背景遮盖图像?

    我试图用画布来实现这一点 globalCompositeOperation 但没有运气 所以我在这里问 这里有类似的问题 但我没有在其中找到我的案例 我的画布区域中有图层 从下到上的绘制顺序 画布底座填充纯白色 fff 用fillRect
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la

随机推荐

  • “您已经拥有该商品”但 getPurchases 为空[重复]

    这个问题在这里已经有答案了 我购买了一个订阅 not a Managed Product or Unmanaged Product 昨天为了测试 我给自己退款了 然后取消了订阅 退款和取消后 当我打电话时 m billingService
  • Node.js mongodb 中的 db.getUser

    与 MongoDB shell 命令等效的命令是什么db getUser and db getUsers在 Node js MongoDB 2 x 中 我在驱动程序文档中看到db addUser and db removeUser存在但没有
  • WordPress webp 图像预览

    我已经使用以下代码更新了 wordpress 以允许 webp 上传 function webp upload mimes existing mimes existing mimes webp image webp return exist
  • 测试期间随机抛出“InvalidCastException”

    在 WatiN UI 测试中 我遇到一个问题 在运行测试时 错误有时会抛出以下错误 InvalidCastException 未由用户代码处理 无法将类型为 mshtml HTMLDocumentClass 的 COM 对象转换为接口类型
  • 在Java Servlet中读取Ajax发送的JQuery数据

    这是我的 Ajax 代码 var myJSONObject bindings ircEvent PRIVMSG method newURI regex http ajax url ships data myJSONObject succes
  • 如何在 Visual Studio 2012 中加载符号

    当我调试我的应用程序时 我看到消息 找不到或打开 PDB 文件 我似乎记得能够在调试应用程序时指定 PDB 文件的位置 我怎样才能做到这一点 我正在使用 Visual Studio 2012 添加符号位置 打开设置 工具 gt 选项 gt
  • 如何修复拥挤的 tmap 图例中的垂直空间 [R]

    如何修复 tmap 图例中的垂直空间问题 如链接的基本 R 示例中所示的问题 图例中的垂直空间 https stackoverflow com questions 38332355 vertical spaces in legend y i
  • 从下拉框中获取文本

    这将获取我的下拉菜单中选择的任何值 document getElementById newSkill value 然而 我无法找出下拉菜单当前显示的文本要查找的属性 我尝试了 文本 然后查看了W3学校 http w3schools com
  • 如何在 Python 中处理 YAML 流

    我有一个命令行应用程序 它以以下形式连续输出 YAML 数据 col0 datum0 col1 datum1 col2 datum2 col0 datum0 col1 datum1 col2 datum2 它永远这样做 我想编写一个Pyth
  • 在 Symfony 中激活 StringLoader Twig 扩展

    我正在尝试激活Twig StringLoader 扩展 http twig sensiolabs org doc functions template from string html在 Symfony 2 3 项目中 但无法获得正确的 y
  • 如何在reactjs中上传到Firebase存储之前调整图像大小

    我正在尝试调整用户上传的图像大小 以提高我的网站效率并限制我的存储使用量 我从包中创建了一个名为 resizeFile 的函数 react image file resizer 现在我正在努力解决的是在上传到 firebase 存储之前如何
  • 模式匹配在 bash 脚本中不起作用

    使用模式匹配 file1 不能在 bash 脚本中工作 但可以在命令行中工作 例如 ls file1 file2 这将列出目录中的所有文件 除了file1 and file2 当在脚本中执行该行时 会显示此错误 script sh line
  • 如何查询一个域的用户是否是另一个 AD 域中的组的成员?

    我有一系列应用程序 它们都使用我创建的相同的 C Net 2 0 代码来检查用户是否是 Active Directory 组的成员 直到最近 当我将来自另一个受信任的 AD 域的用户添加到我的 AD 组之一时 我的代码才出现任何问题 我的问
  • 更改选择框选项背景颜色

    我有一个选择框 当单击选择框并显示所有选项时 我试图更改选项的背景颜色 body background url http subtlepatterns com patterns black linen v2 png repeat selec
  • 从 mongodb id 获取时间戳

    如何从 MongoDB id 获取时间戳 时间戳包含在 mongoDB id 的前 4 个字节中 请参阅 http www mongodb org display DOCS Object IDs http www mongodb org d
  • Objective-C 中 .Net Unicode 编码的等价物是什么?

    Objective C 中 Net 的等价物是什么System Text Encoding Unicode 我努力了 NSUnicode字符串编码 NSUTF8字符串编码 NSUTF16字符串编码 以上都没有正确地将文本转换回来 根据htt
  • 提取序列(列表) Prolog

    给定一个列表 例如 1 2 3 7 2 5 8 9 3 4 我如何提取列表中的序列 序列被定义为有序列表 通常我会说 n 元组 但在序言中我被告知元组被称为序列 因此 我们希望在下一个元素小于前一个元素的位置处剪切列表 所以对于清单 1 2
  • 如何修复“不明确”的函数调用?

    我正在开发一个 C 类程序 我的编译器抱怨 不明确 的函数调用 我怀疑这是因为有几个函数定义了不同的参数 我如何告诉编译器我想要哪一个 除了特定情况的修复之外 是否有通用规则 例如类型转换 可以解决此类问题 Edit 就我而言 我尝试打电话
  • 如果存在警报,WebDriver 屏幕截图将不起作用。使用c#.net如何处理?

    我正在使用 ASP net C net 内联网应用程序 Selenium Webdriver 用于测试应用程序 一页输入相同的名称 显示警报消息 已存在 使用 ajax 的服务器端警报 我想用 screenshort 捕获该警报消息 Sel
  • 为什么在删除元素/属性之前要检查它?

    In the 使用属性节点中的章节学习 Javascript 现代 Javascript 基础知识实践指南 http learningjsbook com 作者 Tim Wright 在第 73 页说道 删除属性就像获取属性一样简单 我们只