ホームページ > ウェブフロントエンド > htmlチュートリアル > IE_html/css_WEB-ITnose で独自のタブ メニュー クラスを作成するときに iframe キャッシュの問題が発生しました

IE_html/css_WEB-ITnose で独自のタブ メニュー クラスを作成するときに iframe キャッシュの問題が発生しました

WBOY
リリース: 2016-06-21 09:41:39
オリジナル
1204 人が閲覧しました

js タブ iframe キャッシュ

要件: JS で DIV 要素を使用して、Web ページのタブ メニューを実装します
原則: 複数の iframe を使用して、複数のタブのコンテンツを表示します。現在のタブには、現在対応する iframe が表示され、他の iframe は非表示になり、実装されません。 iframe 内にありますが、n 個のタブが n 個の iframe に対応します
問題の説明: タブが閉じられると、対応するタブと iframe は JQuery の Remove() メソッドを使用して削除されますが、ページが F5 で更新されると、タブの場合、初期化されたタブに表示されるページは、実際には前回滞在していたタブ内の対応するページになります。次のコードを実行すると、ビュー A が「最初の iWatch ユーザー インターフェイス」として自動的に開きます。左下のビュー B を押して「ウェアラブル デバイス:」を開き、ビュー B のままでビュー A オプションの閉じるボタンをクリックして、対応する iframe を閉じます。この時点で、IE で F5 キーを押して更新します。タブはView Aですが、ページBでは対応する「Wearable Device:」を表示することになりますが、Firefoxではそのような問題はありません。

暫定的な推定では、これは従来の iframe ページに乱数サフィックス パラメータを追加することでは解決できません。ただし、ページを 2 回続けて開くと解決されます。読み込み効率に影響します。また、ページ初期化イベントも存在します。この場合、2 回実行されるため、お勧めできません。解決策があるかどうか尋ねてください。あるいは、実際にはコードの問題である可能性もあります。

以下はコードです。jQuery バージョンは 1.7 に対応し、個別の jQuery コードは提供されません

1. html ファイル iframe.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta http-equiv="pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache, must-revalidate"> <meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT"><title>多选项卡测试</title><link rel="stylesheet" type="text/css" href="CSS/publicStyle.css" /><style type="text/css">#programeBody{ height:30px; background-color:#66CCFF;}#programeBody a{ display:block; height:30px; line-height:30px; width:90px; margin-right:5px; background-color:#003366; color:#FFFFFF; float:left; text-align:center; overflow:hidden; position:relative;}#programeBody .sel{ background-color:#FF3300;}#programeBody .close{ display:block; position:absolute; top:0px; right:0px; height:10px; width:10px; border:1px solid #FF0000; background-color:#FFFFFF; text-align:center; line-height:10px; color:#333333; overflow:hidden;}#bottom{ height:30px; line-height:30px; background-color:#CCCCCC;}</style><script language="javascript" src="js/jquery.js"></script><script language="javascript" src="js/iframe.js"></script></head><body><div id="mainpage">	<div id="programeBody" class="programeObject" moveButton="1" move="w" sel="1" content="programeContent">		<a href="http://www.csdn.net/article/2013-02-25/2814257-iWatch-will-usher-in-Time-Based-UI">查看A</a>	</div>	<div id="programeContent"></div></div><div id="bottom"><a href="http://www.csdn.net/article/2013-02-25/2814257-iWatch-will-usher-in-Time-Based-UI" class="programeButton" name="页面A" to="programeBody">查看A</a> <a href="http://www.csdn.net/article/2013-02-10/2814117-speculates-on-future-iwatch" class="programeButton" name="页面B" to="programeBody">查看B</a></div></body></html>
ログイン後にコピー




2. js ファイル iframe.js
//================ 全局变量 =========================var CW=0;             //main页面内容框宽度var CH=0;             //main页面内容框高度var PM=new Array();   //存放选项卡对象数组$(document).ready(function(){	CW=$("body").width();	CH=$("body").height()-$("#programeBody").height()-$("#bottom").height();		//定义选项卡类	$(".programeObject").each(function(i){		PM[this.id]= new Class_programe_menu($(this));	});		$(".programeButton").click(function(){		PM[$(this).attr("to")].CL_addPrograme($(this));		//屏蔽A元素的链接事件		return false;	});	});//================================= 选项卡构造类=====================================//JQ 选项卡菜单最外层的JQ对象function Class_programe_menu(JQ){	this.CL_obj=JQ;                     //记录类的主框架元素	this.CL_content=JQ.attr("content"); //内容存放的div元素ID名称	this.CL_menu=new Array();           //记录类的菜单项 JQ数组	this.CL_index=JQ.attr("sel");       //记录类的当前菜单选择项,从1开始计数	this.CL_frame=new Array();          //记录当前的iframe框架数组 JQ数组		this.CL_initialization();           //初始化类}//类初始化Class_programe_menu.prototype.CL_initialization=function(){	var CL=this;	//放入选项卡对象	CL.CL_obj.children("a").each(function(i){		CL.CL_menu.push($(this));		var indexStore=CL.CL_menu.length-1;		CL.CL_addProgrameEvent(indexStore);	});		//记录存放iframe元素的内容对象	for (var i=0;i<CL.CL_menu.length;i++){		CL.CL_addIframe(i);	}		//显示相关选项卡及iframe	CL.CL_showPrograme(CL.CL_index-1);}//添加选项卡到选项卡菜单Class_programe_menu.prototype.CL_addPrograme=function(JQ){	var CL=this;	//检查当前添加的选项卡是否存在 存在则不添加 仅显示其对应的iframe对象	for (var i=0;i<CL.CL_menu.length;i++){		if (CL.CL_menu[i] && CL.CL_menu[i].attr("href")==JQ.attr("href")){			CL.CL_showPrograme(i);			return true;		}	}	//不存在则添加选项卡及iframe 并展示	if (JQ.attr("noClose") && JQ.attr("noClose")==1){		CL.CL_obj.append('<a href="'+JQ.attr("href")+'" noClose="1">'+JQ.attr("name")+'</a>');	}else{		CL.CL_obj.append('<a href="'+JQ.attr("href")+'">'+JQ.attr("name")+'</a>');	}	CL.CL_menu.push(CL.CL_obj.children("a").last());		//记录当前CL_menu数组的最大index值,避免在函数事件方法中使用CL.CL_menu.length-1,因为随着菜单增加会导致事件对象错乱	var indexStore=CL.CL_menu.length-1;	CL.CL_addProgrameEvent(indexStore);		//添加iframe对象	CL.CL_addIframe(indexStore);	//显示选项卡及iframe	CL.CL_showPrograme(indexStore);}//显示选项卡及对应的iframe对象Class_programe_menu.prototype.CL_showPrograme=function(index){	var CL=this;	//把选项卡的class设置为programeButton 使选项卡视觉上都成为不被选择的	CL.CL_obj.children("a").attr("class","");	//把需要的显示的选项卡class添加sel 使视觉上成为被选择的	if (CL.CL_menu[index]){		CL.CL_menu[index].attr("class","sel");		//把所有iframe设置为不可见		$("#"+CL.CL_content).children("iframe").hide();		//把当前index对应的iframe设置为可见		CL.CL_frame[index].show();	}}//添加iframe对象到内容框Class_programe_menu.prototype.CL_addIframe=function(index){	var CL=this;	//判断当前的iframe是否在内容框中存在,存在则跳过继续判定,不存在则添加	var contentObj=$("#"+CL.CL_content);		//检查CL_frame数组中是否存在当前src值,不存在则添加	if (CL.CL_frame[index] && CL.CL_frame[index].attr("src")==CL.CL_menu[index].attr("href")){	}else{		//添加元素至CL.CL_frame数组		var iframe=document.createElement('iframe');		iframe.src=CL.CL_menu[index].attr("href");		iframe.frameBorder=0;		iframe.scroll="auto";		iframe.width=CW;		iframe.height=CH;		CL.CL_frame[index]=$(iframe);        //添加到类对应属性中记录		$("#"+CL.CL_content).append(iframe); //添加到内容框中显示	}}//添加选项卡后为该选项卡绑定事件Class_programe_menu.prototype.CL_addProgrameEvent=function(index){	var CL=this;	//绑定选项卡点击事件	CL.CL_menu[index].click(function(){		CL.CL_showPrograme(index);		return false;	});	//绑定关闭按钮事件	CL.CL_closeEvent(index);}//选项卡关闭事件Class_programe_menu.prototype.CL_closeEvent=function(index){	var CL=this;	var JQ=CL.CL_menu[index];	if (JQ.attr("noClose") && JQ.attr("noClose")==1){		return true;	}	//查看选项卡是否添加关闭按钮,没有添加则添加,若添加则绑定关闭事件	if (JQ.children(".close").length<=0){		JQ.append('<span class="close">&times;</span>');	}	JQ.children(".close").click(function(event){		CL.CL_closePrograme(index);		//阻止事件向上级冒泡		return false;	});}//关闭选项卡及相关iframeClass_programe_menu.prototype.CL_closePrograme=function(index){	var CL=this;	CL.CL_menu[index].remove();	CL.CL_frame[index].remove();	CL.CL_menu[index]="";	CL.CL_frame[index]="";		var sign=index;	var isDo=0;   //表示已经调整选项卡的显示了	while(sign>=0){		if (CL.CL_menu[sign]){			CL.CL_showPrograme(sign);			isDo=1;			break;		}else{			sign--;		}	}	if (isDo){		return false;	}	sign=index+1;	while(sign<CL.CL_menu.length){		if (CL.CL_menu[sign]){			CL.CL_showPrograme(sign);			break;		}else{			sign++;		}	}}//================================= 选项卡构造类=====================================
ログイン後にコピー

返信ディスカッション (解決策)

IE 開発者ツールを使用して、iframe のアドレスが a であるが、コンテンツは確かに b として表示されていることを確認します。 。 。

IE は onbeforeunload イベントを追加し、content 属性で指定されたコンテナーの内容をクリアします。 。

rreee

モデレータさん、ありがとうございます!解決策はおっしゃる通りです!また、昨日の投稿で書き忘れましたが、テストは IE8 でした
ブラウザを閉じたり、ページを更新したりすることでトリガーされるイベントはめったに使用されないため、そのようなイベントの機能に注目することはほとんどありません、今回の教訓になりました。
この問題を別の側面から考えると、IE は iframe の存在に関して iframe が指すページを記録する必要がありますが、理解できないのは、iframe のリロードが発生すると、iframe によって提示された (キャッシュされた) Web ページが自動的に読み込まれることです。ページを閉じる前に。この問題に対するIE技術スタッフの対応はちょっと驚きました笑
それはまた後日載せます

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート