Wie lade ich eine HTML-Seite mit JavaScript in ein <div>?

161

Ich möchte, dass home.html geladen wird <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>

Dies funktioniert gut, wenn ich Firefox verwende. Wenn ich Google Chrome verwende, wird nach einem Plug-In gefragt. Wie kann ich es in Google Chrome zum Laufen bringen?

Giliweed
quelle
1
Und denken Sie daran, false wie inload_home(); return false
mplungjan
2
Ohne Bibliotheken nicht so einfach. Könnte besser dran sein, in einen iFrame zu laden. Überprüfen Sie diesen Beitrag aus: stackoverflow.com/questions/14470135/…
sgeddes
1
home.html ist eine einfache Webseite, die ich gerade als home bezeichnet habe. @ Jayharris
Giliweed
Und Sie versuchen, alles auf dieser Seite in das Inhaltselement zu laden oder einfach einen Link zu der Seite im Inhaltselement zu platzieren?
Adeneo
Ich versuche, alles auf dieser Seite in das Inhaltselement zu laden. Ich habe die Frage bearbeitet. @adeneo
Giliweed

Antworten:

213

Ich habe endlich die Antwort auf mein Problem gefunden. Die Lösung ist

function load_home() {
     document.getElementById("content").innerHTML='<object type="text/html" data="home.html" ></object>';
}
Giliweed
quelle
3
Obwohl dies elegant und sauber ist, wäre es wahrscheinlich besser, wenn Sie das Objektelement tatsächlich über die DOM-API erstellen würden.
David
3
Dies ist langsam und unsicher anzugreifen - siehe meine Antwort unten (war zu lang, um in einen Kommentar zu passen)
Sam Redway
1
@ DavidMaes was schlägst du vor? Kannst du ein Beispiel zeigen?
Xsmael
2
Dies mag zwar unsicher sein, aber wenn Sie eine einfache Entwicklung "lokal in einem Ordner auf Ihrem Desktop" durchführen, ist dies in Ordnung - nicht jeder betreibt eine Bank-Website mit Kunden, die Bankkontoinformationen verarbeiten und in einen XSS-Angriff geraten. Vielen Dank für die Lösung. Für meine Anforderungen musste ich einen anderen Weg gehen und einen Python-Server benötigen und die reguläre Jquery load () -Funktion für externes dynamisch geladenes HTML verwenden. Aber dies war hilfreich, um mich in meiner Ausgabe
zurechtzufinden
1
@ KamilKiełczewski type="type/html"wird geändert intype="text/html"
Shayan
63

Sie können die jQuery-Ladefunktion verwenden:

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

Es tut uns leid. Bearbeitet für den Klick statt beim Laden.

Aaron Liske
quelle
Hallo, ich habe versucht, diese Methode zu verwenden, aber ich kann sie nicht zum Laufen bringen. Ich kann eine neue Frage öffnen, wenn Sie wollen. Vielen Dank. Meine Geige ist hier: jsfiddle.net/ekareem/aq9Laaew/288345
NoChance
52

API abrufen

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

XHR API

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

Basierend auf Ihren Einschränkungen sollten Sie Ajax verwenden und sicherstellen, dass Ihr Javascript vor dem Markup geladen wird, das die load_home()Funktion aufruft

Referenz - Davidwalsh

MDN - Verwenden von Fetch

JSFIDDLE-Demo

Jay Harris
quelle
Vielen Dank. Mein Code bezieht sich jedoch auf einen Teil eines Projekts. und es tut mir leid zu sagen, dass ich iframe nicht in der Projektarbeit verwenden soll. Ich habe die Frage bearbeitet. Werfen Sie einen Blick @ Jay Harris
Giliweed
1
@ Jay Harris: Was ist mit der gleichen Herkunftspolitik?
ArunRaj
1
@ArunRaj Sie können keine Seite laden, die von einer anderen Website in Javascript stammt, da dies ein Sicherheitsrisiko darstellt. Sie können jedoch ein Skript von Ihrem Server laden, das wiederum die andere Seite lädt und über Ajax an Javascript zurücksendet.
Jay Harris
1
Das Hinzufügen eines Content-TypeHeaders zu einer GETAnfrage macht keinen Sinn - ich denke, Sie meinten setRequestHeader("Accept", "text/html")?
mindplay.dk
23

HTML auf moderne Javascript-Art abrufen

Dieser Ansatz nutzt moderne Javascript-Funktionen wie async/awaitund die fetchAPI. Es lädt HTML als Text herunter und führt es dann in das innerHTMLContainerelement ein.

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

Das await (await fetch(url)).text()mag etwas knifflig erscheinen, ist aber leicht zu erklären. Es hat zwei asynchrone Schritte und Sie können diese Funktion folgendermaßen umschreiben:

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

Weitere Informationen finden Sie in der Dokumentation zur Abruf-API .

Lucio Paiva
quelle
Stellen Sie bei Problemen sicher, dass die Funktionen außerhalb der Funktion "window.onload" geschrieben sind.
Winter Cara
19

Ich habe das gesehen und fand es ganz gut, also habe ich einige Tests durchgeführt.

Es mag wie ein sauberer Ansatz erscheinen, aber in Bezug auf die Leistung liegt er um 50% zurück, verglichen mit der Zeit, die zum Laden einer Seite mit der jQuery-Ladefunktion oder zur Verwendung des Vanille-Javascript-Ansatzes von XMLHttpRequest benötigt wurde, die sich in etwa ähnelten.

Ich kann mir vorstellen, dass dies daran liegt, dass die Seite unter der Haube genau auf die gleiche Weise abgerufen wird, aber auch ein ganz neues HTMLElement-Objekt erstellt werden muss.

Zusammenfassend schlage ich vor, jQuery zu verwenden. Die Syntax ist so einfach wie möglich zu bedienen und hat einen gut strukturierten Rückruf, den Sie verwenden können. Es ist auch relativ schnell. Der Vanille-Ansatz kann einige Millisekunden schneller sein, aber die Syntax ist verwirrend. Ich würde dies nur in einer Umgebung verwenden, in der ich keinen Zugriff auf jQuery hatte.

Hier ist der Code, den ich zum Testen verwendet habe - er ist ziemlich rudimentär, aber die Zeiten sind über mehrere Versuche hinweg sehr konsistent zurückgekommen, sodass ich jeweils eine Genauigkeit von etwa + - 5 ms angeben würde. Tests wurden in Chrome von meinem eigenen Heimserver ausgeführt:

<!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
quelle
1
Ich denke, anstatt "genau" meinst du "genau".
Puls0ne
Ich meine, ich habe es viele Male ausgeführt und es gab jedes Mal nur ein paar Millisekunden. Die angegebenen Zeiten sind also auf + - 5 ms oder etwas in der Nähe genau. Entschuldigung, ich war dort vielleicht nicht ganz klar.
Sam Redway
6

Beim Benutzen

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

Denken Sie dann daran, dass Sie in Chrome nicht lokal "debuggen" können, da XMLHttpRequest nicht geladen werden kann. Dies bedeutet NICHT, dass es nicht funktioniert, sondern nur, dass Sie Ihren Code auf derselben Domain aka testen müssen. Ihr Server

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

Sie können die jQuery verwenden:

$("#topBar").on("click",function(){
        $("#content").load("content.html");
});
Anup
quelle
3
Bitte erläutern Sie Ihre Antwort. Auch dies sieht aus wie jQuery, das das OP in der Frage nicht erwähnt hat.
David
2
Sir hier einige weitere Antworten ist in jquery
Anup
jQuery ist ein Standard für solche Ajax-Aufrufe. Daher finde ich die Antwort kurz und angemessen.
Luca
2

Versuchen

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

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

oder

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

Es gibt dieses Plugin auf Github, das Inhalte in ein Element lädt. Hier ist das Repo

https://github.com/abdi0987/ViaJS

Führen Sie Grub aus
quelle
0

Dies wird normalerweise benötigt, wenn Sie header.php oder eine andere Seite einfügen möchten.

In Java ist es einfach, besonders wenn Sie eine HTML-Seite haben und die PHP-Include-Funktion nicht verwenden möchten, aber Sie sollten überhaupt die PHP-Funktion schreiben und sie als Java-Funktion in das Skript-Tag einfügen.

In diesem Fall sollten Sie es ohne Funktion schreiben, gefolgt vom Namen Just. Skript rage das Funktionswort und starte die Include-Datei header.php Dh konvertiere die PHP-Include-Funktion in die Java-Funktion im Skript-Tag und platziere deinen gesamten Inhalt in der enthaltenen Datei.

Creative87
quelle
0

Verwenden Sie diesen einfachen Code

<div w3-include-HTML="content.html"></div>
<script>w3.includeHTML();</script>
</body>```
Cak Sup
quelle
w3.includeHTML () ist nicht definiert
toing_toing
Für diejenigen, die sich fragen, w3-include-HTMList Teil der Skriptbibliothek von W3Schools.com W3.JS(hier verfügbar: w3schools.com/w3js/default.asp ). Ich möchte darauf hinweisen, dass W3Schools (und w3.js und w3.includeHTML()) in keiner Weise mit dem W3-Konsortium verbunden sind (eine der beiden Hauptgruppen, die die HTML + CSS + DOM-Standards definieren (die andere Gruppe ist 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
quelle
1
Beantwortung mit einer Antwort, die nicht der Frage entspricht, auch die bereits von derselben Person beantwortet wurde, die sie gestellt hat
Katler
-5

Wenn sich Ihre HTML-Datei lokal befindet, wählen Sie iframe anstelle des Tags. Tags funktionieren nicht browserübergreifend und werden hauptsächlich für Flash verwendet

Zum Beispiel: <iframe src="home.html" width="100" height="100"/>

Jain Abhishek
quelle