JavaScriptでiframeを動的にロードします。ロードされた後、特定の数のピクセルを下にスクロールさせるにはどうすればよいですか(iframeのページがロードされた後、iframeをページの指定された領域に自動的にスクロールさせるにはどうすればよいですか?)
ネルソンのコメントに触発されて、私はこれを作りました。
外部ドメインで作成されたドキュメントでの.ScrollTo()の使用に関するjavascript Same Originポリシーの回避策。
このための非常に簡単な回避策は、外部のWebサイトをホストするダミーのhtmlページを作成し、読み込まれたらそのページで.ScrollTo(x、y)を呼び出すことです。次に、あなたがする必要があるのは、フレームまたはiframeでこのWebサイトを立ち上げることだけです。
他の多くの方法がありますが、これは最も簡単な方法です。
*スクロールバーの最大値に対応するには、高さが大きくなければならないことに注意してください。
--home.htm
<html>
<head>
<title>Home</title>
</head>
<frameset rows="*,170">
<frame src=body.htm noresize=yes frameborder=0 marginheight=0 marginwidth=0 scrolling=no>
<frame src="weather.htm" noresize=yes frameborder=0 marginheight=0 marginwidth=0 scrolling=no>
</frameset>
</html>
--weather.htm
<html>
<head>
<title>Weather</title>
</head>
<body onLoad="window.scrollTo(0,170)">
<iframe id="iframe" src="http://forecast.weather.gov/MapClick.php?CityName=Las+Vegas&state=NV&site=VEF&textField1=36.175&textField2=-115.136&e=0" height=1000 width=100% frameborder=0 marginheight=0 marginwidth=0 scrolling=no>
</iframe>
</body>
</html>
Nelson's と Chris ' のコメントに触発され、div
とiframe
を使用して同じOriginポリシーを回避する方法を見つけました。 :
HTML:
<div id='div_iframe'><iframe id='frame' src='...'></iframe></div>
CSS:
#div_iframe {
border-style: inset;
border-color: grey;
overflow: scroll;
height: 500px;
width: 90%
}
#frame {
width: 100%;
height: 1000%; /* 10x the div height to embrace the whole page */
}
ここで、iframeページの最初の438(垂直)ピクセルをその位置までスクロールしてスキップしたいとします。
JSソリューション:
document.getElementById('div_iframe').scrollTop = 438
JQueryソリューション:
$('#div_iframe').scrollTop(438)
CSSソリューション:
#frame { margin-top: -438px }
(各ソリューションだけで十分です。CSSの効果は、iframeされたページの上部を表示するために上にスクロールできないため、少し異なります。)
フレームのコンテンツのscrollTop
プロパティを使用して、コンテンツの垂直スクロールオフセットを特定のピクセル数(100など)に設定します。
<iframe src="foo.html" onload="this.contentWindow.document.documentElement.scrollTop=100"></iframe>
JQueryソリューション:
$("#frame1").ready( function() {
$("#frame1").contents().scrollTop( $("#frame1").contents().scrollTop() + 10 );
});
または、iframeにマージントップを設定することもできます...ちょっとしたハックですが、今のところFFで動作します。
#frame {
margin-top:200px;
}
また、iPadのiframeであらゆる種類のjavascript "scrollTo"関数を使用するのに問題がありました。最後に、問題の「古い」解決策を見つけました。アンカーにハッシュするだけです。
私の状況では、ajaxが返された後、エラーメッセージはiframeの上部に表示されるように設定されていましたが、ユーザーが明らかに長い形式でスクロールダウンした場合、サブミットは終了し、エラーは「スクロールせずに見える」さらに、ユーザーがスクロールダウンすると、トップレベルのページが0,0からスクロールされて非表示になります。
追加した
<a name="ptop"></a>
iframeドキュメントの先頭に
<a name="atop"></a>
トップレベルページのトップへ
それから
$(document).ready(function(){
$("form").bind("ajax:complete",
function() {
location.hash = "#";
top.location.hash = "#";
setTimeout('location.hash="#ptop"',150);
setTimeout('top.location.hash="#atop"',350);
}
)
});
iframeで。
トップページの前にiframeをハッシュする必要があります。そうしないと、iframeのみがスクロールされてトップが非表示のままになりますが、タイムアウト間隔のために少し「ジャンピー」になります。タグ全体でさまざまな「scrollTo」ポイントが許可されると思います。