document.querySelector("#id") 和 document.getElementById("id") 有什么区别吗?

2019-12-27 18:59:34 +08:00
 lisisi

1、看到一些 document.querySelector("#id") 的用法,这个新方法比 document.getElementById("id") 有什么优势吗?
2、遇到 id 是变量,document.querySelector("#id") 怎么传 id 进来呢?

const foo = 'id_Name';
document.querySelector("#" + foo)

试了下,上面这样写没效的

6799 次点击
所在节点    JavaScript
32 条回复
lihongming
2019-12-28 01:28:39 +08:00
@littlepanzh 现在前端的发展趋势是根本不写最终执行的代码,而是全都用最新语法(现在是 ES6 ),并用 webpack 之类的工具“编译”成可执行的代码,所以根本不用考虑兼容性。
yimity
2019-12-28 08:47:11 +08:00
你的传 id 变量的代码没问题,不过传变量是最基础的知识了。
getElementBy 获取到的是动态的,即 你增加了 dom,再获取还是可以获取到你最新增加的的,你删掉了 dom,再获取的时候,之前获取到的就不在了,就是每次都是实时从 dom 树里面获取。
而 querySelector 是引用,即获取一次后面增加的 dom,不会获取到了,删掉了 dom, 在代码中还是能够用(但是会报错)。
old9
2019-12-28 10:19:35 +08:00
本帖这都是些什么乱七八糟的
c6h6benzene
2019-12-28 10:36:42 +08:00
昨天刚看到,现学现用:

理论上 id 不应该重名,但现实总有各种可能。querySelector 会拿到同一个 id 的多个元素,getElementbyID 只有一个。
jinliming2
2019-12-28 10:37:48 +08:00
@lihongming emmmmm,我这里不考虑兼容性的做法是直接写最终执行的代码,也就是 ES6 (目前是 ES2019,稍微超前一点的部分 ES2020 也用,比如 BigInt 啥的),而不经过 Webpack babel 之类“编译”,直接用就好……
因为,我这里目标用户基本都是 Chrome Firefox 这些了……所以不需要考虑向下兼容……

直接写最终代码,在调试断点的时候,是真的爽……毕竟代码没有被转换为 ES3 ES5 这些的等效代码,而是浏览器解释器直接内部实现,速度更快,调试的时候非常爽!
babel 转码过之后大部分都是 ES3 ES5 的代码,载入 Source Map 又卡又慢,断点还时不时打不到正确的位置上……
miniwade514
2019-12-28 10:48:07 +08:00
不用兼容 8- 也算是幸福的事了?当年需要兼容的时候也不见得都是手撸兼容啊,那几位在秀什么。
querySelector 的性能不需要纠结,你的 DOM 树八成还没有复杂到需要纠结这种基础 API 性能的地步。
grewer
2019-12-28 11:03:26 +08:00
GitHub 都在全面用 querySelector 这种方法了
lisisi
2019-12-28 11:28:27 +08:00
@yimity 可能是你说的这个原因,id 是写死的没问题,id 是中间生成的,querySelector 就选不到了,只能用 getElementBy 来取。
secondwtq
2019-12-28 12:09:59 +08:00
@grewer 不能拿 GitHub 做例子,据我观察 GitHub 是最激进的站点之一,我 Mac 上的老版 Chrome,GitHub 不能加载最新 commit,branch 的菜单点不开。另外 YouTube 不能看。

其他网站没出过问题,说明 GitHub 和 Google 可能确实对浏览器要求比较高。
secondwtq
2019-12-28 13:21:54 +08:00
@yimity
“getElementBy 获取到的是动态的,即 你增加了 dom,再获取还是可以获取到你最新增加的的,你删掉了 dom,再获取的时候,之前获取到的就不在了,就是每次都是实时从 dom 树里面获取。
而 querySelector 是引用,即获取一次后面增加的 dom,不会获取到了,删掉了 dom, 在代码中还是能够用(但是会报错)。”

求依据:标准,源码,或示例
你说的可能是 getElementByClassName/TagName 和 querySelectorAll
楼主这个好像没这个区别
uqf0663
2019-12-28 14:25:41 +08:00
在本页按 F12 在控制台输入
const q = 'q';
document.querySelector("#" + q).value="可以啊";

能够正常往最上面的搜索 input 写字啊,没问题啊,哪里不行了?
jsq2627
2019-12-28 17:21:36 +08:00
除了用法上,功能上没区别

用法上,很多人会忽视掉 css selector 的 escaping 问题,例如对于:
<div id="123" />
用 document.getElementById("123") 是没问题的,但是 document.querySelector("#123") 就是不对的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX