¿Cómo cargo una página HTML en un <div> usando JavaScript?

161

Quiero que home.html se cargue <div id="content">.

<div id="topBar"> <a href ="#" onclick="load_home()"> HOME </a> </div>
<div id ="content"> </div>
<script>
      function load_home(){
            document.getElementById("content").innerHTML='<object type="type/html" data="home.html" ></object>';
  }
</script>

Esto funciona bien cuando uso Firefox. Cuando uso Google Chrome, me pide un complemento. ¿Cómo lo hago funcionar en Google Chrome?

Giliweed
fuente
1
Y recuerde devolver falso como enload_home(); return false
mplungjan
2
No es demasiado fácil sin bibliotecas. Podría ser mejor cargarlo en un iFrame. Mira esta publicación: stackoverflow.com/questions/14470135/…
sgeddes
1
home.html es una página web simple, solo la llamé home. @jayharris
Giliweed
¿Y está intentando cargar todo en esa página en el elemento de contenido, o simplemente colocar un enlace a la página en el elemento de contenido?
adeneo
Estoy tratando de cargar todo en esa página en el elemento de contenido. Edité la pregunta. @adeneo
Giliweed

Respuestas:

213

Finalmente encontré la respuesta a mi problema. La solucion es

function load_home() {
     document.getElementById("content").innerHTML='<object type="text/html" data="home.html" ></object>';
}
Giliweed
fuente
3
Aunque esto es elegante y limpio, supongo que sería mejor si realmente crearas el elemento objeto a través de la API del DOM.
David
3
Esto es lento e inseguro para atacar - vea mi respuesta a continuación (fue demasiado largo para caber en el comentario)
Sam Redway
1
@DavidMaes, ¿qué sugieres? puedes mostrar una muestra?
Xsmael
2
Si bien esto puede ser inseguro, si está haciendo un desarrollo simple "local dentro de una carpeta en su escritorio", está bien: no todos están ejecutando un sitio web bancario con clientes que manejan la información de la cuenta bancaria y se enfrentan a un ataque XSS. Gracias por la solución, para mis necesidades terminé teniendo que ir a otra ruta y requerir un servidor python y usar la función Jquery load () regular para html externo cargado dinámicamente. Pero esto fue útil para llevarme bien en mi problema
rwarner
1
@ KamilKiełczewski type="type/html"cambia atype="text/html"
Shayan
63

Puede usar la función de carga jQuery:

<div id="topBar">
    <a href ="#" id="load_home"> HOME </a>
</div>
<div id ="content">        
</div>

<script>
$(document).ready( function() {
    $("#load_home").on("click", function() {
        $("#content").load("content.html");
    });
});
</script>

Lo siento. Editado para hacer clic en lugar de cargar.

Aaron Liske
fuente
Hola, intenté usar este método pero no consigo que funcione. Puedo abrir una nueva pregunta si quieres. Gracias. Mi violín está aquí: jsfiddle.net/ekareem/aq9Laaew/288345
NoChance
52

Recuperar API

function load_home (e) {
    (e || window.event).preventDefault();

    fetch("http://www.yoursite.com/home.html" /*, options */)
    .then((response) => response.text())
    .then((html) => {
        document.getElementById("content").innerHTML = html;
    })
    .catch((error) => {
        console.warn(error);
    });
} 

API XHR

function load_home (e) {
  (e || window.event).preventDefault();
  var con = document.getElementById('content')
  ,   xhr = new XMLHttpRequest();

  xhr.onreadystatechange = function (e) { 
    if (xhr.readyState == 4 && xhr.status == 200) {
      con.innerHTML = xhr.responseText;
    }
  }

  xhr.open("GET", "http://www.yoursite.com/home.html", true);
  xhr.setRequestHeader('Content-type', 'text/html');
  xhr.send();
}

basado en sus restricciones, debe usar ajax y asegurarse de que su javascript esté cargado antes del marcado que llama a la load_home()función

Referencia - davidwalsh

MDN - Utilizando Fetch

Demo de JSFIDDLE

Jay Harris
fuente
Gracias. pero mi código se relaciona con una parte de un proyecto. y lamento decir que no se supone que use iframe en el trabajo del proyecto. Edité la pregunta. echa un vistazo @jay harris
Giliweed
1
@ Jay Harris: ¿Qué pasa con la misma política de origen?
ArunRaj
1
@ArunRaj no puede cargar una página que proviene de otro sitio web dentro de javascript bc, es un problema de seguridad. pero puede cargar un script desde su servidor, que a su vez cargará esa otra página y la devolverá a javascript a través de ajax.
Jay Harris
1
Agregar un Content-Typeencabezado a una GETsolicitud no tiene sentido, ¿creo que quisiste decir setRequestHeader("Accept", "text/html")?
mindplay.dk
24

Obteniendo HTML a la manera moderna de Javascript

Este enfoque hace uso de características modernas de Javascript como async/awaity la fetchAPI. Descarga HTML como texto y luego lo alimenta al innerHTMLelemento del contenedor.

/**
  * @param {String} url - address for the HTML to fetch
  * @return {String} the resulting HTML string fragment
  */
async function fetchHtmlAsText(url) {
    return await (await fetch(url)).text();
}

// this is your `load_home() function`
async function loadHome() {
    const contentDiv = document.getElementById("content");
    contentDiv.innerHTML = await fetchHtmlAsText("home.html");
}

El await (await fetch(url)).text()puede parecer un poco complicado, pero es fácil de explicar. Tiene dos pasos asincrónicos y podría reescribir esa función de esta manera:

async function fetchHtmlAsText(url) {
    const response = await fetch(url);
    return await response.text();
}

Consulte la documentación de la API de recuperación para obtener más detalles.

Lucio Paiva
fuente
Para aquellos que tienen problemas para usar esto, asegúrese de que las funciones estén escritas fuera de la función "window.onload".
Winter Cara
19

Vi esto y pensé que se veía bastante bien, así que realicé algunas pruebas.

Puede parecer un enfoque limpio, pero en términos de rendimiento, está retrasado en un 50% en comparación con el tiempo que tardó en cargar una página con la función de carga jQuery o usando el enfoque de JavaScript de vainilla de XMLHttpRequest, que eran más o menos similares entre sí.

Me imagino que esto se debe a que debajo del capó obtiene la página exactamente de la misma manera, pero también tiene que lidiar con la construcción de un nuevo objeto HTMLElement.

En resumen, sugiero usar jQuery. La sintaxis es tan fácil de usar como puede ser y tiene una devolución de llamada bien estructurada para su uso. También es relativamente rápido. El enfoque de vainilla puede ser más rápido en unos pocos milisegundos, pero la sintaxis es confusa. Solo usaría esto en un entorno donde no tuviera acceso a jQuery.

Aquí está el código que solía probar: es bastante rudimentario, pero los tiempos volvieron muy consistentes en múltiples intentos, por lo que diría que son precisos a alrededor de + - 5 ms en cada caso. Las pruebas se ejecutaron en Chrome desde mi propio servidor doméstico:

<!DOCTYPE html>
<html>
<head>
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
</head>
<body>
    <div id="content"></div>
    <script>
        /**
        * Test harness to find out the best method for dynamically loading a
        * html page into your app.
        */
        var test_times  = {};
        var test_page   = 'testpage.htm';
        var content_div = document.getElementById('content');

        // TEST 1 = use jQuery to load in testpage.htm and time it.
        /*
        function test_()
        {
            var start = new Date().getTime();
            $(content_div).load(test_page, function() {
                alert(new Date().getTime() - start);
            });
        }

        // 1044
        */

        // TEST 2 = use <object> to load in testpage.htm and time it.
        /*
        function test_()
        {
            start = new Date().getTime();
            content_div.innerHTML = '<object type="text/html" data="' + test_page +
            '" onload="alert(new Date().getTime() - start)"></object>'
        }

        //1579
        */

        // TEST 3 = use httpObject to load in testpage.htm and time it.
       function test_()
       {
           var xmlHttp = new XMLHttpRequest();

           xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
                {
                   content_div.innerHTML = xmlHttp.responseText;
                   alert(new Date().getTime() - start);
                }
            };

            start = new Date().getTime();

            xmlHttp.open("GET", test_page, true); // true for asynchronous
            xmlHttp.send(null);

            // 1039
        }

        // Main - run tests
        test_();
    </script>
</body>
</html>
Sam Redway
fuente
1
Creo que en lugar de "exacto" te refieres a "preciso".
pulse0ne
Quiero decir que lo ejecuté muchas veces y solo hubo un cambio de unos pocos milisegundos cada vez. Entonces, los tiempos dados son precisos a + - 5ms o algo similar a eso. Lo siento, puede que no haya sido del todo claro allí.
Sam Redway
6

Cuando usas

$("#content").load("content.html");

Luego recuerde que no puede "depurar" en Chrome localmente, porque XMLHttpRequest no se puede cargar. Esto NO significa que no funcione, solo significa que necesita probar su código en el mismo dominio también conocido. su servidor

serup
fuente
55
"jQuery"! = "javascript" || jQuery <javascript || OP.indexOf ("jQuery") <1
KittenCodings
4

Puedes usar jQuery:

$("#topBar").on("click",function(){
        $("#content").load("content.html");
});
Anup
fuente
3
Por favor explique su respuesta. También esto parece jQuery que el OP no mencionó en la pregunta.
David
2
señor aquí hay algunas respuestas más en jquery
Anup
jQuery es bastante estándar para hacer tales llamadas Ajax; entonces encuentro la respuesta concisa y apropiada.
Luca
2

tratar

async function load_home(){
  content.innerHTML = await (await fetch('home.html')).text();
}

Kamil Kiełczewski
fuente
1
$("button").click(function() {
    $("#target_div").load("requesting_page_url.html");
});

o

document.getElementById("target_div").innerHTML='<object type="text/html" data="requesting_page_url.html"></object>';
Krishna pattar
fuente
0

Esto generalmente se necesita cuando desea incluir header.php o cualquier página.

En Java es fácil, especialmente si tiene una página HTML y no desea usar la función de inclusión de php, pero en absoluto debe escribir la función de php y agregarla como función de Java en la etiqueta del script.

En este caso, debe escribirlo sin función seguido del nombre Just. La secuencia de comandos utiliza la palabra de función e inicia el encabezado include.php Es decir, convierte la función de inclusión php en función Java en la etiqueta del script y coloca todo el contenido en ese archivo incluido.

Creativo87
fuente
0

Usa este código simple

<div w3-include-HTML="content.html"></div>
<script>w3.includeHTML();</script>
</body>```
Cak Sup
fuente
w3.includeHTML () no está definido
toing_toing
Para aquellos que se preguntan, w3-include-HTMLes parte de la W3.JSbiblioteca de scripts de W3Schools.com (disponible aquí: w3schools.com/w3js/default.asp ). Quiero señalar que W3Schools (y w3.js, y w3.includeHTML()) no son de ninguna manera afiliado con el Consorcio W3 (uno de los dos grupos principales que definen los estándares HTML + CSS + DOM siendo (el otro grupo WHATWG).
Dai
-4

showhide.html

<!DOCTYPE html>
<html>
    <head>
      <script type="text/javascript">
        function showHide(switchTextDiv, showHideDiv)
        {
          var std = document.getElementById(switchTextDiv);
          var shd = document.getElementById(showHideDiv);
          if (shd.style.display == "block")
          {
            shd.style.display = "none";
            std.innerHTML = "<span style=\"display: block; background-color: yellow\">Show</span>"; 
          }
          else
          {
            if (shd.innerHTML.length <= 0)
            {
              shd.innerHTML = "<object width=\"100%\" height=\"100%\" type=\"text/html\" data=\"showhide_embedded.html\"></object>";
            }
            shd.style.display = "block";
            std.innerHTML = "<span style=\"display: block; background-color: yellow\">Hide</span>";
          }
        }
      </script>
    </head>
    <body>
      <a id="switchTextDiv1" href="javascript:showHide('switchTextDiv1', 'showHideDiv1')">
        <span style="display: block; background-color: yellow">Show</span>
      </a>
      <div id="showHideDiv1" style="display: none; width: 100%; height: 300px"></div>
    </body>
</html>

showhide_embedded.html

<!DOCTYPE html>
<html>
    <head>
      <script type="text/javascript"> 
        function load()
        {
          var ts = document.getElementById("theString");
          ts.scrollIntoView(true);
        }
      </script>
    </head>
    <body onload="load()">
      <pre>
        some text 1
        some text 2
        some text 3
        some text 4
        some text 5
        <span id="theString" style="background-color: yellow">some text 6 highlight</span>
        some text 7
        some text 8
        some text 9
      </pre>
    </body>
</html>
Rudolf Remšík
fuente
1
Respondiendo con una respuesta que no corresponde a la pregunta, también ha sido respondida por la misma persona que la hizo
Katler,
-5

Si su archivo html reside localmente, busque iframe en lugar de la etiqueta. Las etiquetas no funcionan entre navegadores, y se utilizan principalmente para Flash

Por ej .: <iframe src="home.html" width="100" height="100"/>

Jain Abhishek
fuente