推荐关注
› Meteor
› JSLint - a JavaScript code quality tool
› jsFiddle
› D3.js
› WebStorm
推荐书目
› JavaScript 权威指南第 5 版
› Closure: The Definitive Guide
lisisi

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

  •  
  •   lisisi · Dec 27, 2019 · 8019 views
    This topic created in 2510 days ago, the information mentioned may be changed or developed.

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

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

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

    32 replies  •  2019-12-28 17:21:36 +08:00
    Danswerme
    Danswerme
    Dec 27, 2019 via Android
    1
    1. querySelector 接收一个 css 选择器字符串,比如 "#root > .nav:nth-child(1)",后者只能接收 id 名称。
    2. 请检查你的代码
    ysc3839
    ysc3839
    Dec 27, 2019 via Android
    2
    我觉得没有优势,因为要解析 css 选择器。
    Cbdy
    Cbdy
    Dec 27, 2019
    3
    没有区别
    stillsilly
    stillsilly
    Dec 27, 2019 via iPhone
    4
    有区别,不过我现在在外面没时间也没电脑,晚上回家没人回答的话我来解释一下
    lisisi
    lisisi
    OP
    Dec 27, 2019
    5
    @Danswerme document.getElementById("id") 中的 id 可以直接把变量传进来,document.querySelector("#id") 中的 id 并没有看到可用的传值方式。不知道你有没有明白我说的问题?
    littlepanzh
    littlepanzh
    Dec 27, 2019 via iPhone
    6
    现在的前端真幸福,不用考虑 IE6 7
    noreplay
    noreplay
    Dec 27, 2019
    7
    MDN 上有解释
    https://developer.mozilla.org/zh-CN/docs/Web/API/Document/getElementById

    然而你的那个代码是有效的。
    你可以打开控制台,试下下面的代码
    const id="Wrapper";
    document.querySelector('#'+id)
    lxk11153
    lxk11153
    Dec 27, 2019
    8
    @Danswerme #1 对于问题 1,求深入点,内部实现呢?仅比较 getElementById("id")和 querySelector("#id"),内部会不会掉用到同一处实现呢?你这回答的太表象了,肉眼都能识别啊
    @lisisi #5 对于问题 2,字符串拼接传咯?有什么问题?
    429463267
    429463267
    Dec 27, 2019 via Android
    9
    你说的是 jsoup api ?
    VDimos
    VDimos
    Dec 27, 2019 via Android
    10
    这还新方法,这 api 不都好久了吗
    netChen
    netChen
    Dec 27, 2019
    11
    还是楼上那句话,现在前端真幸福,不用考虑 IE6
    autoxbc
    autoxbc
    Dec 27, 2019
    12
    从一致性上说,应该只使用 querySelector,其他元素选择方法一律弃用

    不要考虑性能问题,这是引擎设计者应该考虑的,可维护性才是重点
    lxk11153
    lxk11153
    Dec 27, 2019
    13
    @noreplay #7 之前还没注意,querySelector 有 2 个
    - Document.getElementById()
    - Document.querySelector() https://developer.mozilla.org/zh-CN/docs/Web/API/Document
    - Element.querySelector() https://developer.mozilla.org/zh-CN/docs/Web/API/Element

    So: document.querySelector("#id")和 document.getElementById("id")内部会不会调用到同一处实现呢?
    vanishcode
    vanishcode
    Dec 27, 2019
    14
    一个是静态一个是动态
    前者是后者的引用所以要慢一些
    不知道是不是记错了。。。欢迎老哥指正。。。
    Mutoo
    Mutoo
    Dec 27, 2019
    15
    @lxk11153 当然是同一个,因为 Document 和 Element 的 querySelector() 都是继承自 ParentNode.querySelector()
    lxk11153
    lxk11153
    Dec 27, 2019
    16
    @Mutoo #15 感谢,文档还是没有源码细。。
    Talk is cheap show me the code.
    Code never lies, comments sometimes do.
    zhlssg
    zhlssg
    Dec 27, 2019
    17
    querySelector 和 querySelector 可以代替 className, tagName, id 这些旧的 api,好记也是优点吧
    zhlssg
    zhlssg
    Dec 27, 2019
    18
    @zhlssg querySelectorAll
    secondwtq
    secondwtq
    Dec 27, 2019
    19
    #8 难道是楼主的小号 ...

    用 querySelector + 字符串拼接意味着可以 query 的不只 id ... 在输入的字符串后面可以加其他选择器

    @ysc3839 选择器只用解析一遍,有缓存
    但是用来做同样的工作,前者是要稍微慢一点(因为确实包了一层)
    geelaw
    geelaw
    Dec 28, 2019 via iPhone❤️1
    20
    lihongming
    lihongming
    Dec 28, 2019 via iPhone
    21
    @littlepanzh 现在前端的发展趋势是根本不写最终执行的代码,而是全都用最新语法(现在是 ES6 ),并用 webpack 之类的工具“编译”成可执行的代码,所以根本不用考虑兼容性。
    yimity
    yimity
    Dec 28, 2019❤️1
    22
    你的传 id 变量的代码没问题,不过传变量是最基础的知识了。
    getElementBy 获取到的是动态的,即 你增加了 dom,再获取还是可以获取到你最新增加的的,你删掉了 dom,再获取的时候,之前获取到的就不在了,就是每次都是实时从 dom 树里面获取。
    而 querySelector 是引用,即获取一次后面增加的 dom,不会获取到了,删掉了 dom, 在代码中还是能够用(但是会报错)。
    old9
    old9
    Dec 28, 2019 via Android
    23
    本帖这都是些什么乱七八糟的
    c6h6benzene
    c6h6benzene
    Dec 28, 2019 via iPhone
    24
    昨天刚看到,现学现用:

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

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

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

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

    能够正常往最上面的搜索 input 写字啊,没问题啊,哪里不行了?
    jsq2627
    jsq2627
    PRO
    Dec 28, 2019
    32
    除了用法上,功能上没区别

    用法上,很多人会忽视掉 css selector 的 escaping 问题,例如对于:
    <div id="123" />
    用 document.getElementById("123") 是没问题的,但是 document.querySelector("#123") 就是不对的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4334 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 928ms · UTC 07:39 · PVG 15:39 · LAX 23:39 · JFK 02:39
    ♥ Do have faith in what you're doing.