`
suqing
  • 浏览: 186697 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

Bootstrap 源码解析

 
阅读更多

1、Bootstrap的作用域

2、Bootstrap的类定义

3、Bootstrap的插件定义

4、Bootstrap的事件代理

5、Bootstrap的对象数据缓存

6、Bootstrap的防冲突

7、作用域外如何使用Button类

8、Bootstrap的单元测试

 

 

Bootstrap的作用域

Bootstrap每个插件都定义在下面这段作用域代码中: 

+function ($) { "use strict";
    ...
}(window.jQuery);
 请看《IIFE》和《严格模式》编译环境。

 

在插件的作用域之外,全局范围执行代码的第一行,检测了jQuery是否定义。在Grunt的concat任务中,合并所有插件时,检测代码添加在目标文件的banner说明后面。Grunt.js的相关代码: 

jqueryCheck: 'if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }\n\n',

concat: {
      options: {
        banner: '<%= banner %><%= jqueryCheck %>',
        stripBanners: false
      },
      bootstrap: {
        src: [
          'js/transition.js',
          'js/alert.js',
          'js/button.js',
          'js/carousel.js',
          'js/collapse.js',
          'js/dropdown.js',
          'js/modal.js',
          'js/tooltip.js',
          'js/popover.js',
          'js/scrollspy.js',
          'js/tab.js',
          'js/affix.js'
        ],
        dest: 'dist/js/<%= pkg.name %>.js'
      }
    }

 

Bootstrap的类定义

  var Button = function (element, options) {
    this.$element = $(element)
    this.options  = $.extend({}, Button.DEFAULTS, options)
  }

  Button.DEFAULTS = {
    loadingText: 'loading...'
  }

  Button.prototype.setState = function (state) {
    ...
  }

  Button.prototype.toggle = function () {
    ...  
  }

Bootstrap采用这种类定义方式的好处,以及Javascript其他几种类定义的方式,请参照《Javascript面向对象编程(一):封装》 或者阅读《Javascript高级程序设计(第3版)》7.4章节。

Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。在Button函数体内部定义的属性和方法可以看做是类的私有属性和方法, 为Button.prototype对象定义的属性和方法都可以看做是类的公共属性和方法。这个类封装了插件对象初始化所需的方法和属性。

 

Bootstrap的插件定义

请参看《jQuery插件开发快速入门》,注意两个this指向的是不同对象 

  $.fn.button = function (option) {
    return this.each(function () {
      var $this   = $(this)
      ...
    })
  }

  

Bootstrap的事件代理

Bootstrap Button插件定义最后一部分,事件绑定是这么写的 

$(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
    ...    
})

这段JavaScript代码将click委托事件监听器绑定在document元素上,并给click事件赋予命名空间click.bs.button.data-api,选择器匹配的是属性data-toggle的值为"button"开头的标签。

关于jQuery将事件绑定在document文档对象上的好处,就是js事件代理的优点,性能上做了一个测试比较

关于jQuery命名空间的好处,请参看《jQuery .on() and .off() 命名空间

 

Bootstrap的防止冲突

jQuery是全局对象,所以jQuery的插件定义$.fn.button并不受作用域限制。如果在别的插件中同样定义了button插件,后加载的button插件将会覆盖先加载的button插件,jsbin示例: 

// Old button
+function($){
  $.fn.button = function() {
    alert('Old button')
  }
}(window.jQuery)  

// Bootstrap button
+function($){
  $.fn.button = function() {
    alert('Bootstrap button')
  }
}(window.jQuery)

$('a').button() // alert('Bootstrap button')
Bootstrap做了插件冲突处理,jsbin示例: 
// Old button
+function($) {
  $.fn.button = function() {
    alert('Old button')
  } 
}(window.jQuery)

// Bootstrap button
+function($){
  // 将原先的button插件对象赋值给一个临时变量old
  var old =  $.fn.button

  $.fn.button = function() {
      alert('Bootstrap button')
  }

  // 执行该函数,恢复原先的button定义,并返回Bootstrap定义的button插件
  $.fn.button.noConflict = function () {
    $.fn.button = old
    return this
  }

}(window.jQuery)

// 作用域外我们可以灵活使用两个button插件
$.fn.button = $.fn.button.noConflict()
$('a').button() // alert('Bootstrap button')

$.fn.button.noConflict()
$('a').button() // alert('Old button')

 

Bootstrap作用域外如何使用Button类 

$.fn.button.Constructor = Button
在Bootstrap的button插件中还有上面者句代码,去掉它不影响插件的正确执行。 

它很像javascript中类构造器: 

var Cat = function(name) {
   this.name = name
}
var cat1 = new Cat('Hello Kitty')
var cat2 = new Cat('Doramon')

cat1.constructor == Cat.prototype.constructor
 

但是Javascript是区分大小写的,也就是 这里大写开头的的Constructor 和 Javascript小写开头的constructor 没有任何关系。

查找jQuery源码中也没有对于大写开头的Constructor的定义。所以这里的Constructor只是一个普通属性,我们也可以写成其他名字 $.fn.button.Something = Button,Bootstrap为了指明这个属性的意义而命名为构造器“Constructor”更合理。

这样一来,这段代码就很好理解了:$.fn.button.Constructor = Button 通过将闭包内的Button类赋值给jQuery的button对象的Constructor属性,在IIFE闭包外也可以使用Button类。调用方式:

+function($){
  // 类定义
  var Button = function() {}
  // 插件定义
  $.fn.button = function() {
      alert('Bootstrap button')
  }
  // 类赋值到jQuery button对象的Constructor属性
  $.fn.button.Constructor = Button

}(window.jQuery) 

var Button = $.fn.button.Constructor

 

Bootstrap的对象数据缓存

 

// 获取存储的Button对象,如果是第一次执行变量data的值为undefined
var data    = $this.data('bs.button')
var options = typeof option == 'object' && option

// 创建Button对象: new Button(this, options),
// 并赋值给变量data: data = new Button(this, options)
// 存储在元素的jQuery对象上的‘bs.button’数据字段 $this.data('bs.button', data)
if (!data) $this.data('bs.button', (data = new Button(this, options)))

// data是一个Button对象,可以调用Button的原生方法
if (option == 'toggle') data.toggle()
else if (option) data.setState(option)

利用jQuery的 .data(key, value)存储Button对象

 

Bootstrap的单元测试

QUnit + PhantomJS 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Bootstrap模态窗口源码解析

    总的来说,Bootstrap模态窗口的源码解析涉及了jQuery插件的基本结构、事件处理、动画效果以及DOM操作等多个方面。通过注释和源码阅读,开发者可以更深入地理解其工作原理,从而更好地在项目中使用和定制模态窗口功能...

    响应式布局-BootStrap从基础到项目实战 (高级篇)

    在BootStrap源码解析部分,我们深入理解了CSS组件和JavaScript插件的工作原理和内部架构。其中,CSS组件涉及到了架构设计思想、基础样式、颜色样式、尺寸样式、状态样式、特殊元素样式、并列元素样式、嵌套子元素...

    mvc+bootstrap源码

    “mvc+bootstrap源码”指的是基于MVC(Model-View-Controller)设计模式和Bootstrap前端框架的网站源代码。MVC是一种软件设计模式,常用于Web应用程序开发,将业务逻辑、数据和用户界面分离,提高代码的可维护性和可...

    深入理解Bootstrap-5

    Bootstrap是世界上最流行的前端开发框架之一,它为开发者提供了丰富的组件、样式和JavaScript插件,用于快速构建响应式、移动优先的网页。深入理解Bootstrap-5意味着我们要探讨这个最新版本带来的新特性和改进,以及...

    深入理解Bootstrap》源代码

    华章出版社的资源往往具有很高的专业性和权威性,因此这份源代码解析很可能包含详细的注释和解释,帮助读者更好地理解Bootstrap的实现细节。通过学习,我们可以提高对Bootstrap的理解,提升网站开发效率,同时也能...

    基于javaweb 的bootstrap table使用案例源码下载

    在本文中,我们将深入探讨如何在JavaWeb项目中利用Bootstrap Table进行数据展示、分页以及...通过研究提供的源码,开发者可以学习到如何在JavaWeb项目中有效地集成和使用Bootstrap Table,提升Web应用的数据管理能力。

    BootStrap Tooltip插件源码解析

    在源码解析中,我们可以看到Tooltip插件的核心功能和实现方式。首先,`Tooltip`是一个构造函数,它接受一个DOM元素和一个选项对象作为参数。`this.init`方法用于初始化插件,这里会设置一些基础属性,如`type`、`...

    Thinkphp+Bootstrap项目管理系统源码 带安装说明

    《基于Thinkphp与Bootstrap的项目管理系统源码解析》 在当今快速发展的信息技术领域,高效的项目管理是企业成功的关键。Thinkphp作为一款广受欢迎的PHP框架,以其轻量级、高效和灵活的特点,为企业构建Web应用提供...

    bootstrap的fileinput源码以及js文档

    在“bootstrap的fileinput源码以及js文档”中,我们可以深入理解其内部工作原理和如何在项目中应用。 源码分析: 1. **文件结构**:源码通常包含JavaScript文件、CSS样式表、图片资源以及示例HTML模板。`kartik-v-...

    基于PHP开发的固定资产管理系统+源码+开发文档+源码解析(毕业设计&课程设计&项目开发)

    基于PHP开发的固定资产管理系统+源码+开发文档+源码解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于PHP开发的固定资产管理系统+源码+开发文档+源码解析...

    李炎恢bootstrap视频教程源码课件.zip

    总之,"李炎恢bootstrap视频教程源码课件"是一份全面而实用的学习资源,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅。通过学习和实践,你将能够熟练运用Bootstrap构建现代化的Web应用,满足不断变化的...

    springboot+bootstrap项目源码

    Thymeleaf 模板文件通常位于 `templates` 子目录下,它们会根据 Thymeleaf 表达式解析动态数据。 4. `pom.xml`: Maven 或 Gradle 的构建文件,定义了项目依赖,如 SpringBoot、Thymeleaf 和 Bootstrap。 5. `....

    Bootstrap+PHP+MySQL完成学生选课系统源码.zip

    这个系统源码的压缩包名为"Bootstrap+PHP+MySQL完成学生选课系统源码.zip",包含的主目录为"student-system-master",这为我们提供了全面了解和学习此类系统开发的宝贵资源。 一、Bootstrap:响应式网页设计基础 ...

    Thinkphp+Bootstrap项目管理系统源码 带安装说明.zip

    《基于Thinkphp与Bootstrap的项目管理系统源码解析》 在当今快速发展的信息技术领域,项目管理系统的应用已经成为企业管理的重要工具。本篇文章将详细解读一个基于Thinkphp框架与Bootstrap前端UI库构建的项目管理...

    bootstrap-table-pagejump.zip

    Bootstrap Table PageJump 源码解析与应用指南 Bootstrap Table 是一个流行的JavaScript库,用于创建交互式的、响应式的HTML表格。在数据量较大时,分页功能是必不可少的,而`bootstrap-table-pagejump`插件则扩展...

    03-SpringBoot启动过程源码解析-周瑜.pdf

    "SpringBoot启动过程源码解析" SpringBoot启动过程可以分为多个阶段,包括构造SpringApplication对象、推测Web应用类型、获取BootstrapRegistryInitializer对象、获取ApplicationContextInitializer对象、获取...

    Bootstrap完整案例

    通过查看和分析源码,开发者可以学习到如何将Bootstrap的组件和样式应用于实际项目,同时也能了解如何组织和优化代码结构。 总的来说,这个压缩包是一个全面的学习和实践Bootstrap的资源集合,对于初学者和有经验的...

    netty源码解析视频

    ### Netty源码解析知识点概览 #### 一、Netty简介与应用场景 - **Netty**是一款由JBOSS提供的高性能的异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。 - **应用场景**:Netty广泛...

Global site tag (gtag.js) - Google Analytics