jQuery を使用して、iframe 下の無効なページ アンカー ポイントの問題を修正する

jQuery を使用して、iframe 下の無効なページ アンカー ポイントの問題を修正する
適用シナリオ: iframe ページにスクロール バーがなく、親ウィンドウにスクロール バーが表示され、アンカー マークが無効になります。これは、アンカーが現在のウィンドウのスクロール バーに基づいてウィンドウをスクロールするためです。子ウィンドウになった後は、スクロール バーがなくなり、自然にスクロールしなくなります。

解決策は、js を使用してページがネストされているかどうかを判断し、js を使用して親ウィンドウ内の iframe の位置と firame 内のアンカー ポイントの位置を計算し、その 2 つの合計が親ウィンドウのスクロールになるというものです。

発生した問題: 親フォーム要素を取得します (ドメイン制限のため、すべてがネットワーク環境 (つまり、http://domain.com) 内に配置されている必要があります)。親フォームは複数の iframe をネストしており、それが現在の iframe ページであるかどうかを判断します。

コード:

親フォームページ index.html

コードをコピー
コードは次のとおりです。

<!doctypehtml>
<html>
<ヘッド>
<タイトル></タイトル>
<スタイル タイプ="text/css">
*{
マージン: 0;
パディング: 0;
境界線: 0;
}
html,
体{
幅: 100%;
高さ: 100%;
}
</スタイル>
</head>
<本文>
<div スタイル="幅:100%;背景:#f00;高さ:500px;"></div>
<a href="">dd</a>
<a href="">ddd</a>
<iframe name="iframe2" id="iframe2" src="iframe.html?a=b&c=d" style="width:100%;height:2060px;"></iframe>
<iframe name="iframe2" id="iframe2" src="iframe.html?a=d&c=b" style="width:100%;height:2060px;"></iframe>
</本文>
</html>

サブフォームページ iframe.html

コードをコピー
コードは次のとおりです。

<!doctypehtml>
<html>
<ヘッド>
<タイトル></タイトル>
<スタイル タイプ="text/css">
{
パディング: 5px;
境界線: 1px 実線 #f00;
フロート: 左;
表示: ブロック;
右マージン: 5px;
}
div{
幅: 80%;
マージン: 10px 自動;
高さ: 500px;
境界線: 1px 実線 #f00;
フォントサイズ: 30px;
}
</スタイル>
<script type="text/javascript" src="jquery-1.8.2.min.js"></script>
<script type="text/javascript">
$(関数(){
//iframeの場合はjsにドメイン制限があるためネットワーク上でアクセスする必要がある
//iframeがない場合には処理は行われません。
if(window!==window.top){
// 上部のウィンドウの iframe を取得します。ネストされた iframe が多すぎる場合は、自分で変更してください。
var iframeList=window.top.document.getElementsByTagName('iframe');
for(var i=0;i<iframeList.length;i++){
//ループ内で現在のウィンドウが iframe であるかどうかを判定します
if(window.location.toString().indexOf(iframeList[i].getAttribute('src').toString())!=-1){
//iframeが読み込まれるのを待ち、アンカーポイントにイベントを追加します。
window.top.document.getElementsByTagName('iframe')[i].onload=function(){
//iframeと親ウィンドウの上端の間の距離を決定する
var top = window.top.document.getElementsByTagName('iframe')[i].offsetTop;
$('a').each(関数(){
var href = $(this).attr('href');
if(href.indexOf('#')!=-1){//リンクではなくアンカーポイントであるかどうかを判断します
var name = href.substring(href.indexOf('#')+1);
$(this).bind('click',function(){
$('a').each(関数(){
if($(this).attr('name')==name){
// 親ウィンドウのスクロール
$(window.parent).scrollTop($(this).offset().top+top);
}
});
});
}
});
}
}
}
}
});
</スクリプト>
</head>
<本文>
<a href="#a">は</a>
<a href="#b">b</a>
<a href="#c">c</a>
<a href="#d">d</a>
<div><a href="" name="a">あ</a></div>
<div><a href="" name="b">B</a></div>
<div><a href="" name="c">C</a></div>
<div><a href="" name="d">D</a></div>
</本文>
</html>

<<:  WeChat アプレットのシンプルなログイン ページの実装 (ソース コード付き)

>>:  MySQL インデックス障害の上位 10 の問題の概要

推薦する

MacでDockerがホストマシンにpingできない問題を解決する

解決Docker for Macに付属するLinux仮想マシン(軽量ですが、ソケットファイルを使用し...

jsはポップアップウィンドウをクリックすることでポップアップログインボックスを実装します

この記事では、ポップアップウィンドウをクリックしたときにポップアップログインボックスを実現するための...

Centos6 で 20TB を超えるディスクをパーティション分割してフォーマットするためのサンプル コード

1. サーバー環境の構成: 1. ディスクパーティションを確認します。最近、あるプロジェクト内のサー...

シンプルなカレンダー効果を実現する JavaScript コード

この記事では、シンプルなカレンダー効果を実現するためのJavaScriptの具体的なコードを参考まで...

MySQLストアドプロシージャにおけるカーソル(DECLARE)の原理と使い方の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャにおけるカーソル (DECLARE) ...

ウェブデザイナーが注意すべき 43 のウェブデザインの間違い

これはウェブサイトのユーザビリティに関する記事です。著者は自身の経験に基づいて、ウェブサイトのデザイ...

MySQLで置換関数を実装するためのいくつかの実用的なシナリオ

REPLACE構文REPLACE(String,from_str,to_str)つまり、String...

Vue パッケージサイズの最適化の実装 (1.72M から 94K)

1. 背景最近、独立した開発者がUIデザインを行うのを支援するために、uideaというWebサイト...

Linux netstatコマンドの詳細な説明

目次Linux netstat コマンド1. TCP接続ステータスの詳細な説明2. コマンド形式3....

MySQL 結合テーブルクエリの基本操作 左結合のよくある落とし穴

概要中小規模のプロジェクトでは、特にレポートを作成するときに、結合テーブル クエリが非常に一般的な操...

MySQLデータベースでサポートされているストレージエンジンの比較

目次ストレージエンジンMySQL でサポートされているストレージ エンジン同時実行制御ロック粒子をロ...

Unix/Linuxフォークの隠れたオーバーヘッド

目次1. フォークの起源2. 初期のUNIXオーバーレイ技術3. UNIXに導入される前のフォークの...

JSの基本概念の詳細な紹介

目次1. JSの特徴1.1 マルチパラダイム1.2 説明1.3 シングルスレッド1.4 ノンブロッキ...

CSS3のボックスサイズプロパティの興味深いボックスモデルについての簡単な説明

誰もがボックス モデルの構成を、内側から外側まで、コンテンツ、パディング、境界線、マージンについて知...

Linux でジャンプ サーバー経由でリモート サーバーに接続し、ファイルを転送する方法

最近、Linux ホストに環境を展開する際に多くの問題に遭遇しました。最初の問題は、ジャンプ サーバ...