Maison  >  Article  >  interface Web  >  Partage récapitulatif pratique de l'utilisation de l'iframe HTML

Partage récapitulatif pratique de l'utilisation de l'iframe HTML

黄舟
黄舟original
2017-07-21 11:32:393684parcourir

Comme mentionné ci-dessus, iframe peut faire beaucoup de choses.
Par exemple :
a> Réalisez des opérations inter-domaines via iframe ;
b> Utilisez iframe pour résoudre le problème que la sélection ne peut pas être bloquée dans IE6
c> via iframe
d> Téléchargement asynchrone via iframe. (Le composant de formulaire dans Easyui utilise iframe. Lors de la mise en œuvre de la soumission du formulaire, vous pouvez soumettre le domaine de téléchargement)
Certains problèmes seront abordés un par un ci-dessous.

1. Connaissance de base de l'iframe :

L'élément iframe crée un cadre en ligne (c'est-à-dire un cadre en ligne) qui contient un autre document.
Dans HTML 4.1 Strict DTD et XHTML 1.0 Strict DTD, les éléments iframe ne sont pas pris en charge.
Conseil : vous pouvez placer le texte requis entre d5ba1642137c3f32f4f4493ae923989c et 065276f04003e4622c4fe6b64f465b88 pour gérer les navigateurs qui ne peuvent pas comprendre les iframes.

<iframe width=420 height=330 frameborder=0 scrolling=auto src="URL"></iframe>

Attributs facultatifs :

Attributs standards :

2. Utiliser l'iframe :

   注:测试环境IE:8.0,FF:23.0.1
   a>隐藏iframe表框
		i>标签中设置:frameborder="0",<iframe frameborder="0" width="400" height="400" src="http://blog.csdn.net/cuew1987" scrolling="no"></iframe>
		ii>DOM操作:
			<body>
			<iframe frameborder="1" width="400" height="400" src="http://blog.csdn.net/cuew1987" scrolling="no" id="myiframe"></iframe>
			<script>
			var myiframe = document.getElementById("myiframe");
			myiframe.style.border="none";//FF下有效,IE下无效 
			myiframe.setAttribute("frameborder",0);//FF下有效,IE下无效 
			myiframe.frameBorder = 0;//FF下有效,IE下无效 
			</script>
			</body>
   b>动态创建iframe
   <script>
		var newFrame = document.createElement("iframe");
		newFrame.src ="http://blog.csdn.net/cuew1987";
		newFrame.frameBorder = 0;//FF、IE隐藏边框有效
		newFrame.width = "400px";
		newFrame.height = "400px";
		newFrame.scrolling = "no";
		document.body.appendChild(newFrame);
   </script>
   c>获取iframe
		i>var obj = document.getElementById("iframeID");
		  获取iframe对象,可直接操作iframe标签属性,如只想改变iframe的 src 或者 border ,scrolling 等attributes
		ii>var dom = frames["iframeName"];
		   获取iframe的DOM对象,此对象可用来操作对象,比如想操作iframe页面中的元素。
    d>获取iframe中的window对象
		function getIframeWindow(obj) {
			//IE || w3c
			return obj.contentWindow || obj.contentDocument.parentWindow;
			//parentWindow 是 parent window object
		}
		document.getElementById取到的iframe是不能直接操作里面的document的,只能这样取:
		IE:frames[id].document或obj.contentWindow.document;
		FF:dom.contentDocument或obj.contentDocument;不绑定任何事件.
	e>获取iframe页面高度
		function getIframeHeight(obj){
			var idoc = getIframeWindow(obj).document; 
			if(idoc.body){
				return Math.max(idoc.body.scrollHeight,idoc.body.offsetHeight);   
			}else if(idoc.documentElement){
				return Math.max(idoc.documentElement.scrollHeight,idoc.documentElement.offsetHeight);   
			}
		}
	f>父子页面互访
		i>子访问父:
			parent.html:
			<body>
				<p>等到的信息:<p id="msg"></p></p>
				<iframe frameborder="1" width="400" height="400" src="son.html" scrolling="no" id="myiframe"></iframe>
			</body>
			son.html:
			<body>
			<input type="button" onClick="setMsg()" value="setMsg">
			<script>
			function setMsg(){
				var msg = window.parent.document.getElementById("msg");
				msg.innerHTML= "Hello world!!";
			}
			</script>
			</body>
		ii>父访问子:
			parent.html:
			<body>
			<p>等到的信息:<p id="setMsg"></p></p>
			<input type="button" value="setMsg" onClick="setMsg()"><br>
			<iframe frameborder="1" width="400" height="400" src="son.html" scrolling="no" id="myiframe"></iframe>
			<script type="text/javascript">
			function setMsg(){
				var obj = document.getElementById("myiframe");
				var msg = getIframeWindow(obj).document.getElementById("msg");
				document.getElementById("setMsg").innerHTML = msg.innerHTML;
			}
			</script>
			</body>
			son.html:
			<body>
			<p id="msg">Hello world!!!</p>
			</body>


3. L'iframe est hautement adaptatif et multidomaine :

实际使用iframe中,会遇到iframe高度的问题,由于被嵌套的页面长度不固定而显示出来的滚动条,不仅影响美观,还会对用户操作带来不便
	a>同域下的高度自适应
	parent.html:
	<body>
	<iframe width="400" id="myiframe" onload="setHeight()" height="1" frameborder="0" src="son.html"></iframe>
	<script type="text/javascript">  
	function getIframeWindow(obj) {
		return obj.contentWindow || obj.contentDocument.parentWindow;
	}
	function getIframeHeight(obj){
		var idoc = getIframeWindow(obj).document; 
		if(idoc.body){
			return Math.max(idoc.body.scrollHeight,idoc.body.offsetHeight);   
		}else if(idoc.documentElement){
			return Math.max(idoc.documentElement.scrollHeight,idoc.documentElement.offsetHeight);   
		}
	}
	function setHeight(){   
		var myiframe = document.getElementById("myiframe");
		myiframe.height = getIframeHeight(myiframe);
	} 
	</script> 
	</body>
	另:document.documentElement与document.body相关说明(W3C DOM2.0规范)
	document.doucmentElement:
		documentElement of type Element, readonly,This is a convenience attribute that allows direct access to the 
		child node that is the root element of the document. For HTML documents, this is the element with the tagName "HTML".
	document.body:
		document.body is the element that contains the content for the document. In documents with <body> contents, returns the <body> element, 
		and in frameset documents, this returns the outermost <frameset> element.
		Though body is settable, setting a new body on a document will effectively remove all the current children of the existing <body> element.
	IE在怪异模型(Quicks Mode)下document.documentElement无法正确取到clietHeight scrollHeight等值,比如clientHeight=0。
	获取scrollTop:
	var sTop=Math.max(
		(document.body?document.body.scrollTop:0),
		(document.documentElement?document.documentElement.scrollTop:0),
		(window.pageYOffset?window.pageYOffset:0)
	);    

	b>跨域下高度自适应
	页面:
	index.html:(http://www.csdn.net)
	<iframe width="400" id="myiframe" onload="setHeight()" height="1" frameborder="0" src="son.html"></iframe>
	son.html:
	<body >
	<iframe id="agentIframe" style="position:absolute; top:-10000;left:-1000;" height="10" width="100%"></iframe>
	</body>
	<script>
		function getHeight(){
			var idoc = document; 
			if(idoc.body){
				return Math.max(idoc.body.scrollHeight,idoc.body.offsetHeight);   
			}else if(idoc.documentElement){
				return Math.max(idoc.documentElement.scrollHeight,idoc.documentElement.offsetHeight);   
			}
		}
		window.onload = function(){
			var h = getHeight();
			document.getElementById("agentIframe").src="http://www.csdn.net#"+h;
		}
	</script>
	agent.html:(http://www.csdn.net)
	<script>
	(function(){
		var con = parent.parent.document.getElementById(&#39;frame_content&#39;);     
		var href = parent.parent.frames["frame_content"].frames["iframeC"].location.hash;      
		con.style.height = href.split("#")[1]+"px";
	})();
	</script>

4. >

Lorsque l'iframe est introduit sous ie6/7/8, son arrière-plan est blanc par défaut Même si style="background-color:transparent;" est défini, cela n'a aucun effet

Mais les autres navigateurs (Firefox. , chrome, opera, ie9) s'affichent normalement. Pour résoudre ce problème de compatibilité, un attribut doit être utilisé.
Jetons un coup d'œil au phénomène :

index.html:
<body style="background-color:#00f;">
<iframe frameborder="0" height="200" width="200"  src="son.html" scrolling="yes" id="myiframe" 
style="background-color:transparent;"></iframe>
</body>

Le résultat est le suivant : (Il y a des barres de défilement dans FF car les barres de défilement sont définies dans index.html)

Solution :

Définissez l'attribut pour iframe :allowTransparency="true" //Définissez sur true pour autoriser la transparence

<body style="background-color:#00f;">
<iframe allowTransparency="true" frameborder="0" height="200" width="200"  src="son.html" 
scrolling="yes" id="myiframe"></iframe>
</body>

Remarque : iframe ne définit pas cet attribut Lorsque vous utilisez iframe, vous pouvez utiliser iframe pour résoudre le problème de couverture de select

dans les environnements IE6 et 7 5. Déterminez s'il y a une iframe dans la page :

	a>首先来看看window.frameElement这个属性。
		返回嵌入当前window对象的元素(比如 <iframe> 或者 <object>),即为包含本页面的iframe或frame对象。如果当前window对象已经是顶层窗口,则返回null.
		看看一个例子:
		parent.html:
		<body>
		<iframe frameborder="1" width="400" height="400" src="son.html" scrolling="no" id="myiframe"></iframe>
		</body>
		son.html:(注意frameElement用在son.html中,如果用在parent.html中,则返回null)
		<body>
		<p id="msg">Hello world!!!</p>
		<script type="text/javascript">
			var iframe = window.frameElement;
			if(iframe){
				iframe.src = "http://blog.csdn.net/cuew1987";
			}
		</script>
		</body>
		备注:虽然该属性名为frameElement,但该属性也会返回其他类型比如 <object> 或者其他可嵌入窗口的元素.
	b>兼容性如下图:


6. iframe en HTML5 :
	c>定义函数:
		i>判断父页面中是否含有iframe
		function hasIframe(){
			return document.getElementsByTagName("iframe").length > 0;
		}
		ii>判断某个页面是否在iframe标签中
		function innerIframe(){
			var iframe = window.frameElement;
			if(iframe){
				return typeof iframe !== "undefined";
			}
		}

La différence entre HTML 4.01 et HTML 5. En HTML 5, seul l'attribut src est pris en charge.

0a3df55da6942e1fb145c3f08912e1cb 065276f04003e4622c4fe6b64f465b88

Attributs globaux en HTML5 :

7. Soumission du composant de formulaire dans easyui (y compris le domaine de téléchargement) :

8. Collecte des problèmes en ligne :
	function submitForm(target, options) {
		options = options || {};
		if (options.onSubmit) {
			if (options.onSubmit.call(target) == false) {
				return;
			}
		}
		var form = $(target);
		if (options.url) {
			form.attr("action", options.url);
		}
		var frameId = "easyui_frame_" + (new Date().getTime());
		var frame = $("<iframe id=" + frameId + " name=" + frameId + "></iframe>").attr(
				"src",
				window.ActiveXObject ? "javascript:false" : "about:blank").css(
				{
					position : "absolute",
					top : -1000,
					left : -1000
				});
		var t = form.attr("target"), a = form.attr("action");
		form.attr("target", frameId);//在iframe中提交表单
		try {
			frame.appendTo("body");
			frame.bind("load", cb);
			form[0].submit();
		} finally {
			form.attr("action", a);
			t ? form.attr("target", t) : form.removeAttr("target");
		}
		var checkCount = 10;
		function cb() {
			frame.unbind();
			var body = $("#" + frameId).contents().find("body");
			//contents()查找匹配元素内部所有的子节点(包括文本节点)。如果元素是一个iframe,则查找文档内容
			var data = body.html();
			if (data == "") {
				if (--checkCount) {
					setTimeout(cb, 100);
					return;
				}
				return;
			}
			var ta = body.find(">textarea");
			if (ta.length) {
				data = ta.val();
			} else {
				var pre = body.find(">pre");
				if (pre.length) {
					data = pre.html();
				}
			}
			if (options.success) {
				options.success(data);
			}
			setTimeout(function() {
				frame.unbind();
				frame.remove();
			}, 100);
		};
	};
	另:form 的target属性:
	a>HTML4中:
	定义和用法:target 属性规定在何处打开 action URL。
	兼容性:在 HTML 4.01 中,不赞成使用 form 元素的 target 属性;在 XHTML 1.0 Strict DTD 中,不支持该属性。
	属性值:
	_blank 新窗口中打开
	_self  默认,在相同的框架中打开
	_parent 父框架中打开
	_top    整个窗口中打开
	framename  指定的frame name属性值的框架中打开

	b>HTML5中:
	HTML 4.01 与 HTML 5 之间的差异
	在 HTML5 中 target 属性不再是被废弃的属性。不再支持 frame 和 frameset。
	现在,parent, top 和 framename 值大多用于 iframe。

a>window.frameElement n'est pas défini dans Chrome ?

Description du problème :

Lorsque j'ai réécrit mon composant de calendrier aujourd'hui, en raison de l'utilisation d'iframe, transmettez la valeur de l'attribut personnalisé

Écrivez la valeur de la page parent sur l'attribut personnalisé iframe, puis utilisez window.frameElement.getAttribute(). pour l'obtenir dans la page iframe.
Ce qui est étrange, c'est que le code de contrôle du calendrier écrit auparavant a toujours été Je l'ai écrit comme ça, et aucune erreur ne s'est produite, mais aujourd'hui dans Chrome, window.frameElement s'est avéré indéfini.
Il n'y a eu aucun problème dans Firefox ou même dans IE6. Plus tard, Baidu n'a eu aucune réponse, et Google n'a pas non plus eu de réponse.
Solution :
Enfin, sur la base de mon expérience passée, j'ai pensé que cela pourrait être un problème avec les autorisations de débogage locales, alors j'ai ouvert Apache et utilisé le nom de domaine pour y accéder, et bien sûr, cela a fonctionné, haha !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn