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?


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>';
}

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.


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


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.


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>

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


5
"jQuery"! = "javascript" || jQuery <javascript || OP.indexOf ("jQuery") <1
— KittenCodings

4

Você pode usar o jQuery:

$("#topBar").on("click",function(){
        $("#content").load("content.html");
});

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


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


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.


0

Use este código simples

<div w3-include-HTML="content.html"></div>
<script>w3.includeHTML();</script>
</body>```

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>

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"/>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.