bootstrap之noConflict的详解
翻开推特框架,不经发现,几乎所有的插件都会出现noConflict的写法来防止和其他的插件冲突!我们以button.js为例子,打开其源代码发现 如下:
var old = $.fn.button
$.fn.button = Plugin
$.fn.button.Constructor = Button // BUTTON NO CONFLICT
// ================== $.fn.button.noConflict = function () {
$.fn.button = old
return this
}
那这段代码的作用呢?一看都知道是防止冲突,但是如何防止冲突呢?对于前置插件或者是后置的重名插件又是如何的呢?下面我们就来翻一翻,期望让自己不再那么困惑!
例子1:前置的重名插件
根据js在页面的执行顺序显然可以知道,后面的$.fn.button会覆盖前面的同名插件,所以这个时候如果如果要调用的是bootstrap的插件,其实是不需要进行冲突的处理的!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jqueryPlugin</title>
<script src="http://libs.baidu.com/jquery/1.11.1/jquery.js"></script>
</head>
<body>
<button id="btn1">按钮1</button>
<button id="btn2">按钮2</button>
<script type="text/javascript">
(function($){
$.fn.button=function(){
alert("自定义button插件");
}
})(jQuery);
(function($){
function Button(element,loption){
this.name="bootstrap的button插件";
this.init();
}
Button.prototype.init=function(){
alert(this.name)
}
function Plugin(option) {
return this.each(function(){
var $this = $(this),
data= $this.data("cui.button"),
options=typeof option =='object' && option;
if(!data){
$this.data("cui.button",data=new Button(this,options));
}
//对于复选框的时候,对于单选框的时候
if(option=="toggle"){
data.toggle()
}else if(option){
data.setState(option)
}
})
}
var old = $.fn.button;
$.fn.button = Plugin
$.fn.button.Constructor = Button
$.fn.button.noConflict = function () {
$.fn.button = old
return this
}
})(jQuery);
$(function(){
$("#btn1").button();//bootstrap的button插件
}) </script> </body>
</html>
问题来了,假如我们要调用前置的$.fn.button插件(自定义button插件)的时候,该怎么办呢?只要在上面的调用时候做点修改就可以了:在调用button之前调用$.fn.button.noConflict();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jqueryPlugin</title>
<script src="http://libs.baidu.com/jquery/1.11.1/jquery.js"></script>
</head>
<body>
<button id="btn1">按钮1</button>
<button id="btn2">按钮2</button>
<script type="text/javascript">
(function($){
$.fn.button=function(){
alert("自定义button插件");
}
})(jQuery);
(function($){
function Button(element,loption){
this.name="bootsrtap的button插件";
this.init();
}
Button.prototype.init=function(){
alert(this.name)
}
function Plugin(option) {
return this.each(function(){
var $this = $(this),
data= $this.data("cui.button"),
options=typeof option =='object' && option;
if(!data){
$this.data("cui.button",data=new Button(this,options));
}
//对于复选框的时候,对于单选框的时候
if(option=="toggle"){
data.toggle()
}else if(option){
data.setState(option)
}
})
}
var old = $.fn.button;
$.fn.button = Plugin
$.fn.button.Constructor = Button
$.fn.button.noConflict = function () {
$.fn.button = old
return this
}
})(jQuery);
$(function(){
$.fn.button.noConflict();
//你也可以用 var button=$.fn.button.noConflict();
$("#btn1").button();//自定义button插件
}) </script> </body> </html>
例子2:后置的重名插件
根据后置覆盖前置插件的原理,这个例子当然是弹出文字和你想象是一样的,弹出"自定义button插件",
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jqueryPlugin</title>
<script src="http://libs.baidu.com/jquery/1.11.1/jquery.js"></script>
</head>
<body>
<button id="btn1">按钮1</button>
<button id="btn2">按钮2</button>
<script type="text/javascript">
(function($){
function Button(element,loption){
this.name="bootstrap的button插件";
this.init();
}
Button.prototype.init=function(){
alert(this.name)
}
function Plugin(option) {
return this.each(function(){
var $this = $(this),
data= $this.data("cui.button"),
options=typeof option =='object' && option;
if(!data){
$this.data("cui.button",data=new Button(this,options));
}
//对于复选框的时候,对于单选框的时候
if(option=="toggle"){
data.toggle()
}else if(option){
data.setState(option)
}
})
}
var old = $.fn.button;
$.fn.button = Plugin
$.fn.button.Constructor = Button
$.fn.button.noConflict = function () {
$.fn.button = old
return this
}
})(jQuery);
(function($){
$.fn.button=function(){
alert("自定义button插件");
}
})(jQuery);
$(function(){
$("#btn1").button();//自定义button插件
})
</script>
</body>
</html>
这个时候我们想调用bootstrap的button插件,以为来个$.fn.button.noConflict(),是不是就可以调用了,事实呢?浏览器跟你了一巴掌,提示你$.fn.button.noConflict()不是一个函数,为什么?不要忘记了,后置的同名插件已经覆盖了前面的同名插件,而后置的插件没有$.fn.button.noConflict()这个函数,所以你当然找不到这个函数了!举个例子来测试一下就知道
这个例子就是典型的重写原型,所以调用say的时候就取不到值了!!!
function Person(){
this.name="丑男孩";
}
Person.prototype.say=function(){
alert(this.name)
}
//Person.prototype在这里被重写了
Person.prototype={
run:function(){
alert("我可以跑!")
}
}
var person1=new Person();
person1.say();//提示未定义
言归正传,那如果调用前置插件(也就是bootstrap的button插件呢),这个时候我们有必要对于自定义的button的插件进行一定的修改(怎么修改取决于你的插件的写法),本例中的修改如下,在自定义的button插件中添加$.fn.button.noConflict() 方法,如下(注意自定义button的插件中代码的修改)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jqueryPlugin</title>
<script src="http://libs.baidu.com/jquery/1.11.1/jquery.js"></script>
</head>
<body>
<button id="btn1">按钮1</button>
<button id="btn2">按钮2</button>
<script type="text/javascript">
(function($){
function Button(element,loption){
this.name="bootstrap的button插件";
this.init();
}
Button.prototype.init=function(){
alert(this.name)
}
function Plugin(option) {
return this.each(function(){
var $this = $(this),
data= $this.data("cui.button"),
options=typeof option =='object' && option;
if(!data){
$this.data("cui.button",data=new Button(this,options));
}
//对于复选框的时候,对于单选框的时候
if(option=="toggle"){
data.toggle()
}else if(option){
data.setState(option)
}
})
}
var old = $.fn.button;
$.fn.button = Plugin
$.fn.button.Constructor = Button
$.fn.button.noConflict = function () {
$.fn.button = old
return this
}
})(jQuery);
(function($){
var old=$.fn.button;
$.fn.button=function(){
alert("自定义button插件");
}
$.fn.button.noConflict = function () {
$.fn.button = old
return this
}
})(jQuery);
$(function(){
$.fn.button.noConflict();
$("#btn1").button();//bootstrap的button插件
})
</script>
</body>
</html>
到这里,其实已经很清楚了,bootstrap的noConflict 怎么样?如何用?对于自定义插件如何避免冲突,如果调用!妈妈再不担心自己的代码和别人冲突了
bootstrap之noConflict的详解的更多相关文章
- 转载 JS组件Bootstrap Select2使用方法详解
JS组件Bootstrap Select2使用方法详解 作者:懒得安分 字体:[增加 减小] 类型:转载 时间:2016-01-26我要评论 这篇文章主要为大家介绍了JS组件Bootstrap Sel ...
- Bootstrap Table使用方法详解
http://www.jb51.net/article/89573.htm bootstrap-table使用总结 bootstrap-table是在bootstrap-table的基础上写出来的,专 ...
- Bootstrap transition.js 插件详解
Bootstrap 自带的 JavaScript 插件的动画效果几乎都是使用 CSS 过渡实现的,而其中的 transition.js 就是为了判断当前使用的浏览器是否支持 CSS 过渡.下面先来简单 ...
- Bootstrap Table 表格参数详解
表格参数 名称 标签 类型 默认 描述 - data-toggle String 'table' 不用写 JavaScript 直接启用表格. classes data-class ...
- Bootstrap系列 -- 22. 按钮详解
Bootstrap框架首先通过基础类名“.btn”定义了一个基础的按钮风格,然后通过“.btn-default”定义了一个默认的按钮风格.默认按钮的风格就是在基础按钮的风格的基础上修改了按钮的背景颜色 ...
- jQuery.noConflict() 函数详解
jQuery.noConflict()函数用于让出jQuery库对变量$(和变量jQuery)的控制权. 一般情况下,在jQuery库中,变量$是变量jQuery的别名,它们之间是等价的,例如jQue ...
- Bootstrap 各种进度条详解
一:默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class . ...
- Bootstrap Table的使用详解
Bootstrap Table是基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选.多选.排序.分页,以及编辑.导出.过滤(扩展)等等的功能.接下来我们来介绍B ...
- Bootstrap如何实现导航条?导航条实例详解
本文主要和大家分享Bootstrap实现导航实例详解,在建设一个网站的时候,不同的页面有很多元素是一样的,比如导航条.侧边栏等,我们可以使用模板的继承,避免重复编写html代码.现在我们打算实现一个在 ...
随机推荐
- RFC端口号定义
RFC关于计算机端口号定义 http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers. ...
- php不区分大小写
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 从汇编看c++对静态成员的存取
c++中静态成员变量不存在于对象之中,而存在于全局数据段,只是其可见性受到限制,仅能被所属类访问,而非静态成员变量存在于对象中,因而,在访问两种不同数据成员时,会有些许差别.对于静态数据成员的访问,是 ...
- Go语言中怎样判断数据类型_不懂的木匠_新浪博客
要判断数据类型,可以用Go的空接口: 建一个函数t 设置参数i 的类型为空接口,空接口可以接受任何数据类型 func t(i interface{}) { //函数t有一个参数i switch i ...
- avalon中常用的事件
ms-on-change 相当于失去焦点事件. ms-on-input 相当于watch事件 http://www.runoob.com/jsref/event-oninput.html
- HTML5数组方法
***************************** forEach方法 ***************************** <script>var data = [1, ...
- php.ini 全站,和htaccess web目录 默认头部和尾部 auto_prepend_file
php.ini ; Automatically add files before PHP document. ; http://php.net/auto-prepend-file auto_prepe ...
- python文件处理及装饰器
1.文件处理: Python处理文件的流程比较简单,大致分为以下几个: 打开文件==>处理文件==>生成新文件==>写入文件 先说怎么打开一个文件: 打开一个文件可以有多种写法,下面 ...
- android 手势滑动
1.概述, 两次都是画曲线统计图用到手势滑动.左滑动,右滑动曲线图翻页 2.直接上代码 3.注: 第一次使用的时候是implement了 OnTouchListener 接口,是在画图布局上layou ...
- shell基础——字符串处理(转载)
Shell的字符串处理 1 得到长度 %x="abcd" #方法一 %expr length $x 4 # 方法二 %echo ${#x} ...