6

フレーム内のページの位置を更新するために ajax を使用しています。ただし、ハッシュの場所を設定すると (特に Chrome と IE (5.5) の一部のバージョンで、IE7 で時折) ページがリロードされます。

次の html は、問題を示しています。

メインフレーム.... frame.html は

<html><head>
<frameset rows="*">
<frame src=sethash.html frameborder=0 scrolling=auto name=somebody>
</frameset>
</head></html>

sethash.html ページは .

<html><head>
<script language=JavaScript>
var Count = 0;
function sethash()
{  
  top.document.location.hash = "hash" + Count;  
  Count++;
}
</script>
</head>
<body onload="alert('loaded')">
<h1>Hello</h1>
<input type='button' onClick='sethash()' value='Set Hash'>
</body>
</html>`

ほとんどのブラウザーでは、frame.html をロードすると、ページがロードされるとロード済みアラートが 1 回表示されます。次に、ハッシュの設定ボタンが押されると、URL は変更されますが、読み込まれたアラートのハッシュは再び表示されません。Chrome および一部のバージョンの IE

Microsoft は、Internet Explorer 5.5 のリンク テキストでおそらく同じ問題を報告しています。

onLoad イベントの一部として top.location.hash を設定して使用しているため、イベントをキャプチャして発生させずにスクロールして表示するという Microsoft が推奨するソリューションを使用することはできません。

4

7 に答える 7

3

HTML5 history.pushState()を使用して、Chrome でページをリロードせずにハッシュを変更することもできます。このようなもの:

// frameset hash change function
function changeHash(win, hash) {
    if(history.pushState) {
        win.history.replaceState(null, win.document.title, '#'+hash);
    } else {
        win.location.hash = hash;
    }
}

最初の引数では、フレームセットのトップ ウィンドウを渡す必要があります。

于 2012-02-07T07:54:47.837 に答える
2

私もこの問題を抱えていました。私の状況では、ウィンドウのバインド解除イベントを作成して、ユーザーブラウザーとして次のページに移動したり、更新したりするときに、必要な値でハッシュを設定することができました。これは私にとってはうまくいきましたが、あなたにとってうまくいくかどうかはわかりません。

jqueryを使用して、次のことを行いました。

if($。browser.webkit){
    $(window).unload(function(){
        top.window.location.hash = hash_value;
    });
}そうしないと{
    top.window.location.hash = hash_value;
}

技術的にはWebkitチェックを行う必要はありませんが、Firefoxを使用している人にとっては、フレームセットを更新する前に正しいハッシュ値を確認するとよいと思いました。

-ジェイコブ

于 2010-01-30T22:45:31.433 に答える
2

Chrome と Safari の場合、window.location.hash ではなく、window.location.href を使用してハッシュを機能させる必要があります。

以下のコードを参照してください

function loadHash(varHash)
{
  if(varHash != undefined) {
    var strBrowser = navigator.userAgent.toLowerCase();

    if (strBrowser.indexOf('chrome') > 0 || strBrowser.indexOf('safari') > 0) {
        this.location.href = "#" + varHash;
    }
    else {
        this.window.location.hash = "#" + varHash;
    }
  }
}
于 2011-04-05T13:04:22.203 に答える
1

回避策があり、iframe が埋め込まれたフルページ テーブルが含まれます。フレームセットを、高さ 100%、幅 100%、2 行のテーブルに置き換えました。次に、各テーブル セルに、各セルの高さと幅の 100% を占める iframe を配置します。これは、基本的に、フレームセットでなくてもフレームセットを模倣します。何よりも、ハッシュの変更時にリロードしません!

これが私の古いコードです:

<html>
<head>
<title>Title</title>
</head>
<frameset rows="48,*" frameborder="yes" border="1">
    <frame name="header" noresize="noresize" scrolling="no" src="http://header" target="_top">
    <frame name="main" src="http://body" target="_top">
    <noframes>
    <body>
    <p>This page uses frames, but your browser doesn&#39;t support them.</p>
    </body>
    </noframes>
</frameset>
</html>

...そしてここに私の新しいコードがあります:

<html>
<head>
<title>Title</title>
<style type="text/css">
body { margin: 0px; padding: 0px; border: none; height: 100%; }
table { height:100%; width:100% }
td { padding: 0px; margin: 0px; border: none; }
td.header { height: 48px; background-color: black; }
td.body { background-color: silver; }
iframe.header { border: none; width: 100%; height: 100%; }
iframe.body { border: none; width: 100%; height: 100%; }
</style>
</head>
<body>
<table cellpadding="0" cellspacing="0">
  <tr><td class="header"><iframe class="header" src="http://header" target="_top" scrolling="no"></iframe></td></tr>
  <tr><td class="body"><iframe class="body" src="http://body" scrolling="no"></iframe></td></tr>
</table>
</body>
</html>

お役に立てれば。

于 2011-05-27T19:03:59.707 に答える
0

ハッシュへの非表示のリンクを作成し、それらに対してもクリックを発生させてみましたか?

于 2009-04-03T21:43:49.130 に答える