如何使用 JavaScript 在 div 中加载 HTML 页面?

IT技术 javascript html google-chrome
2021-01-27 00:12:29

我希望 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 时,这很好用。当我使用谷歌浏览器时,它要求插件。我如何让它在谷歌浏览器中工作?

6个回答

我终于找到了我的问题的答案。解决办法是

function load_home() {
     document.getElementById("content").innerHTML='<object type="text/html" data="home.html" ></object>';
}
尽管这是优雅和干净的,但我认为如果您通过 DOM api 实际创建对象元素会更好。
2021-03-20 00:12:29
@KamilKiełczewskitype="type/html"改为type="text/html"
2021-03-24 00:12:29
@DavidMaes 你有什么建议?你能展示一个样品吗?
2021-03-29 00:12:29
虽然这可能不安全,但如果您正在做一个简单的“桌面文件夹中的本地”开发,这很好——不是每个人都在运行银行网站,客户处理银行帐户信息并遇到 XSS 攻击。感谢您的解决方案,根据我的需要,我最终不得不走另一条路线并需要一个 python 服务器并使用常规的 Jquery load() 函数来处理外部动态加载的 html。但这有助于让我解决我的问题
2021-04-01 00:12:29
这是攻击缓慢且不安全 - 请参阅下面的答案(太长而无法放入评论)
2021-04-08 00:12:29

您可以使用 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>

对不起。针对点击而不是加载进行编辑。

嗨,我尝试使用此方法,但无法正常工作。如果你愿意,我可以打开一个新问题。谢谢。我的小提琴在这里:jsfiddle.net/ekareem/aq9Laaew/288345
2021-03-30 00:12:29

获取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 并确保在调用该load_home()函数的标记之前加载您的 javascript

参考 - davidwalsh

MDN - 使用 Fetch

JSFIDDLE 演示

@Jay Harris:同源政策怎么样?
2021-03-20 00:12:29
@ArunRaj 您无法在 javascript 中加载来自另一个网站的页面,这是一个安全问题。但是您可以从您的服务器加载一个脚本,该脚本将依次加载该其他页面并通过 ajax 将其回显到 javascript。
2021-03-20 00:12:29
请求添加Content-Type标头GET是没有意义的 - 我想你的意思是setRequestHeader("Accept", "text/html")
2021-04-01 00:12:29
谢谢。但我的代码与项目的一部分有关。很遗憾地说我不应该在项目工作中使用 iframe。我编辑了问题。看看@jay 哈里斯
2021-04-04 00:12:29

以现代 Javascript 方式获取 HTML

这种方法利用了现代 Javascript 功能,例如async/awaitfetchAPI。它将 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();
}

有关更多详细信息,请参阅fetch API 文档

对于那些在使用它时遇到问题的人,请确保函数是在“window.onload”函数之外编写的。
2021-03-12 00:12:29
Show de bola é o que eu queria。
2021-03-16 00:12:29

我看到了这个,觉得它看起来很不错,所以我对它进行了一些测试。

这似乎是一种干净的方法,但在性能方面,与使用 jQuery 加载函数或使用 XMLHttpRequest 的 vanilla javascript 方法加载页面所花费的时间相比,它的性能落后 50%,这些方法彼此大致相似。

我想这是因为在引擎盖下它以完全相同的方式获取页面,但它还必须处理构建一个全新的 HTMLElement 对象。

总之,我建议使用 jQuery。该语法尽可能易于使用,并且具有结构良好的回调供您使用。它也相对较快。普通方法可能快了几毫秒,但语法令人困惑。我只会在我无法访问 jQuery 的环境中使用它。

这是我用来测试的代码 - 它相当简陋,但经过多次尝试,时间非常一致,所以我会说在每种情况下都精确到大约 +- 5ms。测试是从我自己的家庭服务器在 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>
我的意思是我运行了很多次,每次只有几毫秒的波动。所以给出的时间精确到 +- 5ms 或接近这个值。抱歉,我可能没有完全清楚那里。
2021-03-14 00:12:29
我认为不是“准确”,而是“精确”。
2021-04-06 00:12:29