• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >ruby > Ruby on Rails中jquery_ujs组件拖慢速度的问题解决

Ruby on Rails中jquery_ujs组件拖慢速度的问题解决

作者: 字体:[增加 减小] 来源:互联网

通过本文主要向大家介绍了ruby on rails,ruby on rails教程,ruby on rails安装,ruby on rails下载,ruby on rails指南等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

jquery_ujs 对 rails 来说,是一个非常重要的组件,它包含在 rails 的默认组件之中。

jquery ujs 包含一些非常便捷的功能,比如确认对话框、触发 ajax、自动禁用表单提交按钮等,本文主要讨论的是触发 ajax 的功能。

通过添加简单的标签属性,jquery ujs 可以把一个普通的链接或者表单转换成 ajax 提交,而不需要写 JavaScript 代码。

<%= link_to '关闭项目', close_project_path(project), remote: true, method: :post %>
</div>

上面的代码会生成如下的代码

<a href="/projects/1/close" data-remote="true" data-method="post">关闭项目</a>
</div>

当用户点击后,它会触发一个指向地址 /projects/1/close,method 为 post 的 ajax 请求,而不是 get 的 普通请求,这样使得实现 ajax 调用变得非常便捷。

网速慢导致的问题
事情并不都是美好的,在网速比较慢的时候,jquery ujs 的这个实现会出问题,如果文档还没有加载完成,用户就点击了链接,页面会发起一个到链接地址的 GET 请求,页面会跳转,但指向该地址的 GET 请求可以并不存在,这样就会出错。

有用户有提过一个相关的 Issue,但是开发者并没有受理,然而网速慢是中国的国情,问题我们还是得处理,借助于 CSS3 的一些特性,这个问题其实也不难解决。

pointer-events
pointer-events: none;

The element is never the target of mouse events; however, mouse events may target its descendant elements if those descendants have pointer-events set to some other value. In these circumstances, mouse events will trigger event listeners on this parent element as appropriate on their way to/from the descendant during the event capture/bubble phases.

</div>

这个属性可以禁止元素的点击事件,因为一般 CSS 是先加载的,我们只要控制在页面加载完成之前给 jquery ujs 相关的元素应用 pointer-events: none; 样式,在页面加载完成后再去除该样式,就可以解决网速慢的情况下,页面没有加载完成时用户点击 rmote 链接导致的错误了。

解决方案
添加如下的全局样式,默认情况下含有 data-remote 和 data-method 属性的标签不可点击,除非 body 元素含有名为 ready 的 css class。

[data-remote], [data-method] {
 pointer-events: none;

 button, input[type=submit] {
  pointer-events: none;
 }
}

body.ready {
 [data-remote], [data-method] {
  pointer-events: auto;

  button, input[type=submit] {
   pointer-events: auto;
  }
 }
}

</div>

然后通过段简单的脚本让页面加载后给 body 元素添加 ready class

$(document).ready ->
 $('body').addClass('ready')
</div>

于是,问题轻松的就解决了。

</div>

您可能想查找下面的文章:

  • Rails bundle命令安装mysql gem包出错的解决方法
  • win7安装ruby on rails开发环境
  • 简单对比分析Ruby on Rails 和 Laravel
  • 在 Ubuntu 12.04 Server 上安装部署 Ruby on Rails 应用
  • 快速正确的安装 Ruby, Rails 运行环境
  • Windows下Ruby on Rails开发环境安装配置图文教程
  • Ruby On Rails中如何避免N+1问题
  • 艰难完成 nginx + puma 部署 rails 4的详细记录
  • 浅谈Rails 4 中Strong Parameters机制
  • Rails命令行常用操作命令简明总结

相关文章

  • 详解Ruby设计模式编程中对单例模式的运用
  • Ruby中变量引用时的一些注意点
  • Ruby程序中创建和解析XML文件的方法
  • Ruby的XML格式数据解析库Nokogiri的使用进阶
  • Ruby中嵌套对象转换成json的方法
  • 详解Ruby中正则表达式对字符串的匹配和替换操作
  • Ruby中字符串左侧补零方法实例
  • 借助RubyGnome2库进行GTK下的Ruby GUI编程的基本方法
  • Ruby最简单的消息服务器代码
  • ruby 面向对象思维 概念

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 简单谈谈Ruby的private和protected
    • Ruby实现邮件主动推送触发程序
    • ruby 正则表达式 教程
    • ruby 迭代器使用方法
    • Ruby中执行Linux shell命令的六种方法详解
    • 利用Ruby的SOAP4R编写SOAP服务器的教程
    • ruby 学习笔记(2) 类的基本使用
    • Ruby中的变量学习总结
    • Ruby和元编程之万物皆为对象
    • 使用Ruby on Rails和PostgreSQL自动生成UUID的教程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有