jquery兼容实验
使用jquery时候,曾经遇到两个问题:
1.一个页面里,使用了很多基于jquery的前端ui库,但是各个库之间对jquery的依赖的版本不一样,有的依赖jquery1.4,jquery2.0用不了;有的依赖jquery2.0,jquery1.4用不了。这下就麻烦了,如果先在项目里引入jquery1.4,然后初始化我们的控件,再引入jquery2.0,之前用jquery1.4初始化的控件就全用不了了,能不能在一个页面里同时引用两个jquery,不同的控件用不同的jquery呢?
2.一个页面里,想同时使用了两个ui库,比如easyui和jqueryui,但是两个ui库冲突了,主要因为他们控件定义的名字是一样的。比如一个创建了jQuery.fn.a,另一个ui库也创建了一个jQuery.fn.a,后一个就会把前一个覆盖掉,那有没有可以解决的方法呢?
其实两个问题都是可以解决的。首先我们开发jq插件都时候,都喜欢使用“(function($){})(jQuery);”这样的一段代码,将我们真正的代码包起来,这样的做法主要有两个目的:
1.是为因为js的作用域是函数级的,只有使用函数,才能使得一些局部变量不会“污染”全局作用域或者上层作用域。
2.就是为了更好地兼容jq不同的版本,因为通过参数传递,window上的jQuery变成了别名$,而这个$与window上的$并不是一个东西,即便以后window上的$发送了变化,这个域里的$还是最初传进来的对象。
那么我们可以从这里看出,只要在引入第二个jq前,将第一个jq起个别名,就可以继续使用之前引入的jq了。
如:var $1_4 = $;
<script src="//cdn.bootcss.com/jquery/1.4.0/jquery.js"></script>
<!-- 基于1.4的插件初始化 -->
<script>
var $1_4 = $
</script>
<script src="//cdn.bootcss.com/jquery/2.0.0/jquery.js"></script>
<!-- 基于2.0的插件初始化 -->
这样使用1.4的插件使用$1_4,使用2.0的插件时候使用$,当然在引入2.0后,就没办法再引入基于1.4jq的插件了。
如果自己使用$1_4不是很习惯,我们可以类比$插件的定义来一个“(function($){})(jQuery);”
(function($){
//使用1.4版本的插件,这里的$就是$1_4
$("#id")...
})($1_4);
当前,如果还是想让$和jQuery的版本变回1.4,有没有解决办法呢?
当然有了,最蠢的办法就是继续类似命名$1_4这样的方式换名字罢了,但是有没有更优雅的方式呢?
有,这才说到noConflict方法,事实上jquery在覆盖window的原有$和jQuery对象前,做了一个副本_$和_jQuery保存在自己的域中,当如果用户想要让jquery让出$和jQuery的值,将其还原为原来的版本时,可以使用noConflict方法。如:
<script src="//cdn.bootcss.com/jquery/1.4.0/jquery.js"></script>
<script>
console.log($.fn.jquery);
</script>
<script src="//cdn.bootcss.com/jquery/2.0.0/jquery.js"></script>
<script>
console.log($.fn.jquery);
//这里true和false的区别是,如果给true,不仅$要还原,jquery也要还原
$.noConflict(false);
console.log($.fn.jquery);
</script>
输出为:
1.4
2.0
1.4
这样执行noConflict后,$的版本还原为1.4了。事实上noConflict的返回值就是当前的jQuery对象,之前的“var $1_4 = $”也可以使用“var $1_4 = $.noConflict()”代替。
然后是第二个问题,两个同名的插件冲突,如何解决?
其实所有插件都是定义jQuery.fn或者jQuery上,jQuery也是一个js对象。所谓的jq插件,其实就是对jquery的命名空间扩展,如果之前已经定义了这个命名空间,再次定义肯定会覆盖之前那个。这里我想到了一个最笨的方法,就是同事引入两个jQuery对象,将同名插件分别定义在不同的jQuery对象上。至于怎么才能同事引入两个jQuery对象呢?答案很简单,参考jquery版本冲突的解决方案,你都可以同时使用jq1.4和jq2.0了,还不能同时引入两个jq吗?
jquery兼容实验的更多相关文章
- jquery 兼容的滚轮事件
// jquery 兼容的滚轮事件 $(document).on("mousewheel DOMMouseScroll", function (e) { ? : -)) || // ...
- jQuery兼容浏览器IE8方法
在维护公司网站的时候,发现在IE8下jquery会报对象不支持此属性或方法.缺少对象的错误: 在其他浏览器就可以正常运行,当前使用的jquery版本是3.1.1,查资料发现jquery从2.0开始不 ...
- JQuery兼容IE6问题汇总(不断更新)
兼容IE6真是苦逼的差事,无奈中... 逗号的问题:IE6中要去掉最后的逗号 var o={ id:1, Name:"abc", //这里的逗号一定要去掉 } HTML的结构,由于 ...
- JQuery 兼容所有浏览器的复制到剪切板功能
灵机一动想的点子,应该不难理解 <textarea onmousedown='selectAll(this);'>11111</textarea> function selec ...
- 兼容IE与firefox火狐的回车事件(js与jquery)
javascript 兼容IE与firefox火狐的回车事件 复制代码代码如下: <script language="javascript"> function key ...
- jQuery学习之路(1)-选择器
▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...
- Jquery制作--美化下拉框
平常我们用的原生select下拉框,大部分样式没办法修改,导致在不同的浏览器里面会跟设计图的风格大相径庭.所以为了能让它美化起来,就用JQ模拟了一个下拉框,可以随意定义样式.原生的下拉框也保留在div ...
- Jquery制作--循环滚动列表
自己模仿JQ插件的写法写了一个循环滚动列表插件,支持自定义上.下.左.右四个方向,支持平滑滚动或者间断滚动两种方式,都是通过参数设置.JQ里面有些重复的地方,暂时没想到更好的方法去精简.不过效果还是可 ...
- jQuery与Zepto的异同
一,同: Zepto最初是为移动端开发的库,是jQuery的轻量级替代品,因为它的API和jQuery相似,而文件更小.Zepto最大的优势是它的文件大小,只有8k多,是目前功能完备的库中最小的一个, ...
随机推荐
- Call for Papers International Conference for Smart Health (ICSH) 2014
Call for PapersInternational Conference for Smart Health (ICSH) 2014 Beijing, China July 10-11, 2014 ...
- [实践] Android5.1.1源码 - 让某个APP以解释执行模式运行
[实践] Android5.1.1源码 - 让某个APP以解释执行模式运行 作者:寻禹@阿里聚安全 前言 本文的实践修改了Android5.1.1的源码. 本文只简单的讲了一下原理.在“实践”一节 ...
- Web Audio介绍
Web Audio还是一个比较新的JavaScript API,它和HTML5中的<audio>是不同的,简单来说,<audio>标签是为了能在网页中嵌入音频文件,和播放器一样 ...
- [.net 面向对象程序设计进阶] (28) 结束语——告别2015
[.net 面向对象程序设计进阶] (28) 结束语——告别2015 <.net面向对象程序设计进阶>这一系列文章写了太长的时间了,大概有半年没写,在年底又一口气写了好几篇.在整个过程中目 ...
- Linux 自动同步服务器时间
200 ? "200px" : this.width)!important;} --> 介绍 Linux服务器运行久时,系统时间就会存在一定的误差,本篇文章就来介绍怎样使服务 ...
- .Net组件程序设计之上下文
.Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
- 单独使用jdbc编程问题总结(一)
在学习Mybatis之前,我们先来回顾JDBC编程的相关知识.在此基础上深入的学习Mybatis框架.如有错误,敬请指正. (一)首先我们既然要使用jdbc,当然是要操作数据库了.创建一个名为:myb ...
- 手写原生ajax
关于手写原生ajax重要不重要,各位道友自己揣摩吧, 本着学习才能进步,分享大家共同受益,自己也在自己博客里写一下 function createXMLHTTPRequest() { //1.创建XM ...
- salesforce 零基础学习(四十四)实现checkbox列表简单过滤功能
现在做的项目代码是原来其他公司做的,要在原来基础上业务进行适当调整加上一些CR,其中有一个需要调整的需求如下: 原来使用apex:selectCheckboxes封装了一个checkbox列表,因为数 ...