6

Я использую ajax для обновления местоположения страницы в кадре. Но при настройке местоположения хеша (особенно в Chrome и некоторых версиях IE (5.5), но иногда в IE7) страница перезагружается.Настройка location.hash в фреймах

Следующий 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 будет показывать загруженное предупреждение один раз при загрузке страницы. Затем, когда нажата кнопка set hash, URL будет изменен, но хеш загруженное предупреждение не будет отображаться снова. На хром и некоторых версиях IE

отчет Microsoft, возможно, та же проблема с Internet Explorer 5.5 link text

Я не могу использовать Microsoft предложенное решение, которое должно захватить событие и не стрелять, а просто прокручивать как я использую set the top.location.hash как часть события onLoad.

ответ

6

Webkit (и, в дополнение, Chrome) ведут себя странно с location.hash. Есть несколько открытых ошибок об этом, наиболее актуальным, вероятно, является этот: https://bugs.webkit.org/show_bug.cgi?id=24578, который документирует вашу проблему обновления страницы при изменении location.hash. Похоже, ваш лучший вариант - это скрестить пальцы и надеяться, что он будет быстро исправлен.

Я не могу воспроизвести ошибку в IE7 хотя, и ты первый человек в возрасте я видел, что поддерживает IE5.5, так что я не могу вам помочь;)

0

У вас пытался создать скрытые ссылки на хэши и стрелять кликом даже на них?

0

Что делать location.href = '#yourhash'; Возможно, он обходит ошибку.

2

У меня была эта проблема. Моя ситуация позволила мне создать событие unbind окна, которое установило хэш со значением, которое я тоже хотел, в качестве браузера пользователя на следующую страницу или обновленным. Это сработало для меня, но не уверен, что это сработает для вас.

С JQuery, я сделал:

 
if($.browser.webkit){ 
    $(window).unload(function() { 
     top.window.location.hash = hash_value; 
    }); 
}else{ 
    top.window.location.hash = hash_value; 
} 

Технически вам не нужно делать проверку WebKit, но я думал, что для людей, которые используют Firefox, это может быть приятно видеть правильное значение хэша, прежде чем они обновить набор фреймов.

-Jacob

2

для хрома и сафари, вам нужно использовать window.location.href, чтобы получить хэш работает, а не window.location.hash

см ниже код

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; 
    } 
    } 
} 
1

У меня есть обходной путь, и он включает полностраничную таблицу со встроенными фреймами. Я заменил свой набор фреймов таблицей, которая занимает 100% высоту и 100% ширину и имеет две строки. Затем в каждой из ячеек таблицы я помещаю iframe, который занимает 100% высоты и ширины для каждой ячейки. Это, по существу, имитирует набор фреймов, не имея набора фреймов. Лучше всего, не перезагрузите хэш-смену!

Вот мой старый код:

<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> 

Надеется, что это помогает.

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; 
    } 
} 

В первом аргументе необходимо передать фреймы верхнего окна.

+0

Это работает. Небольшое примечание: [Chrome показывает мерцание в значке и кнопку остановки/обновления] (http://code.google.com/p/chromium/issues/detail?id=50298), который выглядит как уродливый. – Blaise

Смежные вопросы