翻开推特框架,不经发现,几乎所有的插件都会出现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的详解的更多相关文章

  1. 转载 JS组件Bootstrap Select2使用方法详解

    JS组件Bootstrap Select2使用方法详解 作者:懒得安分 字体:[增加 减小] 类型:转载 时间:2016-01-26我要评论 这篇文章主要为大家介绍了JS组件Bootstrap Sel ...

  2. Bootstrap Table使用方法详解

    http://www.jb51.net/article/89573.htm bootstrap-table使用总结 bootstrap-table是在bootstrap-table的基础上写出来的,专 ...

  3. Bootstrap transition.js 插件详解

    Bootstrap 自带的 JavaScript 插件的动画效果几乎都是使用 CSS 过渡实现的,而其中的 transition.js 就是为了判断当前使用的浏览器是否支持 CSS 过渡.下面先来简单 ...

  4. Bootstrap Table 表格参数详解

    表格参数 名称   标签   类型   默认   描述   - data-toggle String 'table' 不用写 JavaScript 直接启用表格. classes data-class ...

  5. Bootstrap系列 -- 22. 按钮详解

    Bootstrap框架首先通过基础类名“.btn”定义了一个基础的按钮风格,然后通过“.btn-default”定义了一个默认的按钮风格.默认按钮的风格就是在基础按钮的风格的基础上修改了按钮的背景颜色 ...

  6. jQuery.noConflict() 函数详解

    jQuery.noConflict()函数用于让出jQuery库对变量$(和变量jQuery)的控制权. 一般情况下,在jQuery库中,变量$是变量jQuery的别名,它们之间是等价的,例如jQue ...

  7. Bootstrap 各种进度条详解

    一:默认的进度条 创建一个基本的进度条的步骤如下: 添加一个带有 class .progress 的 <div>. 接着,在上面的 <div> 内,添加一个带有 class . ...

  8. Bootstrap Table的使用详解

    Bootstrap Table是基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选.多选.排序.分页,以及编辑.导出.过滤(扩展)等等的功能.接下来我们来介绍B ...

  9. Bootstrap如何实现导航条?导航条实例详解

    本文主要和大家分享Bootstrap实现导航实例详解,在建设一个网站的时候,不同的页面有很多元素是一样的,比如导航条.侧边栏等,我们可以使用模板的继承,避免重复编写html代码.现在我们打算实现一个在 ...

随机推荐

  1. codeforces #332 div2

    A. #include<cstdio> #include<algorithm> #include<cmath> #include<map> #inclu ...

  2. API 之 MessageBox

    函数功能: MessageBox 函数用于显示一个模态对话框,其中包含一个系统图标. 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息.消息框中返回一个整数值,该值指示用户单击了哪个按钮. ...

  3. sublime远程连接到linux主机

    sublime远程连接到linux主机 sublime远程连接到linux主机 微信开发,直接使用sublime的sftp功能修改wx_sample.php 1.为sublime安装安装包管理插件Pa ...

  4. AngularJs中关于ng-class的三种使用方式说明

    在开发中我们通常会遇到一种需求:一个元素在不同的状态需要展现不同的样子. 而在这所谓的样子当然就是改变其css的属性,而实现能动态的改变其属性值,必然只能是更换其class属性 这里有三种方法: 第一 ...

  5. ~/microwindows-0.89pre8/src/bin$ ./nano-X error:Cannot bind to named socket

    GUI:microwindows-0.89pre8+nona-X you are successful compiling, run nano-X,below is information: ~/mi ...

  6. Leetcode 242 Valid Anagram pytyhon

    题目: Given two strings s and t, write a function to determine if t is an anagram of s. For example,s  ...

  7. Amazon 解决下载文件乱码

    大家在做多个站点的时候,可能会遇到下载下来的报告文件出现乱码. 法国站点和意大利站点均会出现这样的情况,那怎么解决呢? 这是由于编码的问题而导致,在我们读取数据插入到本地数据库的时候,不妨先将格式转成 ...

  8. Android Studio中获取sha1证书指纹数据的方法

    高德地图开发申请KEY的时候需要开发者提供SHA1证书指纹数据,在eclipse很容易就找到了,但是Android Studio很久也没找到,只能使用在网上看到的方法了,在Android Studio ...

  9. Android常用代码

    1.图片旋转 Bitmap bitmapOrg = BitmapFactory.decodeResource(this.getContext().getResources(), R.drawable. ...

  10. hdu 1536 S-Nim_求sg值模版

    题意:给你很n堆石头,k代表你有k种拿法,然后给出没堆石头的数量,求胜负 直接套用模版 找了好久之前写的代码贴上来 #include<iostream> #include<algor ...