Equivalente a $.fn.load sin jQuery

3 minutos de lectura

avatar de usuario de perennial_
perenne_

Quiero cargar algo de contenido de Jade en un cierto div al hacer clic en el botón. Encontré cómo hacer esto con jQuery, hay varias publicaciones al respecto, y esencialmente lo que quiero hacer es

$('#div').load('/somePage');

Sin embargo, no puedo usar jQuery en mi proyecto. ¿Existe una función equivalente en Vanilla JavaScript?

  • “Vanilla JavaScript” no tiene provisiones para nada como ajax. Los navegadores tienen la antigua API XMLHttpRequest y los más nuevos admiten la fetch() API.

    – Puntiagudo

    30/06/2016 a las 20:20

  • Puedes encontrar algo similar en puede que no necesite jquery.com

    – Jimmy Ko

    30 de junio de 2016 a las 20:23

  • También vea el fetch API.

    – gcampbell

    30 de junio de 2016 a las 20:44

Avatar de usuario de Ali BARIN
Ali BARIN

Creo que puedes hacer esto con lo siguiente;

var request = new XMLHttpRequest();

request.open('GET', '/somepage', true);

request.onload = function() {
  if (request.status >= 200 && request.status < 400) {
    var resp = request.responseText;

    document.querySelector('#div').innerHTML = resp;
  }
};

request.send();

Por cierto, también puedes hacer esto con fetch API.

fetch('/somepage')
  .then(function(response) {
    return response.text();
  })
  .then(function(body) {
    document.querySelector('#div').innerHTML = body;
  });

Por cierto, puedes leer esta entrada de blog por aprender algo sobre la API de búsqueda.

  • Nota: la búsqueda no es compatible con ninguna de las versiones de IE, la última de Safari y la última de Firefox. desarrollador.mozilla.org/en-US/docs/Web/API/…

    –Jonathan Laliberté

    17 de junio de 2018 a las 23:25

  • @JonathanLaliberte No creo que ReadableStream sea necesario para tal caso. Entonces diría que todos los navegadores modernos (excepto IE) lo admiten. Además de eso, hay un polyfill para los navegadores que no son compatibles con Fetch. github.com/github/fetch

    – Ali BARIN

    19 de junio de 2018 a las 7:12

  • gran comienzo, pero nos falta la parte donde podemos especificar un subconjunto de la página devuelta. Encontré un comienzo en ese bit en un hilo separado.

    – cambio rápido

    21 de octubre de 2019 a las 1:10

  • me sale documento no definido

    – Normajean

    2 de abril de 2021 a las 8:28

  • @Normajean, ¿podría publicar una nueva pregunta con algunos fragmentos de código que tiene en uso?

    – Ali BARIN

    2 abr 2021 a las 14:37

Mientras intentaba resolver el mismo problema, hice esto, que se basa en la respuesta de Ali BARIN, y parece funcionar muy bien, pero es una versión un poco más explícita, agregando init información, y tiene algo de lógica para usar document.getElementById en lugar de querySelector.

/*
 * Replicates the functionality of jQuery's `load` function, 
 * used to load some HTML from another file into the current one.
 * 
 * Based on this Stack Overflow answer:
 * https://stackoverflow.com/a/38132775/3626537
 * And `fetch` documentation:
 * https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch
 * 
 * @param {string} parentElementId - The ID of the DOM element to load into
 * @param {string} htmlFilePath - The path of the HTML file to load
 */
const loadHtml = function(parentElementId, filePath) {
    const init = {
        method : "GET",
        headers : { "Content-Type" : "text/html" },
        mode : "cors",
        cache : "default"
    };
    const req = new Request(filePath, init);
    fetch(req)
        .then(function(response) {
            return response.text();
        })
        .then(function(body) {
            // Replace `#` char in case the function gets called `querySelector` or jQuery style
            if (parentElementId.startsWith("#")) {
                parentElementId.replace("#", "");
            }
            document.getElementById(parentElementId).innerHTML = body;

        });
};

  • ¿Cómo accede al documento en document.getElementById (parentElementId).innerHTML = cuerpo desde el lado del servidor? Me sale documento no está definido ..

    – Normajean

    2 de abril de 2021 a las 8:25

Puedes hacerlo así, pero hay algo a lo que tendrás que prestarle atención.

const getData = (url) => {
  return new Promise((resolve, reject) => {
    let request = new XMLHttpRequest();
    request.onload = function () {
      if (this.readyState === 4 && this.status === 200) {
        resolve(this.responseText);
      } else {
        reject(this.responseText);
      }
    };
    request.open("get", url, true);
    request.send();
  });
};

getData("Your URL")
  .then((resolve) => {
    console.log(resolve);
  })
  .catch((reject) => {
    console.error(reject);
  });

A lo que quiero que prestes atención es que si pones URL en una página, la devolverá <html> a </html> como cadena, supongo que no hay forma de separarse de él como método .load() en jQuery.

¿Ha sido útil esta solución?