为document.querySelectorAll创建一个简短的别名

mik*_*ana 47 javascript native-methods

我将运行document.querySelectorAll()很多,并且想要一个简写别名.

var queryAll = document.querySelectorAll

queryAll('body')
TypeError: Illegal invocation
Run Code Online (Sandbox Code Playgroud)

不行.鉴于:

document.querySelectorAll('body')
Run Code Online (Sandbox Code Playgroud)

仍然.如何使别名起作用?

Sun*_*oot 81

这似乎有效:

var queryAll = document.querySelectorAll.bind(document);
Run Code Online (Sandbox Code Playgroud)

bind返回对querySelectorAll函数的引用,将querySelectorAll方法中的'this'的上下文更改为文档对象.

绑定功能仅在IE9 +(以及所有其他浏览器)中受支持 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind


更新:事实上,您可以创建一系列文档方法的快捷方式,如下所示:

var query = document.querySelector.bind(document);
var queryAll = document.querySelectorAll.bind(document);
var fromId = document.getElementById.bind(document);
var fromClass = document.getElementsByClassName.bind(document);
var fromTag = document.getElementsByTagName.bind(document);
Run Code Online (Sandbox Code Playgroud)

  • 绑定函数queryAll是ES6中已知的*外来函数对象*(来自ECMAScript 6的术语).这个链接有一些很好的例子......应该说有一群人经过*The Good Parts*强烈建议不要在你自己的代码中做"这个",这很快就会让人感到困惑. (2认同)
  • 我发现这特别有用:`const $ = document.querySelector.bind(document); const $$ = document.querySelectorAll.bind(document);`。 (2认同)

小智 14

JavaScript解释器抛出错误,因为querySelectorAll()应该在文档上下文中调用.

当您尝试调用console.log()别名时,会抛出相同的错误.

所以你需要像这样包装它:

 function x(selector) {
     return document.querySelectorAll(selector);
 }
Run Code Online (Sandbox Code Playgroud)


alo*_*ica 11

一个常见的答案是使用$$$for querySelectorquerySelectorAll.这个别名模仿jQuery的一个.

例:

$ = document.querySelector.bind(document)
$$ = document.querySelectorAll.bind(document)

$('div').style.color = 'blue'
$$('div').forEach(div => div.style.background = 'orange')
Run Code Online (Sandbox Code Playgroud)
div {
  margin: 2px;
}
Run Code Online (Sandbox Code Playgroud)
<div>
  test
</div>
<section>
  <div>
    hello
  </div>
  <div>
    foo
  </div>
</section>
Run Code Online (Sandbox Code Playgroud)


And*_*ems 8

我的解决方案涵盖以下四个用例:

  • document.querySelector(...)
  • document.querySelectorAll(...)
  • element.querySelector(...)
  • element.querySelectorAll(...)

代码:

let doc=document,
    qsa=(s,o=doc)=>o.querySelectorAll(s),
    qs=(s,o=doc)=>o.querySelector(s);
Run Code Online (Sandbox Code Playgroud)

在参数方面,选择器s是必需的,但容器元素对象o是可选的.

用法:

  • qs("div"):查询第一个div的整个文档,返回该元素
  • qsa("div"):查询所有div的整个文档,返回所有这些元素的nodeList
  • qs("div", myContainer):在第一个div的myContainer元素内查询,返回该元素
  • qsa("div", myContainer):在所有div的myContainer元素内查询,返回所有这些元素的nodeList

为了使代码稍微缩短(但效率不高),qs代码可以写成如下:

let qs=(s,o=doc)=>qsa(s,o)[0];
Run Code Online (Sandbox Code Playgroud)

上面的代码使用ES6功能(let箭头功能和默认参数值).ES5等价物是:

var doc=document,
    qsa=function(s,o){return(o||doc).querySelectorAll(s);},
    qs=function(s,o){return(o||doc).querySelector(s);};
Run Code Online (Sandbox Code Playgroud)

或相当于较短但效率较低的ES5版本qs:

var qs=function(s,o){return qsa(s,o)[0];};
Run Code Online (Sandbox Code Playgroud)

下面是一个工作演示.为确保它适用于所有浏览器,它使用ES5版本,但如果您打算使用此想法,请记住ES6版本更短:

var doc = document;

var qs=function(s,o){return(o||doc).querySelector(s);},
    qsa=function(s,o){return(o||doc).querySelectorAll(s);}

var show=function(s){doc.body.appendChild(doc.createElement("p")).innerHTML=s;}

//           ____demo____       _____long equivalent______      __check return___      _expect__ 
//          |            |     |                          |    |                 |    |         |

let one   = qs("div");      /* doc.querySelector   ("#one") */ show(one  .id    ); // "one"
let oneN  = qs("div",one);  /* one.querySelector   ("div")  */ show(oneN .id    ); // "oneNested"
let many  = qsa("div");     /* doc.querySelectorAll("div")  */ show(many .length); // 3
let manyN = qsa("div",one); /* one.querySelectorAll("div")  */ show(manyN.length); // 2
Run Code Online (Sandbox Code Playgroud)
<h3>Expecting "one", "oneNested", 3 and 2...</h3>
<div id="one">
  <div id="oneNested"></div>
  <div></div>
</div>
Run Code Online (Sandbox Code Playgroud)


Gab*_*abe 7

这可以工作,您需要使用call()apply()使用适当的上下文来调用别名.

func.call(context, arg1, arg2, ...) 
func.apply(context, [args]) 

var x = document.querySelectorAll;
x.call(document, 'body');
x.apply(document, ['body']);
Run Code Online (Sandbox Code Playgroud)


sva*_*rog 5

我采用@David Muller的方法,并使用lambda对其进行了单行处理

let $ = (selector) => document.querySelector(selector);
let $all = (selector) => document.querySelectorAll(selector);
Run Code Online (Sandbox Code Playgroud)

例:

$('body');
// <body>...</body>
Run Code Online (Sandbox Code Playgroud)