angularjs路由path方式实现原理探究
angularjs路由
https://angular.io/guide/router
通过URL解释, 来定位客户端生成的浏览器端视图。
你可绑定路由到页面的链接上, 当用户点击链接, 可以浏览到相应的应用视图。
The browser is a familiar model of application navigation:
- Enter a URL in the address bar and the browser navigates to a corresponding page.
- Click links on the page and the browser navigates to a new page.
- Click the browser's back and forward buttons and the browser navigates backward and forward through the history of pages you've seen.
The Angular
Router
("the router") borrows from this model. It can interpret a browser URL as an instruction to navigate to a client-generated view. It can pass optional parameters along to the supporting view component that help it decide what specific content to present. You can bind the router to links on a page and it will navigate to the appropriate application view when the user clicks a link.
特点:URL改变没有发起http请求
路由方法有三种:
1、 通过url path
2、 通过hash
3、通过query string
按照http协议,对于地址栏的一个url访问, 总会发起http请求, 刷新页面, 获得页面视图, 这个在后台MVC框架中, 是正常的事情。
但是我们观察, 在angularjs框架的路由效果中, url改变,并没有刷新页面, 这让我身为好奇, 决定一查究竟。
资料搜集
https://stackoverflow.com/questions/3338642/updating-address-bar-with-new-url-without-hash-or-reloading-the-page
Updating address bar with new URL without hash or reloading the page
662 down vote acceptedYou can now do this in most "modern" browsers!
Here is the original article I read (posted July 10, 2010): HTML5: Changing the browser-URL without refreshing page.
For a more in-depth look into pushState/replaceState/popstate (aka the HTML5 History API) see the MDN docs.
TL;DR, you can do this:
window.history.pushState("object or string", "Title", "/new-url");
See my answer to Modify the URL without reloading the page for a basic how-to.
https://stackoverflow.com/questions/824349/modify-the-url-without-reloading-the-page
This can now be done in Chrome, Safari, FF4+, and IE10pp4+!
See this question's answer for more info: Updating address bar with new URL without hash or reloading the page
Example:
function processAjaxData(response, urlPath){
document.getElementById("content").innerHTML = response.html;
document.title = response.pageTitle;
window.history.pushState({"html":response.html,"pageTitle":response.pageTitle},"", urlPath);
}You can then use
window.onpopstate
to detect the back/forward button navigation:window.onpopstate = function(e){
if(e.state){
document.getElementById("content").innerHTML = e.state.html;
document.title = e.state.pageTitle;
}
};
For a more in-depth look at manipulating browser history see this MDN article.
How can I change the page URL without refreshing the page?
27 down vote acceptedIn HTML5 you can change the URL:
window.history.pushState("object or string", "Title", "/new-url");
check http://spoiledmilk.com/blog/html5-changing-the-browser-url-without-refreshing-page/
docs: https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#The_pushState().c2.a0method
UPDATE
An overview of which browser support the new HTML5 history API:
http://caniuse.com/#search=pushState (caniuse.com is worth to bookmark!)
there are already frameworks that do the hard work for you and even gracefully fallback to the common hash-tag solution:
总结:归功于HTML5的 BOM history对象
https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_pushState().c2.a0method
Example of pushState() method
Suppose http://mozilla.org/foo.html executes the following JavaScript:
var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");This will cause the URL bar to display http://mozilla.org/bar.html, but won't cause the browser to load
bar.html
or even check thatbar.html
exists.Suppose now that the user now navigates to http://google.com, then clicks back. At this point, the URL bar will display http://mozilla.org/bar.html, and the page will get a
popstate
event whose state object contains a copy ofstateObj
. The page itself will look likefoo.html
, although the page might modify its contents during thepopstate
event.If we click back again, the URL will change to http://mozilla.org/foo.html, and the document will get another
popstate
event, this time with a null state object. Here too, going back doesn't change the document's contents from what they were in the previous step, although the document might update its contents manually upon receiving thepopstate
event.
https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/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}
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}
angularjs路由path方式实现原理探究的更多相关文章
- SPA 路由三部曲之核心原理
为了配合单页面 Web 应用快速发展的节奏,近几年,各类前端组件化技术栈层出不穷.通过不断的版本迭代 React.Vue 脱颖而出,成为当下最受欢迎的两大技术栈. 仅 7 个月的时间,两个技术栈的下载 ...
- Angularjs路由需要了解的那点事
Angularjs路由需要了解的那点事 我们知道angularjs是特别适合单页面应用,为了通过单页面完成复杂的业务功能,势必需要能够从一个视图跳转到另外一个视图,也就是需要在单个页面里边加载不同的模 ...
- angularjs -- 路由监听
前几天,项目在做一个功能时需要在页面切换之前关闭正在执行的函数.尝试了几种方式都不行,最后想到既然angularjs是通过理由切换页面,那就在路由上面做文章吧.AngularJS在路由发生改变时,可以 ...
- angularjs 路由机制
前言 AngularJS路由主要有内置的ngRoute和一个基于ngRoute开发的第三方路由模块ui-router,内置的ngRoute有时满足开发需求,使用ui-router可以解决很多原生ngR ...
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- [原] KVM 虚拟化原理探究(4)— 内存虚拟化
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...
- AngularJS 路由
AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 通常 ...
随机推荐
- debugger
今天爬取cfda时遇到的困难,一旦开启了调试,就debugger pause, ???还有这种操作 一顿google,百度,解决了这个问题,点一下Deactivate breakPoints,然后点一 ...
- 深挖JDK动态代理(一)
最近在研究RPC框架,避免不了的就是在RPC调用中使用最多的则是动态代理的机制了,基于此,我们先来研究一下JDK动态代理 我们先来尝试着编写一下JDK动态代理的代码 1. 由于JDK动态代理是基于接 ...
- 基于配置文件的redis的主从复制
redis中主从复制有很多种配置方法: 1. 使用配置文件即为redis.conf来配置 在随从redis中配置 # slaveof {masterHost} {MastePort} slaveof ...
- 详解Vue 开发模式下跨域问题
vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' header is prese ...
- JVM与GC
1.JVM的内存分配参考文章: https://www.cnblogs.com/wangjzh/p/5258254.html 2. java之GC https://www.cnblogs.com/hn ...
- apache thrift分析
thrift是一个用来实现跨语言的远程调用(RPC Remote Procedure Call)的软件框架.根据接口定义语言(IDL Interface definition lanuage) 并借助 ...
- linux driver ------ 字符设备驱动 之 “ 创建设备节点流程 ”
在字符设备驱动开发的入门教程中,最常见的就是用device_create()函数来创建设备节点了,但是在之后阅读内核源码的过程中却很少见device_create()的踪影了,取而代之的是device ...
- 1.1实战项目:电影周周看V1(初识小程序)
第一小程序的实战项目: 覆盖的小程序技术: 讲解方式: 学习方法:
- 洛谷P1762 杨辉三角,规律
https://www.luogu.org/problemnew/show/P1762 题意:给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果. 由于N <= 1e ...
- maven-compiler-plugin报错
[INFO] Scanning for projects... [INFO] [INFO] --------------------------< cn.x:credittest >--- ...