基本上有四种方法可以将HTML嵌入到网页中:
<iframe>
标签的内容完全处于与您的页面不同的上下文中。虽然这通常是一个很好的特性,而且它在浏览器版本之间也最兼容,但它也会带来额外的挑战(将框架的大小缩小到其内容很困难,非常令人沮丧地对/出脚本,几乎不可能进行样式设置)。XMLHttpRequest
对象检索数据并将其注入到您的页面中。这并不理想,因为它依赖于脚本技术,从而使执行变得更加缓慢和复杂,还有其他缺点。HTML
,CSS
,JavaScript
或任何其他.html
文件可以包含的内容。这使它成为一个伟大的解决方案,具有许多有趣的用例:将应用程序拆分为可分发的构建块组件,更好地管理依赖项以避免冗余,代码组织等。这里是一个微不足道的例子:<!-- Resources on other origins must be CORS-enabled. -->
<link rel="import" href="http://example.com/elements.html">
您可以使用对象和嵌入,如下所示:
<object data="http://www.web-source.net" width="600" height="400">
<embed src="http://www.web-source.net" width="600" height="400"> </embed>
Error: Embedded data could not be displayed.
</object>
这不是新的,但仍然有效。但我不确定它是否具有相同的功能。
object
是 HTML5 中的一种简单替代方案:
<object data="https://github.com/AbrarJahin/Asp.NetCore_3.1-PostGRE_Role-Claim_Management/"
width="400"
height="300"
type="text/html">
Alternative Content
</object>
您也可以尝试embed
标签:
<embed src="https://github.com/AbrarJahin/Asp.NetCore_3.1-PostGRE_Role-Claim_Management/"
width=200
height=200
onerror="alert('URL invalid !!');" />
由于目前StackOverflow已关闭显示外部URL内容的支持,因此运行代码片段
不会显示任何内容。但对于您的网站,它将完美地工作。
<iframe>
元素在HTML5中仍然有效。根据您需要的确切交互,可能会有不同的API。例如,有postMessage
方法,允许您实现跨域javascript交互。但如果您想显示跨域HTML内容(使用CSS进行样式化,并使用javascript进行交互),iframe
仍然是一个很好的方法。如果您想这样做并且能够控制提供基本页面或内容的服务器,则可以使用跨域资源共享 (http://www.w3.org/TR/access-control/),允许客户端JavaScript通过XMLHttpRequest()
将数据加载到
// I safely ignore IE 6 and 5 (!) users
// because I do not wish to proliferate
// broken software that will hurt other
// users of the internet, which is what
// you're doing when you write anything
// for old version of IE (5/6)
xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
document.getElementById('displayDiv').innerHTML = xhr.responseText;
}
};
xhr.open('GET', 'http://api.google.com/thing?request=data', true);
xhr.send();
现在是整个操作的关键,您需要为服务器编写代码,以提供 Access-Control-Allow-Origin
标头,指定您希望客户端代码能够通过 XMLHttpRequest()
访问哪些域。以下是您可以在页面顶部包含的PHP代码示例,以便将这些标头发送给客户端:
<?php
header('Access-Control-Allow-Origin: http://api.google.com');
header('Access-Control-Allow-Origin: http://some.example.com');
?>
这种方式似乎也可以工作,尽管W3C指定它不适用于“外部(通常是非HTML)应用程序或交互内容”。
<embed src="http://www.somesite.com" width=200 height=200 />
更多信息: http://www.w3.org/wiki/HTML/Elements/embed http://www.w3schools.com/tags/tag_embed.asp
一个iframe仍然是下载跨域视觉内容的最佳方式。使用AJAX,您可以从网页中下载HTML并将其放在一个div中(正如其他人所提到的),但更大的问题是安全性。使用iframe,您将能够加载跨域内容,但无法操纵它,因为内容实际上并不属于您。另一方面,使用AJAX,您可以操纵任何您能够下载的内容,但其他域的服务器必须以允许您开始下载的方式进行设置。很多时候,您无法访问其他域的配置,即使您可以访问,除非您经常进行这种配置,否则可能会引起头痛。在这种情况下,iframe可以是更容易的替代方案。
正如其他人所提到的,您还可以使用嵌入标签和对象标签,但这并不一定比iframe更先进或更新。
HTML5已经更多地采用了Web API来获取来自跨域的信息。通常,Web API只返回数据而不是HTML。
var iframeReplacement = require('node-iframe-replacement');
// add iframe replacement to express as middleware (adds res.merge method)
app.use(iframeReplacement);
// create a regular express route
app.get('/', function(req, res){
// respond to this request with our fake-news content embedded within the BBC News home page
res.merge('fake-news', {
// external url to fetch
sourceUrl: 'http://www.bbc.co.uk/news',
// css selector to inject our content into
sourcePlaceholder: 'div[data-entityid="container-top-stories#1"]',
// pass a function here to intercept the source html prior to merging
transform: null
});
});
该源代码包含一个将内容注入到BBC新闻主页的工作示例。
可参考示例输出。
function loadPage(){
if (window.XMLHttpRequest){
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}else{
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
document.getElementById("ID OF ELEMENT YOU WANT TO LOAD PAGE IN").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("POST","WEBPAGE YOU WANT TO LOAD",true);
xmlhttp.send();
}