Rails系统中的AJAX开发技术简析

2016-02-19 19:18 6 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享Rails系统中的AJAX开发技术简析的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - Web开发 】

  一、 Ajax的简短历史

  在短短几个月内,Ajax从一种十分模糊稀罕的技术一下变成最热门的东西。本文将介绍极其容易使用的Ajax支持-作为Ruby on Rails web应用程序框架的一部分实现。
本文不是一个详细的教程,所以我假定你已经了解一点关于如何组织和构建一个Rails web应用程序的知识。

  最开始出现的是万维网。比较于桌面应用程序,web应用程序相当缓慢和沉闷。无论如何,人们都喜欢上了web应用程序,因为他们无论在什么地方都能上网,只要身边的计算机上安装一个浏览器就行。之后,微软在Internet Explorer 5中创建了XMLHttpRequest,它使得浏览器端JavaScript可以与web服务器在后台进行通讯而不需要浏览器显示一新的web页面。这使得人们有可能开发更具有流畅性和响应性的web应用程序。Mozilla不久在它的浏览器中也实现了XMLHttpRequest,还有Apple(Safari浏览器)和Opera等公司。

  XMLHttpRequest原先一定是Web上的一个被保持得最好的秘密。自从它在1998年初次登场,只有很少几个站点使用它,而大多数开发者,如果他们曾经了解过它的话,也从未使用过它。Google最终改变了这一现状-它发行了一系列的高度轮廓性的web应用程序-在XMLHttpRequest技术支持下,它们拥有平滑的新颖的UI。最具有视觉吸引力的是Google Maps,它给你产生这样的幻想-能够在它的很小的窗口中围绕着一个无限大小的地图拖动鼠标。

  当Google的突出对XMLHttpRequest的使用的事实戏剧性地表明完全可以大大改进web应用程序UI效果的时候,是Jesse James Garrett的一篇论文最终给了这种技术一个可用的名字:Ajax(异步JavaScript和XML)。如果还不了解它的话,我们的整个业界至今可能还在等待之中。如今新的Ajax名字就象疾风野火迅速传播开来。我从来没见过如此迅速和这么亲近地采纳一种新技术!

  二、 传统型Web应用程序与Ajax应用程序的对比

  让我们通过分析一个使用案例-把一个新项插入到一个列表中-来看一下一个Ajax web应用程序最本质的所在。

  在例中实现了一典型用户接口-在一个web页面中显示当前列表,后面跟着一个输入字段-用户在此可以输入一个新项的文本。当用户点击一个新建项目按钮时,应用程序实际上创键并把一个新项插入到列表中。
 
  在这种情况下,一传统型web应用程序会发送输入字段值到服务器;然后,服务器作用于数据(通常通过更新一数据库)并通过发送回一个新的web页面-它显示一个被更新后的包含该新项的列表-作为响应。这种情况占用了很多带宽,因为大多数新的页面内容与原先的完全一样。这个web应用程序的性能随着列表的增长而逐渐下降。

  相反,一个Ajax web应用程序在后台发送输入字段到服务器并且只更改当前web页面受到影响的部分。这大大提高了用户接口的响应能力,使它感觉起来象一个桌面应用程序。

  你可以亲自试验一下这些效果。下面是一些到不同博客的链接,其中的一个使用Ajax来发送评价而另一个没用。你可以在它们之间相互寄送进行实验:

  ·传统型的Web应用程序

  ·Ajax Web应用程序

  注意,Ajax仅仅在于使用性。但是,就象任何技术一样,你可以高效地使用它,也可能低效地使用。在展示了怎样使用Ajax之后,我将给出一些关于何时使用Ajax的简单建议。

  三、 怎样在Web应用程序中使用Ajax

  在你的web应用程序中使用Ajax技术的较麻烦的方法是创建你自己的定制JavaScript-它直接使用XMLHttpRequest对象的API。为此,你必须处理每种浏览器的特性。

  一个较容易些的办法是使用一个JavaScript库-它提供了较高级的Ajax服务并且隐藏了浏览器之间的差别。象DWR,Prototype,Sajax和Ajax.NET这样的库都是很好的选择。

  最容易的办法是使用Rails中内建的Ajax工具。事实上,Rails使Ajax变得如此容易,以至于在典型情况下,使用Ajax和不用变得几乎一样容易。

  四、 Rails是怎样实现Ajax的

  Rails拥有一个简单的一致性模型来实现Ajax操作。

  一旦浏览器生成并显示了起始web页面,不同的用户操作要求它显示一个新的web页面(就象任何传统型的web应用程序)或触发一个Ajax操作:

  1. 发生一个触发器行动。这可能是用户点击一个按钮或一个超级链接或者用户改变了表单中的数据或字段中的数据,或只是一个周期的触发器(基于一个定时器)。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  2. 与触发器相联系的数据(一个字段或一个完整的表单)经由XMLHttpRequest被异步地发送到服务器上的一个行动处理器。

  3. 服务器端行动处理器基于这些数据采取一些行动(这就是为什么称为一个行动处理器),并且返回一个HTML片断作为它的响应。

  4. 客户端JavaScript(由Rails自动地创建)收到该HTML片断并且使用它更新当前HTML页面指定的部分,经常是一个<div>标签的内容。

  一个到服务器的Ajax请求也可能返回任意的数据,但是我将仅讨论一下HTML片断。真实的美丽在于Rails使得在你的web应用程序中实现这些是多么地容易。

五、 使用link_to_remote

  Rails有若干帮助者方法以在你的视图的模板中实现Ajax。一种最简单且很通用的方法就是link_to_remote()。让我们考察一个简单的web页面-它实现询问时间并且有一个链接,用户可以点击这个链接来获得当前的时间。该应用程序经由link_to_remote()使用Ajax以检索时间并且显示它于web页面。

  我的视图模板(index.rhtml)看起来象:

<html>
<head>
<title>Ajax Demo</title>
<%= javascript_include_tag "prototype" %>
</head>
<body>
<h1>What time is it?</h1>
<div id="time_div">
I don’t have the time, but
<%= link_to_remote( "点击这里",
:update => "time_div",
:url =>{ :action => :say_when }) %>
and I will look it up.
</div>
</body>
</html>

  上面的模板中有两个很有意思的帮助者方法,以粗体标出。javascript_include_tag()包括了Prototype JavaScript库。所有的Rails Ajax特性都使用这个JavaScript库-它被包含在Rails分发包之中。

  这里的link_to_remote()调用使用了它的最简单的形式,有3个参数:

  1. 要显示的链接文本-在本例中是,"点击这里"。

  2. DOM元素的id,它包含将用行动执行结果进行替换的内容,在本例中是time_div。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

  3. 要调用的服务器端行动的URL-在本例中是,一个叫作say_when的行动。

  我的控制器类看起来象:

class DemoController < ApplicationController
def index
end
def say_when
render_text "<p>The time is <b>" + DateTime.now.to_s + "</b></p>"
end
end

  这里的索引行动处理器不做任何东西,除了让Rails承认有一个索引行动并生成index.rhtml模板外。这个say_when行动处理器构建一个HTML片断-它包含当前日期和时间。图1和2显示了在点击"点击这里"链接前后索引页面是怎样显示的。

  当用户点击"点击这里"链接时,浏览器构建一个XMLHttpRequest对象,并把它发送到服务器-伴随一个将调用say_when行动处理器的URL-它返回一个包含当前时间的HTML响应片断。客户端JavaScript接收到该响应并且通过它来用一个time_div id替换<div>的内容。

  也有可能插入这个响应,而不是代替现有内容:

<%= link_to_remote( "点击这里",
:update => "time_div",
:url => { :action => :say_when },
:position => "after" ) %>

  我增加了一可选的参数:position=>"after"-它让Rails嵌入返回的HTML片断于目标元素(time_div)之后。位置参数能接受值before,after,top,和bottom-其中top和bottom插入到目标元素的内部,而before和after插入到目标元素的外部。

  在任何情况下,既然我添加了位置参数,那么"点击这里"链接就不会消失。因此,我可以不断地点击它并观察新加到页面上的时间。

  这个web页面和被浏览器显示的URL都没有改变。在这样类似的小例子中,即使对一个完整的页面更新也节省不了多少时间。但是,当你有一更复杂的页面而其中仅需要更新很小的一部分时,这种差别将变得非常显著。

六、 使用form_remote_tag

  这个form_remote_tag()帮助函数与link_to_remote()很相似,除了它也发送一个HTML表单的内容之外。这意味着该行动处理器可以使用用户输入的数据来形成响应。这个实例显示了一个web页面-它有一个列表和一个支持Ajax的表单-该表单能够让用户添加一些选项到该列表中。

  我的视图模板(index.rhtml)看上去象:

<html>
<head>
<title>Ajax List Demo</title>
<%= javascript_include_tag "prototype" %>
</head>
<body>
<h3>Add to list using Ajax</h3>
<%= form_remote_tag(:update => "my_list",
:url => { :action => :add_item },
:position => "top" ) %>
New item text:
<%= text_field_tag :newitem %>
<%= submit_tag "Add item with Ajax" %>
<%= end_form_tag %>
<ul id="my_list">
<li>Original item... please add more!</li>
</ul>
</body>
</html>

  请注意上面加粗的两部分,它们定义了表单的开始和结束。因为该表单以form_remote_tag()而不是form_tag()开始,应用程序将使用XMLHttpRequest提交这个表单。form_remote_tag()中的参数看上去是:

  ·更新参数用于指定DOM元素的id及行动执行结果要更新的内容-在本例中是my_list。

  ·url参数用于指定服务器端行动-在本例中,调用一个称为add_item的行动。

  ·位置参数代表插入到my_list元素顶部的返回的HTML片断-在本例中是一个<UL>标签

  我的控制器类看起来象下面这样:

class ListdemoController < ApplicationController
def index
end
def add_item
render_text "<li>" + params[:newitem] + "</li>"
end
end

  add_item行动处理器构建一个HTML列表项片断,它包含输入到表单的newitem字段中的任何文本。

七、 使用观察器

  Rails能够让你监视一个字段的值,并且在无论何时字段值发生变化时,都作一次到一个行动处理器的Ajax调用。当前被观察字段的值被发送到本次调用相关的寄送数据的行动处理器中。

  最常用的一种情况是实现一个实况查找:

<label for="searchtext">Live Search:</label>
<%= text_field_tag :searchtext %>
<%= observe_field(:searchtext,
:frequency => 0.25,
:update => :search_hits,
:url => { :action => :live_search }) %>
<p>Search Results:</p>
<div id="search_hits"></div>

  这个代码小片段实现监视一个称为searchtext的文本框字段的值。每隔四分之一秒,Rails检查该字段的变化。如果该字段发生变化,浏览器将作一个到live_search行动处理器的Ajax调用,并把结果显示在search_hits div中。

  你可以在我的博客上看到一个这种现场查找的实际展示。在右上角的搜索框中,你可以试着输入"enterprise"或"rails",看看发生了什么。

  八、 是否应用Ajax技术

  当你使用Ajax技术来更新一个web页面部分时,用户得到的是快速响应性和流畅性。然而,用户也失去了书签功能和使用浏览器的向后按钮的能力。这两个缺点

来源:http://www.tulaoshi.com/n/20160219/1620661.html

延伸阅读
标签: Web开发
常见的AJAX框架有: DWR - Web Remoting Buffalo - Web Remoting (based on prototype) prototype - JS OO library openrico - JS UI component (based on prototype) dojo - JS library and UI component qooxdoo - JS UI component (C/S Style) YUL - JS UI component 其中关于DWR和Buffalo之间的比较,它们都是Web Remoting框架,...
标签: Delphi
摘要: 随着信息化社会的发展和不同系统间数据交换的要求,XML将成为不同系统间数据交换的标准和传输格式。本文结合实例介绍了如何在Delphi中应用XML进行编程的技术。 关键字: 可扩展标记语言,Delphi, Web Service, InternetExpress. 1. XML及其背景 XML即Extensible Markup Language(可扩展标记语言)的缩写[1]。XM...
标签: word
Word2010中纵横混排技巧简析   纵横混排,是大家在Word中比较少用的排版技巧,不过却又是十分的实用。虽然Word中本身有自带纵横混排的功能,但是用户较多是用文本框来实现的。 纵横混排 步骤/方法: 打开你的的word,然后点击菜单栏上面的插入选项。 在插入选项中,我们点击 文本。也就是下面图示位置。 ...
标签: Web开发
基于XML的异步JavaScript,简称AJAX,是当前Web创新(称为Web2.0)中的一个王冠。感谢组成AJAX的各种技术,Web应用的交互如Flickr, Backpack和Google在这方面已经有质的飞跃。这个术语源自描述从基于网页的Web应用到基于数据的应用的转换。在基于数据的应用中,用户需求的数据如联系人列表,可以从独立于实际网页的服务端取得并且可以被动...
Project Dynamic Faces是数个扩展JavaServer Faces技术的的项目之一。Project Dynamic Faces是一个创新型的项目,提供了向基于JavaServer Faces技术的应用软件增添Ajax功能的方法。它使我们能够让应用软件已经在使用的任何JavaServer Faces组件支持Ajax功能。我们无需对组件进行修改就能够使它们支持Ajax,我们也无需对应用软件进行任何修改...

经验教程

796

收藏

80
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部