在第43个railscast, 我们介绍了如何通过ajax来更新页面的多个元素,我们使用了Prototype libraries 和 form_remote_for 来提交AJAX请求, 和使用RJS模板生成javascript作为response,返回给浏览器,更新这些元素。
在本节中,我们将使用jQuery, 而不是Prototype 和 RJS, 来做同样的事情。
既然使用jQuery,我们就不能够再使用rails提供的RJS或者任何的辅助方法如form_remote_for了。
如果我们仍然想使用RJS,那么就要安装一个plugin叫做jRails的。
这个plugin将会rewrite那些 与jQuery 协同工作的方法, 但是这里我们只会单独使用jQuery, 因为 它可以使我们javascript更隐蔽,在页面看不出来,增强我们的rails应用的安全性。
继续以前面的程序为例,我们的页面显示了一个产品,并且允许用户添加评论,当一个新的评论被添加,他会显示在review的列表中,那个显示有几条评论的数字会被更新,form会被reset,并且会有一个flash。
当前的处理方式是浏览器提交post请求,然后重新载入这个页面,我们将要写一些jQuery代码,来让form把他的数据通过AJAX请求传送到服务器,然后在不用reload的前提下更新当前页面。
{========================================================>
map.resources :product, :has_many => :reviews
将生成很多的路径,例如/product/1/reviews/create etc.
========================================================>}
2. 添加jQuery到我们的程序:
第一件要做的事情就是添加 jQuery库到我们程序,可以从jQuery网站下载,下载之后,把它放到public/javascripts 目录下, 然后,我们要在layout 页面中添加对这个库的引用(在header 部分)
<%= javascript_include_tag ['jquery-1.3.2', 'application'] %>
每一个jQuery的版本包含两个版本,一个开发版和一个精简版,最好使用开发版,因为他会使得调试比较容易。 除了引用jquery库,还要引用application.js 库, 因为我们的jQuery代码会被放到application.js中。 不过jquery的引用要在前面,要保证application.js 被load之前, jquery已经load进来了。
3. 添加隐蔽的javascript
为了使我们的javascript更隐蔽,我们不希望修改view代码,而是通过jQuery动态的修改页面的元素行为,我们首先写一个函数,这个函数在form被submit的时候将会执行。
我们的form含有一个new_review的id,下面的代码将会通过AJAX方式将这个id传给server。
我们来分析一下上面的代码:
第一行创建一个函数,这个函数在document的对象模型被loaded完成后就会执行。
第二行通过我们的form的id找到form,然后也创建一个函数,这个函数在form被submit的时候就会执行。但是我们的form没有定义new_review的id啊,原来这也是rails的约定,form_for 生成的 html form的 id 就是 new_**** 呵呵
第三行创建一个AJAX请求,这个请求将会被提交到服务器,$.post 这个函数接受4个参数,第一个参数是url,也就是请求将会被提交到的url,这里我们赋给这个参数的值是form的action属性。
第二个参数是要提交的数据,在这里,我们使用了jQuery的serialize方法,这个方法将会人工将form的各个元素序列化为一序列的 key/value 对,供传送到server。
下一个参数是一个回调函数 callback function, 这个函数将会在AJAX请求完成后自动执行,这里我们用不到,所以置为null。
为什么我们用不到呢? 因为我们的第四个参数是“script”, 他告诉 $.post 函数,服务器将会返回一段javascript代码,这段代码应该白浏览器执行。
如果你关心$.post的更多的细节,请参考jQuery.com 的文档。
最后一行,我们return false, 目的是使默认的submit 行为不被触发。
4. 下面我们该修改reviews controller了,使得他能够同时处理html 和 javascript 两种请求。 当前,它保存这个新的review,然后重定向到product的show页面,对于javascript请求,不能使用redirect,我们将使用respond_to 来建立两种处理block。
为什么js block是空的呢?因为它只需要我们创建的javascript返回给浏览器,这写javascript存在与create.js.erb中, (没有安装jRails插件,我们不能使用RJS模板)所以我们使用的js.erb文件。
下面我们首先加入一行简单的 alert 到create.js.erb 文件中。 检查一下我们的流程是否走通了。
alert("hello from AJAX")
我做到这一步的时候,已经成功了,但是不知道为什么原文中说还要有下面一步才能工作:
rails并不知道jQuery提交的请求想让他返回html还是javascript,我们得想办法告诉rails我们提交的是javascript请求,如何告诉呢?
第一种方法是,在$.post 方法的url参数中, 添加.js 后缀,这样rails就知道应该返回javascript了
第二种方法也是我们最推荐的方法,因为使用这种方法,适用于所有页面的jQuery请求,不需要重复了。 那就是往 application.js 文件中加入如下一行:
这几行代码的意思是修改request的header中的Accept属性,告诉rails让他返回javascript。
5. 添加jQuery code,生成javascript代码,返回给浏览器执行。
我们下面就要用真实的jQuery code来替换stupid alert了。这些代码的作用更新浏览器的当前页面。
第一件事情是添加一个flash,我们将在form前添加一个div:
要添加动态的内容,方法是把erb tags嵌入到javascript中,使用escape_javascript是为了使得从erb输出的结果是安全的。而且我们还调用了flash.delete来马上清空flash,使得下次请求不会再次出现flash。
还需要更新有多少review那个数字,他的id是review_count, jQuery的html方法可以用来更改他的内容:
还要把新添加的review显示出来,每一review都是作为一个list的一个item通过partial来渲染的,要把新的review显示出来,我们需要使用新的review渲染partial,然后append到list上。
最后,还要reset form:
$('#new_review')[0].reset();
$ 是一个 jQuery 函数, 他会返回一个jQuery对象,他返回的只是一个jQuery对象,我们要得到实际的DOM元素的话,还需要指定他的数组的第一个元素。
6. 以上,我们都是使用jQuery现成的函数,下面我们演示如何定义你自己的函数:
上面这段代码是提交AJAX请求,如果我们要在多个form使用这个函数,我们可以把这个功能抽象成一个jQuery函数,
$('#new_review').submitWithAjax();
而我们自己的函数定义如下:
在本节中,我们将使用jQuery, 而不是Prototype 和 RJS, 来做同样的事情。
既然使用jQuery,我们就不能够再使用rails提供的RJS或者任何的辅助方法如form_remote_for了。
如果我们仍然想使用RJS,那么就要安装一个plugin叫做jRails的。
这个plugin将会rewrite那些 与jQuery 协同工作的方法, 但是这里我们只会单独使用jQuery, 因为 它可以使我们javascript更隐蔽,在页面看不出来,增强我们的rails应用的安全性。
继续以前面的程序为例,我们的页面显示了一个产品,并且允许用户添加评论,当一个新的评论被添加,他会显示在review的列表中,那个显示有几条评论的数字会被更新,form会被reset,并且会有一个flash。
当前的处理方式是浏览器提交post请求,然后重新载入这个页面,我们将要写一些jQuery代码,来让form把他的数据通过AJAX请求传送到服务器,然后在不用reload的前提下更新当前页面。
{========================================================>
map.resources :product, :has_many => :reviews
将生成很多的路径,例如/product/1/reviews/create etc.
========================================================>}
2. 添加jQuery到我们的程序:
第一件要做的事情就是添加 jQuery库到我们程序,可以从jQuery网站下载,下载之后,把它放到public/javascripts 目录下, 然后,我们要在layout 页面中添加对这个库的引用(在header 部分)
<%= javascript_include_tag ['jquery-1.3.2', 'application'] %>
每一个jQuery的版本包含两个版本,一个开发版和一个精简版,最好使用开发版,因为他会使得调试比较容易。 除了引用jquery库,还要引用application.js 库, 因为我们的jQuery代码会被放到application.js中。 不过jquery的引用要在前面,要保证application.js 被load之前, jquery已经load进来了。
3. 添加隐蔽的javascript
为了使我们的javascript更隐蔽,我们不希望修改view代码,而是通过jQuery动态的修改页面的元素行为,我们首先写一个函数,这个函数在form被submit的时候将会执行。
我们的form含有一个new_review的id,下面的代码将会通过AJAX方式将这个id传给server。
$(document).ready(function(){ $('#new_review').submit(function(){ $.post($(this).attr('action'), $(this).serialize(), null, "script"); return false; }); });
我们来分析一下上面的代码:
第一行创建一个函数,这个函数在document的对象模型被loaded完成后就会执行。
第二行通过我们的form的id找到form,然后也创建一个函数,这个函数在form被submit的时候就会执行。但是我们的form没有定义new_review的id啊,原来这也是rails的约定,form_for 生成的 html form的 id 就是 new_**** 呵呵
第三行创建一个AJAX请求,这个请求将会被提交到服务器,$.post 这个函数接受4个参数,第一个参数是url,也就是请求将会被提交到的url,这里我们赋给这个参数的值是form的action属性。
第二个参数是要提交的数据,在这里,我们使用了jQuery的serialize方法,这个方法将会人工将form的各个元素序列化为一序列的 key/value 对,供传送到server。
下一个参数是一个回调函数 callback function, 这个函数将会在AJAX请求完成后自动执行,这里我们用不到,所以置为null。
为什么我们用不到呢? 因为我们的第四个参数是“script”, 他告诉 $.post 函数,服务器将会返回一段javascript代码,这段代码应该白浏览器执行。
如果你关心$.post的更多的细节,请参考jQuery.com 的文档。
最后一行,我们return false, 目的是使默认的submit 行为不被触发。
4. 下面我们该修改reviews controller了,使得他能够同时处理html 和 javascript 两种请求。 当前,它保存这个新的review,然后重定向到product的show页面,对于javascript请求,不能使用redirect,我们将使用respond_to 来建立两种处理block。
def create @review = Review.create!(params[:review]) flash[:notice] = "Thank you for your review" respond_to do |format| format.html {redirect_to @review.product} format.js end end
为什么js block是空的呢?因为它只需要我们创建的javascript返回给浏览器,这写javascript存在与create.js.erb中, (没有安装jRails插件,我们不能使用RJS模板)所以我们使用的js.erb文件。
下面我们首先加入一行简单的 alert 到create.js.erb 文件中。 检查一下我们的流程是否走通了。
alert("hello from AJAX")
我做到这一步的时候,已经成功了,但是不知道为什么原文中说还要有下面一步才能工作:
rails并不知道jQuery提交的请求想让他返回html还是javascript,我们得想办法告诉rails我们提交的是javascript请求,如何告诉呢?
第一种方法是,在$.post 方法的url参数中, 添加.js 后缀,这样rails就知道应该返回javascript了
第二种方法也是我们最推荐的方法,因为使用这种方法,适用于所有页面的jQuery请求,不需要重复了。 那就是往 application.js 文件中加入如下一行:
jQuery.ajaxSetup({ 'beforeSend': function(xhr){xhr.setRequestHeader("Accept", "text/javascript")} })
这几行代码的意思是修改request的header中的Accept属性,告诉rails让他返回javascript。
5. 添加jQuery code,生成javascript代码,返回给浏览器执行。
我们下面就要用真实的jQuery code来替换stupid alert了。这些代码的作用更新浏览器的当前页面。
第一件事情是添加一个flash,我们将在form前添加一个div:
$('#new_review').before('<div id="flash_notice"><%= escape_javascript(flash.delete(:notice))</div>');,
要添加动态的内容,方法是把erb tags嵌入到javascript中,使用escape_javascript是为了使得从erb输出的结果是安全的。而且我们还调用了flash.delete来马上清空flash,使得下次请求不会再次出现flash。
还需要更新有多少review那个数字,他的id是review_count, jQuery的html方法可以用来更改他的内容:
$('#reviews_count').html('<%= pluralize(@review.product.reviews.count, "Review")%>');
还要把新添加的review显示出来,每一review都是作为一个list的一个item通过partial来渲染的,要把新的review显示出来,我们需要使用新的review渲染partial,然后append到list上。
$('#reviews').append('<%=escape_javascript(render(:partial => @review))%>')
最后,还要reset form:
$('#new_review')[0].reset();
$ 是一个 jQuery 函数, 他会返回一个jQuery对象,他返回的只是一个jQuery对象,我们要得到实际的DOM元素的话,还需要指定他的数组的第一个元素。
6. 以上,我们都是使用jQuery现成的函数,下面我们演示如何定义你自己的函数:
$('#new_review').submit(function(){ $.post($(this).attr('action'), $(this).serialize(), null, "script"); return false; });
上面这段代码是提交AJAX请求,如果我们要在多个form使用这个函数,我们可以把这个功能抽象成一个jQuery函数,
$('#new_review').submitWithAjax();
而我们自己的函数定义如下:
jQuery.fn.submitWithAjax = function() { this.submit(function(){ $.post($(this).attr('action'), $(this).serialize(),null,"script"); return false; }); }
评论
1 楼
waiting
2009-12-07
既然都指定了dataType为'script'那就不必特别在beforeSend里面修改了吧?
$.post($(this).attr('action'), $(this).serialize(), null, "script");
$.post($(this).attr('action'), $(this).serialize(), null, "script");
引用
dataTypeString
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,可用值:
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了"cache"参数。'''注意:'''在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
"text": 返回纯文本字符串
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,可用值:
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了"cache"参数。'''注意:'''在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
"text": 返回纯文本字符串
发表评论
-
12.3.3 scaling issue of the status feed
2011-10-30 17:54 800the problem of the implementati ... -
12.3 the status feed
2011-10-30 15:34 8491. we need to get all the micro ... -
12.2 a working follow button with Ajax
2011-10-29 18:10 9011. in the last chapter, in the ... -
12.2 a web interface for following and followers.
2011-10-28 22:14 8671.before we do the UI, we need ... -
12. following user, 12.1 relationship model
2011-10-18 14:29 7351. we need to use a relationshi ... -
11.3 manipulating microposts.
2011-10-17 15:31 8851. since all micropost actions ... -
11.2 show microposts.
2011-10-17 12:01 6931. add test to test the new use ... -
11.1 user micropost -- a micropost model.
2011-10-17 10:43 10941. we will first generate a mic ... -
10.4 destroying users.
2011-10-16 15:47 724in this chapter, we will add de ... -
10.3 showing users list
2011-10-15 20:41 762in this chapter, we will do use ... -
10.2 protect pages.
2011-10-15 15:11 644again, we will start from TD ... -
10.1 updating users.
2011-10-14 18:30 6971. git checkout -b updating-use ... -
9.4 sign out
2011-10-13 15:21 724whew!!!, last chapter is a long ... -
9.3 sign in success.
2011-10-12 15:39 7351. we will first finish the cre ... -
9.1 about flash.now[:error] vs flash[:error]
2011-10-12 15:37 713There’s a subtle difference ... -
9.2 sign in failure
2011-10-12 12:19 652start from TDD!!! 1. requir ... -
9.1 sessions
2011-10-12 10:00 639a session is a semi-permanent c ... -
what test framework should you use?
2011-10-11 16:56 0for integration test, i have no ... -
what test framework should you use?
2011-10-11 16:56 0<p>for integration test, ... -
8.4 rspec integration tests
2011-10-11 16:53 707in integration test, you can te ...
相关推荐
jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码...
jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)...
"jquery-3.4.1_sangat1_jquery3.4.1"可能指的是一个特定的项目或者命名约定,"sangat1"可能是项目名或者是个人开发者的名字,而"jquery3.4.1"是jQuery库的另一种写法,它们都指向同一种资源——jQuery 3.4.1。...
jquery-3.3.1.js和jquery-3.3.1.min.js免费下载哈。jquery-3.3.1.js和jquery-3.3.1.min.js免费下载哈。jquery-3.3.1.js和jquery-3.3.1.min.js免费下载哈。jquery-3.3.1.js和jquery-3.3.1.min.js免费下载哈。jquery-...
**jQuery 1.12.4 知识点详解** jQuery 是一个广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及Ajax交互等任务。在本压缩包中,我们有两个版本的jQuery核心库文件:`jquery-1.12.4.js` 和 `jquery...
在本文中,我们将深入探讨最新版的jQuery,即`jquery-3.2.1.min.js`,以及该版本中的一些变化。** ### 1. jQuery 3.x 版本概述 jQuery 3.x 系列是继1.x和2.x后的又一重大更新,它主要关注性能优化、API清理以及对...
1. 2款jQuery图片自动切换常用广告代码 2. jquery+css五屏焦点图淡入淡出+圆形按钮切换广告图片代码 3. jQuery+CSS实用图片收缩与放大效果插件 4. jquery+div实现同时滑动切换的图文展示特效插件下载 5. ...
**jQuery Multiselect插件详解** 在网页开发中,我们经常需要处理用户的选择操作,特别是当选项较多时,传统的HTML `<select>` 元素显得不够友好。为此,jQuery提供了一个强大的多选下拉列表插件——jQuery ...
《jQuery 1.11.0与jQuery UI 1.10.4:经典组合的深度解析》 在Web开发领域,jQuery与jQuery UI是两个不可或缺的重要库,它们极大地简化了JavaScript的DOM操作和用户界面设计。本篇将深入探讨jQuery 1.11.0与jQuery ...
开发工具 jquery-1.11.3.min开发工具 jquery-1.11.3.min开发工具 jquery-1.11.3.min开发工具 jquery-1.11.3.min开发工具 jquery-1.11.3.min开发工具 jquery-1.11.3.min开发工具 jquery-1.11.3.min开发工具 jquery-...
jquery插件库大全(200个): jqueryQQ表情插件 jquery下拉菜单导航 jquery下拉菜单栏 jquery仿Windows系统选中图标效果 jquery仿京东商品详情页图片放大效果 jquery仿百度新闻焦点轮播 jquery分离布局模版 jquery...
开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery....
《jQuery 1.12.4与jQuery 1.12.4.min——JavaScript库的高效选择》 jQuery,作为一款广泛使用的JavaScript库,极大地简化了网页中的DOM操作、事件处理、动画效果以及Ajax交互。这里我们将深入探讨jQuery 1.12.4及其...
前端+jQuery+实现烟花特效前端+jQuery+实现烟花特效前端+jQuery+实现烟花特效前端+jQuery+实现烟花特效前端+jQuery+实现烟花特效前端+jQuery+实现烟花特效前端+jQuery+实现烟花特效前端+jQuery+实现烟花特效前端+...
编写基于Jquery的表单验证插件 Java Web Jquery表单验证 jQuery是一个流行的JavaScript库,可用于在网页上进行各种操作,包括表单验证。 1、将基于Jquery的表单验证的调查问卷分为四个部分:FrontPage.html、write....
《jQuery 2.1.1:JavaScript 的强大库》 jQuery 是一个广泛应用于网页开发的JavaScript库,它的出现极大地简化了JavaScript的复杂性,使得网页交互变得更加简单和高效。在这个主题中,我们将深入探讨jQuery 2.1.1...
### jQuery实战第二版知识点概述 #### 一、书籍基本信息与评价 - **书籍名称**:《jQuery实战第二版》(jQuery in Action, Second Edition) - **作者**:Bear Bibeault 和 Yehuda Katz - **出版商**:MANNING - **...
**jQuery.mmenu与jQuery Mobile:打造最佳侧边菜单** jQuery.mmenu是一款强大的JavaScript插件,专为构建响应式、交互式的侧边菜单而设计。它与jQuery Mobile框架结合使用,可以创造出用户界面(UI)中最具吸引力的...
资源名称:jquery1.7 中文手册 CHM文档(附jquery1.82 chm手册)内容简介:因国内jquery中文手册更新太慢了,等了一段时间实在等不下去了,干脆自己动手做一个丰衣足食,时刻更新. 最后感谢Shawphy提供1.4.1版,jehn提供...
《jQuery 2.0.3:JavaScript库的里程碑版本》 在JavaScript的世界里,jQuery以其易用性、高效性和广泛支持的特性,成为了开发者们最钟爱的库之一。本篇将深入探讨jQuery 2.0.3这个特定版本,以及它在Web开发中的...