`
fanhaipeng
  • 浏览: 8127 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

[翻译]175 AJAX浏览记录和书签

阅读更多

175: AJAX浏览记录和书签观看原视频

查看英文原版

上一集我们给产品列表的分页加上了AJAX功能。与通常的HTML链接不同,通过非侵入式的JavaScript在分页链接上绑定click事件,他们就可以在点击时发出AJAX请求,从而将页面中的主体部分替换为一页新的产品内容。

 

 

AJAX带来的问题

因为我们使用了AJAX来更新页面,所以当新的一页产品被加载时URL不会发生改变。这就意味着,当我们刷新整个页面、或者收录书签后再打开那一页的话,不管之前我们在哪一页,都只会显示第一页的产品。另外一个使用AJAX的后果是,翻页以后上一页并没有被记到浏览器的历史记录中,所以我们没法用返回、前进按钮在我们之前看过的页面中前后浏览。

 

这些是使用了AJAX方法的问题;那么我们有什么解决办法吗?这将是本集我要告诉你们的内容。要说明的是,因为我们要解决的问题主要是在客户端,所以本集会更多地讨论JavaScript、而不是Ruby on Rails。

有很多JavaScript程序库可以用来解决这个问题。在Google code上我们可以找到一个最早的叫reallysimplehistory的。Yahoo也有一个叫Browser History Manager的。Yahoo有很多JavaScript程序库,所以这个很值得一看。还有一个是Asual的SWFAddress,可以用于Flash、也可以用于JavaScript。

 

所有上面提到的这些程序库都是支持纯JavaScript代码,但是在我们的程序中使用了jQuery,所以最好能找到一个能支持它的。上面提到的Asual曾经发布过一个叫jQuery Address的插件,可以用。但是我们要用的是另外一个插件,叫jQuery URL Utils plugin。这个插件虽然小(压缩后不到4KB),但是功能很丰富,也有很好的文档。

 

我们先下载这个插件,在程序目录/public/javascripts下保存为jquery.ba-url.js,然后我们在产品index页面中引用它。因为需要在pagination.js之前引用它,所以我们需要修改引用JavaScript的那行代码,把它加到pagination的前面。

 

<% javascript 'jquery.ba-url', 'pagination' %>  

 

改进一下我们的分页代码

在我们开始修改代码来用这个插件之前,我们先看一下上集中我们写的分页的代码。

$(function () {     
  $('.pagination a').live("click", function () {       
    $('.pagination').html('Page is loading...');       
    $.get(this.href, null, null, 'script');       
    return false;     
  });   
}); 

 

我们可以对这个代码稍稍做些改进。不再使用$.get而是用$.getScript来发起AJAX请求,传入的参数是我们要调用的URL。

 

$.getScript(this.href);  

 $.getScript函数向作为参数传入的URL发起一个GET请求,然后执行返回的JavaScript代码,功能和$.get一样,但是代码更简洁。

 

为每一页指定一个唯一的URL

现在来给我们的程序实现一些新的功能。我们要做的是每当一个分页链接被点击后,用JavaScript来更新URL。这样每一个产品页都有一个唯一的URL,我们就可以把它加到书签里了。我们需要给我们所在产品页对应的唯一URL加上一个锚标签。例如,对于第二页,如果程序是在本地运行,URL将会表示为:

 

http://localhost:3000/#page=2

我们可以利用之前下载的插件来设置这个URL。插件有一个叫$.setFragment的方法,能够修改当前URL的锚标签部分。在我们的pagination代码中可以这样来用:

 

$(function () {     
  $('.pagination a').live("click", function () {       
    $.setFragment({ page: $.queryString(this.href).page });       
    $('.pagination').html('Page is loading...');       
    $.getScript(this.href);       
    return false;     
  });   
}); 

工作原理是这样的,给$.setFragment传入一个JavaScript的原值对象,它会把他们转成象querystring一样的键值对。我们希望得到一个形如page=x的锚标签,所以我们传入一个键是page的对象。但是我们如何得到页码值呢?其实,这个页码值已经在我们AJAX调用的URL的 querystring里面了。要得到这个值,我们可以用$.queryString函数把querystring中的键值对转化为JavaScript对象,然后从page项中就可以得到这个值。

 

我们现在可以试一下我们修改后的pagination代码。加载完我们的产品页面,然后点击“下一页”,随着AJAX请求的发出,URL也发生了变化。我们看到浏览器的返回按钮现在也是可用的,说明上一页已经被记录到浏览器的历史记录中了。

 

 

搞定返回按钮

事情还没有完。虽然返回和前进按钮可以用了,但是点击它们时并不能改变页面的内容。还有就是,当我们重新打开我们收录的书签页,或者刷新页面,那么,不管URL中锚标签的页码值是多少,显示的都是第一页的产品项。

 

我们先来解决返回和前进按钮。为了让它们能工作,我们需要侦听URL中锚标签变化时的一个事件。这是我们用的这个插件所支持的功能。在我们的pagination代码中增加下面一行JavaScript代码,可以激活这个功能。

 

$.fragmentChange(true); 

现在我们就可以侦听到这个事件了。我们可以调用$(document).bind函数,传入这个我们要侦听的事件的名字。如果我们再传入我们关注的那个锚标签的名字,那么这个事件就只会在那个锚标签发生改变时被触发。我们还需要传入一个绑定的函数,在事件被触发时能够被执行。现在,我们只是弹出一个alert来测试一下是不是万事俱备。

 

$(document).bind("fragmentChange.page", function () {     
  alert('fragment changed!');   
});  

现在我们刷新页面并且点其中的一个链接,我们可以看到弹出的alert,同时也看到URL中的锚标签也变化了。当我们点击返回或者前进按钮时,我们也可以看到alert弹出来。

 

 

现在点击任意一个链接都可以捕获到fragmentChange事件,我们就可以把AJAX请求搬到那个响应事件的函数中去了。那样的话,点击返回按钮也可以发出AJAX请求了。但是,这给我们带来了一点小问题。下面是我们要搬过去的那行代码。

 

$.getScript(this.href);  

 上面的代码中要引用的分页链接已经没法再得到了,我们不得不用其他方法得到页码值。所幸,点击链接时运行的代码会改变URL中的锚标签,所以我们可以从那里得到页码值。

 

$.getScript(     
  $.queryString(       
    document.location.href, { 'page':$.fragment().page }     
  )   
); 

 

这块代码有点复杂,所以我们把它分解成多行使其更清晰一些。为了得到正确的URL,我们使用了$.queryString函数,传入参数document.location.href来获得页面URL的主体部分,传入一个键值为page的JavaScript对象来构造querystring。通过调用$.fragment().page,我们可以从URL的锚标签部分得到正确的页码值。构造出正确的URL,我们就可以把它作为$.getScript的参数来发起AJAX请求了。

 

如果现在我们刷新页面并且点击这些链接,返回按钮依然可用。但是现在再点击返回按钮,fragmentChange事件将被触发,AJAX请求会更新产品列表,从而显示出正确的产品页。

 

书签收录和页面刷新

大功即将告成,不过页面上还有一点不如人意的地方。如果我们在浏览某一产品页时刷新了页面,我们依然只能看到第一页产品。如果我们收录了某一页到书签中,然后再打开它,也会有同样的问题。

 

解决这个问题的方法是,当页面的URL中存在锚标签时,在页面刷新时能够触发fragmentChange事件。为此,我们需要在pagination中在加入几行JavaScript代码。

 

if ($.fragment().page) {     
  $(document).trigger("fragmentChange.page");   
}

 

这段代码在页面刷新的时候看URL中是否有一个锚标签,如果有就触发fragmentChange事件,这样就可以加载正确的产品页了。

 

最终完整的pagination代码如下所示:

 

$(function () {       
  $('.pagination a').live("click", function () {           
    $.setFragment({ page: $.queryString(this.href).page });           
    $('.pagination').html('Page is loading...');           
    return false;       
  });       

  $.fragmentChange(true);       
    $(document).bind("fragmentChange.page", function () {           
    $.getScript($.queryString(document.location.href, { 'page': $.fragment().page }));       
  });       

  if ($.fragment().page) {           
    $(document).trigger("fragmentChange.page");       
  }   
}); 

 

现在我们可以通过AJAX的方式来对产品列表翻页,并且支持浏览器的前进和返回按钮,而且能够将其中某一页收录到书签里。

 

在我们的程序中,我们使用jQuery开发了分页功能,其实还有很多用户是使用Prototype的。如果你用ProtoType,Prototypeextensions程序库中也有类似的支持AJAX浏览记录的功能。

  • 大小: 58 KB
  • 大小: 64.4 KB
  • 大小: 65.5 KB
0
0
分享到:
评论

相关推荐

    Ajax教程PDF

    4. **历史记录和书签**:默认情况下,使用Ajax的页面无法添加到浏览器的历史记录中,不利于用户通过书签或后退按钮访问。 在压缩包中,"AJAX开发简略(含续一)2.pdf"可能是详细的Ajax教程,涵盖Ajax的基本概念、使用...

    ajax基础简单易懂教程

    4. **历史记录管理**:Ajax加载的内容无法自动添加到浏览器的历史记录,不利于用户回溯。 **五、Ajax进阶技术** 1. **jQuery和库的使用**:jQuery简化了Ajax的使用,提供了`$.ajax()`、`$.get()`、`$.post()`等...

    ajax无刷新分页

    2. **发送请求**: 当用户点击分页链接时,前端组件通过Ajax调用XMLHttpRequest对象,向服务器发送请求,请求参数通常包括当前页码和每页显示的记录数。 3. **服务器响应**: 服务器接收到请求后,根据请求参数查询...

    Asp+AJAX静态分页

    - 请求类型通常为GET,因为数据量不大,且URL可被浏览器记录和书签。 - 在请求成功回调函数中,处理服务器返回的数据,并更新DOM中的内容。 3. **后端处理**: - Asp接收到AJAX请求后,解析请求参数,确定要返回...

    Getting Started with Ajax

    GET请求可以被缓存、保留在浏览器历史记录中、收藏为书签等。 - **POST**:用于向服务器提交数据。POST请求不会被缓存,也不会保存到历史记录中。 #### 使用XMLHttpRequest (XHR) Ajax的核心技术之一是...

    ajax_transportation_methods.ppt

    - **历史记录与书签**:使用History API和书签管理,确保Ajax页面可以正确保存浏览历史和添加书签。 总之,Ajax技术通过非同步通信极大地提升了Web应用的交互性和效率,而随着技术的发展,各种框架和解决方案不断...

    最全的Ajax的知识结构

    缺点:破坏了常规的浏览模式,不支持书签和前进/后退,SEO困难,需要考虑兼容性和错误处理。 **10. 常见应用场景** Ajax广泛应用于实时聊天、动态加载内容、表单提交验证、地图应用、新闻滚动等场景,使Web应用更加...

    Ajax讲解,dwr配置

    还需要关注Ajax的一些挑战和解决方案,例如浏览器兼容性问题、跨域安全限制、Java数据序列化、JSON-RPC、DOJO、GWT、iframe、Prototype库的使用、超时与错误处理、Reverse AJAX(Comet技术)以保持服务器到客户端的...

    使用ajax实现了分页

    5. 可见性:GET请求在浏览器地址栏可见,方便用户书签和分享;POST请求的数据对用户来说是不可见的。 6. 重提交:GET请求可以被用户直接通过浏览器的前进/后退按钮重复,可能导致数据的重复提交;POST请求在用户按...

    C# 如何使用ajax请求

    缺点是它可能导致浏览器历史记录和书签功能失效,以及对 SEO(搜索引擎优化)的影响。 通过以上步骤,你可以在 C# 中实现 AJAX 请求,从而创建出更高效的、响应式的网页应用程序。记得在实际项目中根据需求调整代码...

    pjax (ajax + pushState的封装) 无刷新翻页等.zip

    它结合了Ajax(异步JavaScript和XML)和HTML5的History API(尤其是PushState方法),旨在提供更快的页面加载速度,提升用户体验,同时保持URL的可书签性和回退功能。 **Ajax简介** Ajax(异步JavaScript和XML)...

    基于云书签服务的个性化推荐WebOS系统.pdf

    在实现个性化推荐WebOS系统的过程中,系统需要采集用户的网页收藏和浏览记录,并基于这些数据通过推荐算法为用户推荐感兴趣的网站。例如,如果系统发现用户经常在淘宝购物,便可能自动推荐亚马逊、京东商城、Ebay等...

    Firefox火狐浏览器官方3.0.6-win32版本exe安装包

    同时,Firefox的智能地址栏允许用户快速搜索历史记录和书签,提供了便捷的导航功能。 在Web标准支持方面,Firefox 3.0.6对HTML、CSS、JavaScript等标准有深入的贯彻,确保用户能够正确显示和使用各种现代网页。尤其...

    Firefox火狐浏览器官方3.0.10-mac版本dmg安装包

    在界面设计上,Firefox 3.0.10采用了简洁直观的布局,便于用户快速访问书签、历史记录和下载管理器。同时,该版本还支持自定义工具栏,用户可以根据自己的需求添加或移除按钮,实现个性化操作。 对于Mac用户而言,...

    不间断滚动实例不间断滚动实例

    - 浏览历史和书签:不间断滚动的页面不利于创建准确的浏览历史记录和书签。 总结,不间断滚动是一种提升用户体验的设计模式,尤其适用于需要展示大量内容的场景。然而,实施时需注意平衡用户体验、性能和SEO等因素...

    书签

    书签在IT行业中,特别是在网页浏览和Web开发中扮演着重要的角色。HTML(HyperText Markup Language)是构建网页的基础语言,书签功能是HTML提供的一种方便用户保存和管理感兴趣网页的机制。在这个“书签”项目中,...

    Firefox Setup 30

    5. **Firefox Sync**:Firefox 30.0改进了同步功能,让用户能够在不同设备之间无缝同步书签、历史记录、密码和其他浏览数据。 6. **与Dynatrace AJAX Edition的兼容性**:这个版本的Firefox与Dynatrace AJAX ...

    pjax demo实例 可以研究下

    4. **表单和书签**:Pjax页面中的表单提交和书签功能需要特殊处理,以确保在Pjax和非Pjax模式下都能正常工作。 在"Pjax demo实例"中,我们可以看到一个实际的Pjax应用,通过研究其代码和交互流程,能更好地理解和...

    JavaScript+JQuery教程

    在JavaScript和jQuery的世界里,AJAX(异步JavaScript和XML)是一种核心技术,它使得网页无需刷新即可与服务器交换数据并更新部分网页内容。本文主要探讨了AJAX中GET和POST两种请求方式的区别,以及如何解决AJAX请求...

    树形菜单的两种实现方式

    5. 路由与状态管理:在SPA(单页应用)中,Ajax树形菜单常与前端路由配合使用,点击菜单项时,不仅更新视图,还可以更改URL,实现历史记录和书签功能。同时,状态管理库(如Redux、Vuex)可以帮助管理和同步菜单的...

Global site tag (gtag.js) - Google Analytics