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

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(使用前将#替换为@)

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

  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • Javascript JSON stringify 没有要包含在数据中的数字索引

    我正在尝试通过 JSON 传递非数字索引值 但没有获取数据 var ConditionArray new Array ConditionArray 0 1 ConditionArray 1 2 ConditionArray 2 3 Cond
  • 通过 HTML 将复杂变量传递给 javascript 的正确方法

    我试图摆脱使用 PHP 的 htmlentities 但我在这里停止了 但后来我想 我不做替换和检查特殊字符 而是只 JSON 整个对象 这提供了一个非常不受欢迎的结果 其中包含大量双引号 那么我应该怎么做呢 我应该为每个图像分配一个数字唯
  • 逻辑 && 和 || JavaScript 中的运算符

    我想进一步澄清一些事情 考虑一下 var a 42 var b abc var c null a b 42 a b abc c b abc c b null 我知道对于 运算符 如果第一个操作数的测试为真 则 表达式的结果是第一个操作数 a
  • 即使 WebPack 构建工作正常,VS Code 显示未找到模块

    我的 VS Code 说它找不到导入 即使我的 WebPack 构建仍然有效 这是进口 import as tf from tensorflow tfjs 以及来自 VS Code 的消息 找不到模块 tensorflow tfjs 您的意
  • 将模板添加为innerHTML 时,Angular 2 绑定/事件不起作用

    我正在尝试创建一个可配置的可重用表 单元格可以配置为具有 html 模板 我正在配置列 Review 拥有带有带有点击事件的锚标记的 html 模板 审核 行 到目前为止 我尝试将此模板作为innerHTML 插入 但所有角度绑定都不起作用
  • Puppeteer 错误 错误:等待选择器超时

    目前我有一个网站 其 HTML 中有此内容 我通过检查chrome开发者工具中的元素确认了这一点 div class hdp photo carousel div class photo tile photo tile large 我直观地
  • 委托和接口如何互换使用?

    我可以使用接口方法代替委托吗 如何 我发现搜索接口方法比使用委托更快 我希望有一个简单的代码片段 理论上 可以通过包含单个方法的接口 例如 Java 没有委托 来完成委托完成的所有工作 然而 它使代码变得更加冗长并且没有带来什么好处 话又说
  • 跨浏览器兼容音频有哪些选项?

    我正在使用这个功能 function playSound file MyAudio new Audio file MyAudio play 不幸的是 我正在努力寻找一种适用于所有浏览器的文件类型 Mp3 适用于 Chrome Safari
  • Rails:包括外部 JavaScript

    我想使用 JavaScript 库 例如 jQuery 插件 我是否使用 Rails 资产管道 或者我应该将其包含在 javascript include tag 中 我有哪些选择以及推荐的做法是什么 您会仅在几个页面上还是在整个应用程序中
  • 我可以使用 javascript 生成 JSON 文件吗?

    我想在域 example1 com 上创建一个页面 并获取 解析另一个域 example2 com json json 上的 JSON 文件 可以使用 javascript 生成 json 文件 在 example2 com 上 吗 我认为
  • Mocha 测试对原生 ES6 模块的“esm”支持

    有一个很棒的帖子 使用 Mocha 和 esm 测试原生 ES 模块 https web archive org web 20220318155753 https alxgbsn co uk 2019 02 22 testing nativ
  • 传单地图显示为灰色

    我正在启动 leaflet js快速开始 http leafletjs com examples quick start html但我的地图显示为灰色 我缺少什么吗 脚本 js var leafletMap L map leafletMap
  • 如何判断CKEditor是否已加载?

    如何确定 CKEditor 是否已加载 我查看了API文档 但只能找到loaded事件 我想检查 CKEditor 是否已加载 因为如果我第二次加载它 我的文本区域就会消失 The loaded活动对我不起作用 instanceReady
  • Javascript onclick隐藏div

    我想使用 javascript 隐藏这个警告 div 我的 javascript 正确吗 我想在单击关闭图标时隐藏 关闭 div images close icon gif div strong Warning strong These a
  • 将纬度/经度转换为 X/Y,以便在美国地图图像上进行阿尔伯斯投影

    我正在尝试使用 C 或 Javascript 将纬度 经度转换为 X Y 坐标 以将带有 CSS 的 div 左 上 定位到美国地图的背景图像上 美国的标准地图投影是阿尔伯斯投影 如下所示 但 StackOverflow 仅提供参考基本墨卡
  • 如何自动加载 Webpack 中给定目录中的所有 JSON 文件? [复制]

    这个问题在这里已经有答案了 编辑 有一个现有的问题 https stackoverflow com questions 29421409 how to load all files in a subdirectories using web
  • gulp-uglify 不会保留文件顺序

    当我使用吞咽丑化 https github com terinjokes gulp uglify为了缩小 Javascript 文件 顺序变得混乱 可以说我让这个任务按预期工作 var gulp require gulp var renam
  • Bootstrap $('#myModal').modal('show') 不起作用

    我不知道为什么 但所有模态功能都不适用于我 我检查了版本和负载 它们都很好 我不断收到此错误消息 Uncaught TypeError modal is not a function 对于隐藏我已经找到了替代方案 代替 myModal mo
  • 根据对象内的值将对象数组分成两部分

    我一直在尝试 并努力 弄清楚如何根据键值对拆分对象数组 长话短说 我有一个火车正在停靠的车站列表 需要将之前的停靠点和未来的停靠点分开 我正在使用的数据如下所示 station code SOC station name Southend

随机推荐

  • “您已经拥有该商品”但 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 页说道 删除属性就像获取属性一样简单 我们只