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">×</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技術スタッフの対応はちょっと驚きました笑
それはまた後日載せます

公式アカウントのWebページはキャッシュを更新します。これはシンプルでシンプルで、ポットを飲むのに十分な複雑です。あなたは公式のアカウントの記事を更新するために一生懸命働きましたが、ユーザーはまだ古いバージョンを開くことができますか?この記事では、この背後にあるtwist余曲折と、この問題を優雅に解決する方法を見てみましょう。それを読んだ後、さまざまなキャッシュの問題に簡単に対処でき、ユーザーが常に新鮮なコンテンツを体験できるようになります。最初に基本について話しましょう。それを率直に言うと、アクセス速度を向上させるために、ブラウザまたはサーバーはいくつかの静的リソース(写真、CSS、JSなど)やページコンテンツを保存します。次回アクセスするときは、もう一度ダウンロードすることなく、キャッシュから直接検索できます。自然に高速です。しかし、このことは両刃の剣でもあります。新しいバージョンはオンラインです、

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

この記事では、CSSを使用したWebページへの効率的なPNG境界追加を示しています。 CSSはJavaScriptやライブラリと比較して優れたパフォーマンスを提供し、微妙または顕著な効果のために境界幅、スタイル、色を調整する方法を詳述していると主張しています

この記事では、HTML&lt; Datalist&GT;について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

この記事では、html&lt; meter&gt;について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化&lt; Meter&gt; &lt; Progress&gt;およびex

この記事では、html5&lt; time&gt;について説明します。セマンティックデート/時刻表現の要素。 人間の読み取り可能なテキストとともに、マシンの読みやすさ(ISO 8601形式)のDateTime属性の重要性を強調し、Accessibilitを増やします

この記事では、HTML&lt; Progress&gt;について説明します。要素、その目的、スタイリング、および&lt; meter&gt;との違い要素。主な焦点は、&lt; Progress&gt;を使用することです。タスクの完了と&lt; Meter&gt; statiの場合


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
