Jak załadować stronę HTML w <div> używając JavaScript?


161

Chcę załadować plik home.html <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>

Działa to dobrze, gdy używam przeglądarki Firefox. Kiedy używam Google Chrome, prosi o wtyczkę. Jak sprawić, by działał w Google Chrome?


1
I pamiętaj, aby zwrócić fałsz jak wload_home(); return false
mplungjan

2
Nie jest łatwo bez bibliotek. Lepiej byłoby załadować do iFrame. Sprawdź ten post: stackoverflow.com/questions/14470135/ ...
sgeddes

1
home.html to prosta strona internetowa, nazwałem ją właśnie home. @jayharris
Giliweed

Próbujesz załadować wszystko na tej stronie do elementu treści, czy po prostu umieścić link do strony w elemencie treści?
adeneo

Próbuję załadować wszystko na tej stronie do elementu treści. Redagowałem pytanie. @adeneo
Giliweed

Odpowiedzi:


213

W końcu znalazłem odpowiedź na mój problem. Rozwiązaniem jest

function load_home() {
     document.getElementById("content").innerHTML='<object type="text/html" data="home.html" ></object>';
}

3
Chociaż jest to eleganckie i przejrzyste, przypuszczam, że byłoby lepiej, gdybyś faktycznie utworzył element obiektu za pomocą interfejsu DOM api.
David

3
To jest powolny i niepewny atak - zobacz moją odpowiedź poniżej (była zbyt długa, aby zmieścić się w komentarzu)
Sam Redway

1
@DavidMaes co proponujesz? czy możesz pokazać próbkę?
Xsmael

2
Chociaż może to być niebezpieczne, jeśli robisz proste programowanie „lokalnie w folderze na pulpicie”, jest to w porządku - nie każdy prowadzi witrynę banku z klientami obsługującymi informacje o kontach bankowych i atakiem XSS. Dzięki za rozwiązanie, dla moich potrzeb skończyło się na tym, że musiałem iść inną drogą i wymagać serwera Pythona i używać zwykłej funkcji load () Jquery dla zewnętrznego dynamicznie ładowanego html. Ale to
pomogło

1
@ KamilKiełczewski type="type/html"zmienia się natype="text/html"
Shayan

63

Możesz użyć funkcji ładowania 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>

Przepraszam. Edytowane po kliknięciu zamiast wczytywania.


Cześć, próbowałem użyć tej metody, ale nie mogę jej uruchomić. Jeśli chcesz, mogę otworzyć nowe pytanie. Dzięki. Moje skrzypce są tutaj: jsfiddle.net/ekareem/aq9Laaew/288345
NoChance

52

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

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

opierając się na swoich ograniczeniach, powinieneś użyć Ajax i upewnić się, że twój javascript jest załadowany przed znacznikiem, który wywołuje load_home()funkcję

Referencje - davidwalsh

MDN - Korzystanie z funkcji Fetch

Demo JSFIDDLE


dzięki. ale mój kod odnosi się do części projektu. i przykro mi to mówić, że nie powinienem używać iframe w pracy nad projektem. Redagowałem pytanie. zobacz @jay harris
Giliweed

1
@Jay Harris: A co z tą samą polityką pochodzenia?
ArunRaj

1
@ArunRaj, nie możesz załadować strony pochodzącej z innej witryny w javascript bc, jest to kwestia bezpieczeństwa. ale możesz załadować skrypt ze swojego serwera, który z kolei załaduje inną stronę i wyświetli ją z powrotem do javascript za pośrednictwem ajax.
Jay Harris

1
Dodanie Content-Typenagłówka do GETżądania nie ma sensu - myślę, że miałeś na myśli setRequestHeader("Accept", "text/html")?
mindplay.dk

24

Pobieranie HTML w nowoczesnym stylu Javascript

Takie podejście wykorzystuje nowoczesne funkcje JavaScript, takie jak async/awaiti fetchAPI. Pobiera HTML jako tekst, a następnie przekazuje go do innerHTMLelementu kontenera.

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

To await (await fetch(url)).text()może wydawać się nieco skomplikowane, ale łatwo to wyjaśnić. Ma dwa asynchroniczne kroki i możesz przepisać tę funkcję w następujący sposób:

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

Więcej informacji znajdziesz w dokumentacji interfejsu API pobierania .


Dla tych, którzy mają problemy z używaniem tego, upewnij się, że funkcje są napisane poza funkcją "window.onload".
Winter Cara

19

Widziałem to i pomyślałem, że wygląda całkiem ładnie, więc przeprowadziłem na nim kilka testów.

Może się to wydawać czystym podejściem, ale pod względem wydajności jest opóźnione o 50% w porównaniu z czasem potrzebnym do załadowania strony z funkcją ładowania jQuery lub przy użyciu standardowego podejścia javascript XMLHttpRequest, które były z grubsza do siebie podobne.

Wyobrażam sobie, że dzieje się tak, ponieważ pod maską pobiera stronę w dokładnie ten sam sposób, ale musi również poradzić sobie z konstruowaniem zupełnie nowego obiektu HTMLElement.

Podsumowując, sugeruję użycie jQuery. Składnia jest tak łatwa w użyciu, jak to tylko możliwe, i ma ładnie skonstruowane wywołanie zwrotne do użycia. Jest również stosunkowo szybki. Podejście waniliowe może być szybsze o niezauważalne kilka milisekund, ale składnia jest zagmatwana. Używałbym tego tylko w środowisku, w którym nie miałem dostępu do jQuery.

Oto kod, który testowałem - jest dość prymitywny, ale czasy wróciły bardzo spójne po wielu próbach, więc powiedziałbym, że w każdym przypadku jest dokładny do około + - 5 ms. Testy zostały przeprowadzone w przeglądarce Chrome z mojego własnego serwera domowego:

<!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
Myślę, że zamiast „dokładny” masz na myśli „precyzyjny”.
pulse0ne

Mam na myśli to, że biegałem to wiele razy i za każdym razem było tylko kilka milisekund. Podane czasy są więc dokładne do + - 5 ms lub do czegoś zbliżonego. Przepraszam, że mogłem nie wyrazić się tam całkowicie jasno.
Sam Redway

6

Podczas używania

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

Następnie pamiętaj, że nie możesz "debugować" lokalnie w chrome, ponieważ XMLHttpRequest nie może załadować - NIE oznacza to, że nie działa, po prostu oznacza, że ​​musisz przetestować swój kod w tej samej domenie. Twój serwer


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

4

Możesz użyć jQuery:

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

3
Proszę wyjaśnij swoją odpowiedź. Wygląda to również na jQuery, o którym OP nie wspomniał w pytaniu.
David

2
proszę pana tutaj więcej odpowiedzi jest w jQuery
Anup

jQuery jest dość standardowym narzędziem do wykonywania takich wywołań Ajax; więc uważam, że odpowiedź jest zwięzła i odpowiednia.
Luca

2

próbować

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


1
$("button").click(function() {
    $("#target_div").load("requesting_page_url.html");
});

lub

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


0

Jest to zwykle potrzebne, gdy chcesz dołączyć plik header.php lub jakąkolwiek inną stronę.

W Javie jest to łatwe, zwłaszcza jeśli masz stronę HTML i nie chcesz używać funkcji dołączania php, ale w ogóle powinieneś napisać funkcję php i dodać ją jako funkcję Java w tagu skryptu.

W takim przypadku powinieneś napisać go bez funkcji, po której następuje nazwa Just. Skrypt wściekł się na słowo funkcyjne i uruchom nagłówek include.php To znaczy przekonwertuj funkcję dołączania php na funkcję Java w tagu skryptu i umieść całą zawartość w tym dołączonym pliku.


0

Użyj tego prostego kodu

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

w3.includeHTML () nie jest zdefiniowany
toing_toing

Dla tych, którzy się zastanawiają, w3-include-HTMLjest częścią W3.JSbiblioteki skryptów W3Schools.com (dostępnej tutaj: w3schools.com/w3js/default.asp ). Chcę zaznaczyć, że W3Schools (oraz w3.js i w3.includeHTML()) nie są w żaden sposób powiązane z Konsorcjum W3 (jedną z dwóch głównych grup definiujących standardy HTML + CSS + DOM (druga grupa to 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
Odpowiadając odpowiedzią, która nie odpowiada pytaniu, również odpowiedziała już ta sama osoba, która je zadała
Katler

-5

Jeśli Twój plik HTML znajduje się lokalnie, wybierz element iframe zamiast tagu. Tagi nie działają w różnych przeglądarkach i są najczęściej używane we Flashu

Na przykład: <iframe src="home.html" width="100" height="100"/>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.