`
smiky
  • 浏览: 257703 次
  • 性别: Icon_minigender_1
  • 来自: 天门
社区版块
存档分类
最新评论

iframe记录历史记录(onhashchange)

 
阅读更多

在富客户端页面中,加载一个新的页面是不需要刷新页面的,此时window.history.back()即点回退按钮是不会返回来初始页面的。因此,需要将新加载的页面(通常是ajax加载)记录下来,同时要让history.back生效。

原理很简单,在window内部的子window(如iframe)的history发生变化时点回退接钮时会对子window回退。

因此,可以在window内部,加上一个隐藏的iframe,通过改变这个iframe的history实现点回退时界面的回退。

 

window有个onhashchange事件,即window.location.hash发生变化时会触发,因此,可以将要加载的页面放置到location.hash上面,这样在点回退时根据此hash回退到过去的页面

当然也可以用一个栈来记录详细的参数,页hash对应一个key值,在onhashchange时根据key取出对应的参数来加载历史页面

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>backbone practise</title>
<script type="text/javascript" src="../vendor/jquery.js"></script>
<script type="text/javascript" src="../vendor/json2.js"></script>
<script type="text/javascript" src="../vendor/underscore.js"></script>
<script type="text/javascript" src="../vendor/backbone.js"></script>
<script type="text/javascript" src="router.js"></script>
</head>
<body onload="ready();">
    <a href="#help">help</a>
    <a href="#search">search</a>
    <iframe name="abc" id="abc" style="width:400px;height:400px;" src="backbone.html"></iframe>
</body>
</html>
<script type="text/javascript">
function ready(){
	//window内部的子window的hash变化会影响 window.location的前进与后退
	//因此,想不刷新页面情况下记录历史记录(如ajax请求了一个页面,可以用iframe来记录这个页面),
	//可以在主window上加个iframe,用它来记录加载的页面,那么
	//window.history.back会触发子window的onhaschange事件
	$('a').click(function(){

		//两种方式会触发onhashchange,a)location.hash改变 2)location.href改变,改变href时#后面的内容要改变
		//iframe.src不会触发onhashchange
		//hash通常指的是backbone.html#defabc指的是url中#及后面的内容
		
		//第一种情况
		//location.href只针对src不变#后面的内容变时才会触发onhashchange,iframe.html不是当前页面,onhashchange不触发
        //window.abc.location.href = 'iframe.html#'+Math.random();
        //window.abc.location.href = '#'+Math.random();
        
        //第二种情况
        window.abc.location.hash = Math.random();
    });
    window.abc.onhashchange = function( arguments ){
        console.log(window.abc.location.hash);
    }
	
}
</script>

 

符件是一个简单的实现

 

window.onpopstate事件也可以处理回退,而且比onhashchange方式更简单,连iframe都不用要了,具体参考这里

https://developer.mozilla.org/en-US/docs/Web/API/Window.onpopstate

window.onpopstate = function(event) {
  alert("location: " + document.location + ", state: " + JSON.stringify(event.state));
};

history.pushState({page: 1}, "title 1", "?page=1");
history.pushState({page: 2}, "title 2", "?page=2");
history.replaceState({page: 3}, "title 3", "?page=3");
history.back(); // alerts "location: http://example.com/example.html?page=1, state: {"page":1}"
history.back(); // alerts "location: http://example.com/example.html, state: null
history.go(2);  // alerts "location: http://example.com/example.html?page=3, state: {"page":3}

 

分享到:
评论

相关推荐

    页面禁止各种浏览器后退.txt

    在这个函数中,使用`pushState`方法添加一个新的历史记录,以覆盖用户试图返回的状态,并使用`forward`方法确保用户无法通过浏览器的后退按钮回到前一个状态。 3. **兼容不支持HTML5 History API的浏览器**:对于不...

    对ajax前进后退的处理

    然而,由于AJAX请求不会触发浏览器的前进和后退按钮(历史记录)更新,用户在使用这些功能时可能会遇到问题。本文将深入探讨如何处理AJAX前进后退的问题,主要涉及`hash`技术的应用。 `hash`是URL中的井号(#)后面的...

    详解HTML5之pushstate、popstate操作history,无刷新改变当前url

    `replaceState`与`pushState`相似,不同之处在于它不会在历史记录中增加新的条目,而是替换当前的历史记录点。这对于更新当前页面的URL或状态对象而不留下新的历史记录条目非常有用。 为了监听URL的变化,可以使用`...

    纯html静态页传值.

    例如,使用`history.pushState()`或`history.replaceState()`方法,将数据以状态对象的形式添加到历史记录中,然后在其他页面中通过`window.onpopstate`事件监听状态变化。 6. URL fragment identifier (hash): ...

    vue-router中的hash和history两种模式的区别

    这两个方法允许我们对浏览器历史记录进行管理,能够控制浏览器历史记录栈中的记录。 ```javascript history.pushState({color:'red'}, 'red', 'red'); window.onpopstate = function(event) { console.log(event....

    Ajax回退刷新页面问题的解决办法

    例如,AJAX技术无法改变浏览器的历史记录状态,这意味着用户在使用浏览器的前进和后退按钮时,无法正确地浏览之前通过AJAX加载的页面内容。当用户刷新页面时,可能会返回到初始页面,而不是之前浏览的页面,导致用户...

    解决浏览器记住ajax请求并能前进和后退问题

    然而,AJAX请求并不改变浏览器的URL地址栏中的地址,导致浏览器的历史记录栈中不会记录AJAX请求的页面状态。因此,当用户尝试使用浏览器的前进或后退按钮时,浏览器无法响应这些请求,而是直接跳转到上一个或下一个...

    Hashload:一个JavaScript库,可轻松处理onhashchange事件-开源

    通过指定更改规则并为其分配回调,可以轻松地在各种浏览器中处理hashchange事件的库。 内置了对基于Ajax的规则的自动AJAX调用的支持。 支持IE7 +,Chrome 6 +,Safari,Opera 10.6+和FF3.6 +。 没有依赖关系。

    JavaScript不刷新实现浏览器的前进后退功能

    1. `length`属性:它返回浏览器历史记录中的URL数量,但出于隐私考虑,并不显示URL的具体内容。 2. `state`属性:与当前URL相关联的一个对象,我们可以通过pushState方法和replaceState方法来添加或修改该对象。 ...

    jquery-routes:在javascript中使用带有参数的路由。 基于onhashchange事件

    -JavaScript中的路由设置包括库和jquery.routes.js文件。&lt;... &lt;/ script &gt;&lt; script type =" text/javascript " src =" jquery.routes.js " &gt; &lt;/ script &gt; IE 9及以下jQuery路由现在在Date对象上...

    11-vue-router-模式.md

    - `window.onpopstate`事件会在用户在历史记录中前进或后退时触发。 - **服务端配置说明**: 在history模式下,如果用户直接通过URL访问应用中的某个路由,服务器端应返回统一的页面(通常是入口文件,如index....

    js实现无刷新监听URL的变化示例代码详解

    - `history.go(index)`: 跳转到指定历史记录,`index` 可以是正数、负数或零,表示相对于当前位置的偏移量。 监听 `popstate` 事件可以捕获由 `back()`, `forward()`, `go()` 产生的路由变化: ```javascript ...

    JavaScript跨域总结与解决办法

    window.onhashchange = function() { console.log(window.location.hash.substr(1)); // 输出传入的数据 }; ``` 综上所述,解决跨域问题的方法多样,每种方法都有其适用场景和局限性。在实际开发中,应根据项目...

    [removed].hash知识汇总

    设置时,会创建一条新的访问历史记录,而不会刷新页面。 六、`onhashchange`事件 HTML5引入了`onhashchange`事件,当`window.location.hash`的值发生变化时,该事件会被触发。现代浏览器(如IE8+、Firefox 3.6+、...

    前端项目-jquery-hashchange.zip

    2. 嵌入式框架(iframe)通信:通过哈希值传递信息,可以在不同的框架之间进行通信。 3. 书签功能:哈希可以用来存储用户当前的状态,例如在长列表中的滚动位置,用户可以通过书签快速回到之前的位置。 五、注意...

    详解SPA中前端路由基本原理与实现方式

    此外,在浏览器的前进和后退操作时,由于历史记录的改变,如果没有合理的数据缓存机制,可能会导致数据的重新请求。 综上所述,前端路由通过页面不刷新的特性,改善了用户体验,简化了服务器的请求处理,同时为前后...

    区分vue-router的hash和history模式

    在 hash 模式下,浏览器的前进和后退按钮也能正常工作,因为每次 hash 变化都被记录在浏览器的历史记录中。虽然 URL 显示了 `#` 符号,但实际请求中不会包含这部分,所以不会引起服务器端的重载。 **二、history...

    监控 url fragment变化的js代码

    在主流的浏览器(IE firefox)里面 都有一个 onhashchange 的事件监听 fragment 的变化。 但是,他们的行为有些差异。在IE8 以前的 IE版本里面,当 [removed] 对象迅速变化的情况下,onhashchange 不会触发,非常奇怪...

    AJAX 网页保留浏览器前进后退等功能

    在传统的网页浏览中,用户可以通过点击浏览器的前进和后退按钮来浏览历史记录,每刷新一次页面,URL就会更新以反映当前的状态。但在使用AJAX的网页中,由于页面内容是动态加载的,URL可能不会随着用户交互而改变,...

Global site tag (gtag.js) - Google Analytics