Як завантажити HTML-сторінку в <div> за допомогою JavaScript?


161

Я хочу завантажувати 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>

Це добре працює, коли я використовую Firefox. Коли я використовую Google Chrome, він запитує плагін. Як я можу це працювати в Google Chrome?


1
І не забудьте повернути помилкове, як вload_home(); return false
mplungjan

2
Не надто просто без бібліотек. Можливо, краще завантажуватись в iFrame. Перевірити цю посаду з: stackoverflow.com/questions/14470135 / ...
sgeddes

1
home.html - це проста веб-сторінка, я тільки що назвав її домашньою. @jayharris
Giliweed

І ви намагаєтесь завантажити все на цій сторінці в елемент вмісту або просто розмістити посилання на сторінку в елементі вмісту?
adeneo

Я намагаюся завантажити все на цій сторінці в елемент вмісту. Я редагував питання. @adeneo
Giliweed

Відповіді:


213

Нарешті я знайшов відповідь на свою проблему. Рішення є

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

3
Хоча це елегантно і чисто, я вважаю, що було б краще, якби ви насправді створили об’єктний елемент через api DOM.
Давид

3
Це повільно і небезпечно атакувати - дивіться мою відповідь нижче (було занадто довго, щоб вписатись у коментар)
Сем Редвей

1
@DavidMaes, що ви пропонуєте? ви можете показати зразок?
Xsmael

2
Хоча це може бути небезпечно, якщо ви робите просту розробку "локального в папці на робочому столі", це добре - не всі працюють на веб-сайті банку, в якому клієнти обробляють інформацію про банківські рахунки і нападають на XSS-атаку. Дякую за рішення, для моїх потреб мені довелося пройти інший маршрут та вимагати сервера python та використовувати звичайну функцію load () Jquery для зовнішнього динамічно завантаженого HTML. Але це було корисним для того, щоб
розібратися

1
@ KamilKiełczewski type="type/html"змінено наtype="text/html"
Shayan

63

Ви можете використовувати функцію навантаження 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>

Вибачте. Відредаговано для натискання, а не для завантаження.


Привіт, я спробував використати цей метод, але я не можу змусити його працювати. Я можу відкрити нове запитання, якщо хочете. Дякую. Моя загадка
NoChance

52

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

виходячи з ваших обмежень, ви повинні використовувати ajax і переконайтесь, що ваш JavaScript завантажений перед розміткою, яка викликає load_home()функцію

Довідка - davidwalsh

MDN - Використання Fetch

Демонстрація JSFIDDLE


Дякую. але мій код стосується частини проекту. і прикро, що я не думаю використовувати iframe в роботі над проектом. Я редагував питання. подивіться @jay harris
Giliweed

1
@ Джей Харріс: Що з тією ж політикою щодо походження?
ArunRaj

1
@ArunRaj ви не можете завантажити сторінку, що надходить з іншого веб-сайту, в межах javascript bc, це стосується безпеки. але ви можете завантажити сценарій зі свого сервера, що, у свою чергу, завантажить цю іншу сторінку та повторно повторить її у javascript через ajax.
Джей Харріс

1
Додавання Content-Typeзаголовка до GETзапиту не має сенсу - я думаю, ви це мали на увазі setRequestHeader("Accept", "text/html")?
mindplay.dk

24

Отримання HTML сучасним способом Javascript

Цей підхід використовує сучасні функції Javascript, як async/awaitі fetchAPI. Він завантажує HTML у вигляді тексту, а потім подає його до innerHTMLелемента вашого контейнера.

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

Це await (await fetch(url)).text()може здатися трохи складним, але це легко пояснити. Він має два асинхронні кроки, і ви можете переписати цю функцію так:

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

Докладнішу інформацію див. У документації API для отримання.


Для тих, хто має проблеми з цим, переконайтеся, що функції записані поза функцією "window.onload".
Зимова кара

19

Я побачив це і подумав, що це виглядає досить приємно, тому я провів кілька тестів на ньому.

Це може здатися чистим підходом, але за показниками продуктивності він відстає на 50% порівняно з часом, необхідним для завантаження сторінки з функцією завантаження jQuery або з використанням підходу vanilla javascript XMLHttpRequest, який був приблизно подібний один одному.

Я думаю, це тому, що під кришкою вона потрапляє на сторінку точно так само, але вона також має справу з побудовою цілого нового об’єкта HTMLElement.

Підводячи підсумок, я пропоную використовувати jQuery. Синтаксис є настільки ж простим у використанні, яким він може бути, і він має добре структурований зворотний дзвінок, який ви можете використовувати. Це також відносно швидко. Підхід ванілі може бути швидшим за непомітні кілька мілісекунд, але синтаксис заплутаний. Я використовував би це лише в середовищі, де я не мав доступу до jQuery.

Ось код, який я використовував для тестування - він досить рудиментарний, але часи поверталися дуже послідовно у кількох спробах, тому я б сказав точним приблизно до + - 5 мс у кожному випадку. Тести проводились у Chrome із мого власного домашнього сервера:

<!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
Я думаю, що замість "точного" ви маєте на увазі "точний".
pulse0ne

Я маю на увазі, що я запускав його багато разів, і кожен раз було лише поворот у кілька мілісекунд. Тож наведені часи точні до + - 5 мс або щось близьке до цього. Вибачте, я, можливо, там був не зовсім зрозумілий.
Сем Редвей

6

При використанні

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

Потім пам’ятайте, що ви не можете «налагоджувати» в chrome локально, тому що XMLHttpRequest не може завантажуватися - це НЕ означає, що він не працює, це просто означає, що вам потрібно перевірити свій код на тому ж домені aka. ваш сервер


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

4

Ви можете використовувати jQuery:

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

3
Будь ласка, поясніть свою відповідь. Також це виглядає як jQuery, про який ОП не згадувала у своєму запитанні.
Девід

2
Сер тут ще кілька відповідей у ​​jquery
Ануп

jQuery досить стандартний для здійснення таких дзвінків Ajax; тому я вважаю відповідь лаконічною і доречною.
Лука

2

спробуйте

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


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

або

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


0

Зазвичай це потрібно, коли ви хочете включити header.php або будь-яку іншу сторінку.

У Java це легко, особливо якщо у вас є HTML-сторінка і ви не хочете використовувати функцію php include, але взагалі слід написати функцію php і додати її як функцію Java в тег сценарію.

У цьому випадку слід записати його без функції, а потім ім'я Просто. Сценарій вирує функціональне слово і запустить include header.php, тобто перетворити функцію включення php в функцію Java в тег сценарію і помістити весь вміст у включений файл.


0

Використовуйте цей простий код

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

w3.includeHTML () не визначено
toing_toing

Для тих, хто цікавиться, w3-include-HTMLце частина W3.JSбібліотеки сценаріїв W3Schools.com (доступна тут: w3schools.com/w3js/default.asp ). Хочу зазначити, що W3Schools (і w3.js, і w3.includeHTML()) жодним чином не пов'язані з консорціумом W3 (однією з двох основних груп, що визначають стандарти HTML + CSS + DOM (інша група WHATWG).
Дай

-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
Відповідаючи на відповідь, яка не відповідає питанню, також на нього вже відповів той самий, хто його запитував
Катлер

-5

Якщо ваш HTML-файл знаходиться локально, тоді замість тегу перейдіть за iframe. теги не працюють між веб-браузером і в основному використовуються для Flash

Наприклад: <iframe src="home.html" width="100" height="100"/>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.