Como carregar uma página HTML em um <div> usando JavaScript?

161

Quero que o home.html seja carregado <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>

Isso funciona bem quando eu uso o Firefox. Quando uso o Google Chrome, ele solicita plug-in. Como faço para funcionar no Google Chrome?

Giliweed
fonte
1
E lembre-se de retornar falso como emload_home(); return false
mplungjan
2
Não é muito fácil sem bibliotecas. Pode ser melhor carregar o iFrame. Verifique esta publicação: stackoverflow.com/questions/14470135/…
sgeddes
1
home.html é uma página da web simples, que acabei de chamar de lar. @jayharris
Giliweed
E você está tentando carregar tudo nessa página no elemento de conteúdo ou apenas colocar um link para a página no elemento de conteúdo?
adeneo
Estou tentando carregar tudo nessa página no elemento de conteúdo. Eu editei a pergunta. @adeneo
Giliweed

Respostas:

213

Finalmente encontrei a resposta para o meu problema. A solução é

function load_home() {
     document.getElementById("content").innerHTML='<object type="text/html" data="home.html" ></object>';
}
Giliweed
fonte
3
Mesmo que isso seja elegante e limpo, suponho que seria melhor se você realmente criasse o elemento de objeto por meio da API do DOM.
David
3
Isso é lento e inseguro para atacar - veja minha resposta abaixo (foi muito longo para caber no comentário)
Sam Redway
1
@DavidMaes, o que você sugere? você pode mostrar uma amostra?
Xsmael
2
Embora isso possa ser inseguro, se você estiver desenvolvendo um simples "local dentro de uma pasta na área de trabalho", tudo bem - nem todo mundo está executando um site bancário com clientes manipulando informações da conta bancária e enfrentando um ataque XSS. Obrigado pela solução, por minhas necessidades, acabei tendo que seguir outra rota, exigindo um servidor python e usando a função Jquery load () regular para html externo carregado dinamicamente. Mas isso foi útil para obter-me ao longo de meu problema
rwarner
1
@ KamilKiełczewski type="type/html"foi alterado paratype="text/html"
Shayan
63

Você pode usar a função de carregamento do 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>

Desculpe. Editado para o clique ao invés de carregar.

Aaron Liske
fonte
Olá, tentei usar esse método, mas não consigo fazê-lo funcionar. Posso abrir uma nova pergunta, se você quiser. Obrigado. Meu violino está aqui: jsfiddle.net/ekareem/aq9Laaew/288345
NoChance
52

API de busca

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

com base em suas restrições, você deve usar o ajax e garantir que o seu javascript seja carregado antes da marcação que chama a load_home()função

Referência - davidwalsh

MDN - Usando a busca

Demonstração JSFIDDLE

Jay Harris
fonte
obrigado. mas meu código está relacionado a uma parte de um projeto. e lamento dizer que não devo usar o iframe no trabalho do projeto. Eu editei a pergunta. Dê uma olhada @jay harris
Giliweed
1
@ Jay Harris: E a mesma política de origem?
ArunRaj
1
@ArunRaj, você não pode carregar uma página que vem de outro site dentro do javascript bc, é uma preocupação de segurança. mas você pode carregar um script do seu servidor, que, por sua vez, carrega a outra página e a repete no javascript via ajax.
Jay Harris
1
Adicionar um Content-Typecabeçalho a uma GETsolicitação não faz sentido - acho que você quis dizer setRequestHeader("Accept", "text/html")?
mindplay.dk
24

Buscando HTML da maneira Javascript moderna

Essa abordagem utiliza recursos modernos de Javascript, como async/awaita fetchAPI. Ele faz o download do HTML como texto e o alimenta no innerHTMLelemento do seu contêiner.

/**
  * @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");
}

A await (await fetch(url)).text()pode parecer um pouco complicado, mas é fácil de explicar. Possui duas etapas assíncronas e você pode reescrever essa função assim:

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

Consulte a documentação da API de busca para obter mais detalhes.

Lucio Paiva
fonte
Para aqueles que estão tendo problemas com isso, verifique se as funções estão gravadas fora da função "window.onload".
Winter Cara
19

Eu vi isso e achei muito legal, então fiz alguns testes.

Pode parecer uma abordagem simples, mas em termos de desempenho, ela está atrasada em 50% em comparação com o tempo que levou para carregar uma página com a função de carregamento do jQuery ou com o uso da abordagem de javascript vanilla do XMLHttpRequest, que eram aproximadamente similares.

Imagino que isso ocorra porque, sob o capô, a página fica exatamente da mesma maneira, mas também tem que lidar com a construção de um novo objeto HTMLElement.

Em resumo, sugiro usar o jQuery. A sintaxe é tão fácil de usar quanto possível e possui uma chamada de retorno bem estruturada para você usar. Também é relativamente rápido. A abordagem de baunilha pode ser mais rápida em alguns milissegundos imperceptíveis, mas a sintaxe é confusa. Eu usaria isso apenas em um ambiente em que não tivesse acesso ao jQuery.

Aqui está o código que eu usei para testar - é bastante rudimentar, mas os tempos voltaram muito consistentes em várias tentativas, então eu diria preciso em cerca de + - 5ms em cada caso. Os testes foram executados no Chrome a partir do meu próprio 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
fonte
1
Eu acho que em vez de "preciso" você quer dizer "preciso".
pulse0ne
Quero dizer, eu o executei muitas vezes e houve apenas um balanço de alguns milissegundos por vez. Portanto, os tempos indicados são precisos para + - 5ms ou algo próximo disso. Desculpe, talvez eu não tenha sido totalmente claro lá.
Sam Redway
6

Ao usar

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

Lembre-se de que não é possível "depurar" no chrome localmente, porque o XMLHttpRequest não pode carregar - isso NÃO significa que não funciona, apenas significa que você precisa testar seu código no mesmo domínio aka. seu servidor

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

Você pode usar o jQuery:

$("#topBar").on("click",function(){
        $("#content").load("content.html");
});
Anup
fonte
3
Por favor, explique sua resposta. Além disso, isso parece jQuery, que o OP não mencionou na pergunta.
David
2
senhor aqui mais algumas respostas é em jQuery
Anup
O jQuery é bastante padrão para realizar chamadas Ajax; então eu acho a resposta concisa e apropriada.
Luca
2

experimentar

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

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

ou

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

Isso geralmente é necessário quando você deseja incluir o header.php ou qualquer outra página.

Em Java, é fácil, especialmente se você possui uma página HTML e não deseja usar a função php include, mas você deve escrever a função php e adicioná-la como função Java na tag de script.

Nesse caso, você deve escrevê-lo sem a função seguida pelo nome Just. O script enfurece a palavra da função e inicia o include header.php Ou seja, converte a função php include na função Java na tag script e coloca todo o seu conteúdo nesse arquivo incluído.

Criativo87
fonte
0

Use este código simples

<div w3-include-HTML="content.html"></div>
<script>w3.includeHTML();</script>
</body>```
Cak Sup
fonte
w3.includeHTML () não está definido
toing_toing
Para quem se pergunta, w3-include-HTMLfaz parte da W3.JSbiblioteca de scripts do W3Schools.com (disponível aqui: w3schools.com/w3js/default.asp ). Quero ressaltar que o W3Schools (e o w3.js e w3.includeHTML()) não são de forma alguma afiliados ao Consórcio W3 (um dos dois principais grupos que definem os padrões HTML + CSS + DOM (o outro grupo é o 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
fonte
1
Respondendo a uma resposta que não corresponde à pergunta, também o seu já foi respondida pela mesma pessoa que fez isso
Katler
-5

Se o seu arquivo html reside localmente, escolha iframe em vez da tag. tags não funcionam em vários navegadores e são usadas principalmente para Flash

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

Jain Abhishek
fonte