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代码.现在我们打算实现一个在 ...
随机推荐
- 链接<a href="javascript:void(0)" />
1.<a href="#"></a>——点击链接后,页面会向上滚到页首,# 默认锚点为 #TOP 2.<a href="javascript ...
- ref 关键字out关键字
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- SQL case when
jack 1tom 2anni 3poly 4 select buyer_name, ( case ' then '东' ' then '南' ' then '西' ' the ...
- C++中vector和list排序
容器.泛型算法.和类是不是就是C++相对于C"++"的那部分呢?暂时先这么认为吧.如果这篇博客有幸被别人看到,请帮忙指出.--C++ 菜鸟 留. vector的迭代器是随机访问迭代 ...
- HTML5的结构学习(1) --- 新增的主体结构元素
1.article 元素 解释:代表文档.页面和应用程序中独立的.完整的.可以被独自引用的内容. 主要用途:博客中的文章.评论,贴吧中的帖子,或者独立的插件等. article中可以包含多种元素例 ...
- thinkphp框架开启页面gzip压缩
Thinkphp下开启gzip压缩很简单,不管你是哪个版本,只要在你的入口文件index.PHP中加入以下两行,如果你的服务器支持,那么就OK了. define ( "GZIP_ENABLE ...
- static_cast与dynamic_cast转换 最简单的理解
3.1 static_cast用法:static_cast < type-id > ( exdivssion ) 该运算符把exdivssion转换为type-id类型,但没有运行时类型检 ...
- js跑马灯效果
function nextPage() { /* 克隆第一张图片并添加到box后 box前移一张图片的距离动画 动画回调里把box的 ...
- MFC可执行文件问题
MFC生成的.exe可执行文件,在其它机子上无法正常执行.主要是MFC库链接方式的问题,使用MFC分动态连接和静态连接两种: 静态连接就是把需要的MFC库函数放进你的exe之中,这样,在MFC库函 ...
- jquery 事件委托三种事件绑定方式.bind(),.live(),.delegate()
http://www.ituring.com.cn/article/467# http://www.cnblogs.com/lvdabao/archive/2013/08/30/3290603.htm ...