w3schools metodos ejemplos javascript native-methods

metodos - methods class javascript



Haciendo un alias corto para document.querySelectorAll (7)

Voy a ejecutar document.querySelectorAll () mucho, y me gustaría tener un alias de taquigrafía.

var queryAll = document.querySelectorAll queryAll(''body'') TypeError: Illegal invocation

No funciona Mientras:

document.querySelectorAll(''body'')

Todavía lo hace. ¿Cómo puedo hacer que el alias funcione?


El intérprete de JavaScript querySelectorAll() un error porque se debe invocar querySelectorAll() en el contexto del documento.

Se produce el mismo error cuando está intentando llamar a console.log() alias.

Así que necesitas envolverlo así:

function x(selector) { return document.querySelectorAll(selector); }


Esto funcionaría, necesita invocar el alias usando call() o apply() con el contexto apropiado.

func.call(context, arg1, arg2, ...) func.apply(context, [args]) var x = document.querySelectorAll; x.call(document, ''body''); x.apply(document, [''body'']);


Esto parece funcionar:

var queryAll = document.querySelectorAll.bind(document);

bind devuelve una referencia a la función querySelectorAll , cambiando el contexto de ''this'' dentro del método querySelectorAll para que sea el objeto de documento.

La función de enlace solo se admite en IE9 + (y en todos los demás navegadores) - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind

Actualización: De hecho, podría crear accesos directos a toda una gama de métodos de documentos como este:

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);


Mi solución cubre los cuatro casos de uso siguientes:

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

El código:

let doc=document, qsa=(s,o=doc)=>o.querySelectorAll(s), qs=(s,o=doc)=>o.querySelector(s);

En términos de parámetros, se requiere el selector s , pero el objeto del elemento contenedor o es opcional.

Uso:

  • qs("div") : consulta todo el documento para el primer div, devuelve ese elemento
  • qsa("div") : consulta todo el documento para todos los divs, devuelve una lista de nodos de todos esos elementos
  • qs("div", myContainer) : las consultas justo dentro del elemento myContainer para el primer div, devuelven ese elemento
  • qsa("div", myContainer) : consultas dentro del elemento myContainer para todos los divs, devuelve una lista de nodos de todos esos elementos

Para hacer el código un poco más corto (pero no tan eficiente), el código qs podría escribirse de la siguiente manera:

let qs=(s,o=doc)=>qsa(s,o)[0];

El código anterior utiliza las características de ES6 ( let , funciones de flecha y valores de parámetros predeterminados). Un equivalente de ES5 es:

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

o la versión ES5 equivalente más corta pero menos eficiente de qs :

var qs=function(s,o){return qsa(s,o)[0];};

A continuación se muestra una demostración de trabajo. Para asegurarse de que funciona en todos los navegadores, utiliza la versión ES5, pero si va a utilizar esta idea, recuerde que la versión ES6 es más corta:

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

<h3>Expecting "one", "oneNested", 3 and 2...</h3> <div id="one"> <div id="oneNested"></div> <div></div> </div>


Tomé el enfoque de @David Muller y lo formé con una lambda

let $ = (e) => document.querySelector(e); let $all = (e) => document.querySelectorAll(e);

Ejemplo:

$(''body''); // <body>...</body>


Una respuesta común es usar $ y $$ para querySelector y querySelectorAll . Este alias imita a jQuery.

Ejemplo:

$ = document.querySelector.bind(document) $$ = document.querySelectorAll.bind(document) $(''div'').style.color = ''blue'' $$(''div'').forEach(div => div.style.background = ''orange'')

div { margin: 2px; }

<div> test </div> <section> <div> hello </div> <div> foo </div> </section>


function x(expr) { return document.querySelectorAll(expr); }