查看bootstrap-3.3.7 alert.js源码

alert.js的代码组织如下:

自调用函数

+function ($) {
}(jQuery);
  • 通过一个自调用函数,创建一个函数域空间,在该私有的域空间内定义Alert
  • 传入jQuery参数,是为了得到一个函数局部的$符, 来标记jQuery. 因为全局的$符标记的不一定是jQuery, 有可能其他的js库也定义了$符.
  • function前面的+号,是为了让js解析器将+号后面的部分识别为expression, 这样才可以进行函数调用。可以用其他符号,比如 - , ! 等等. 参考自调用函数定义

定义Alert

// ALERT CLASS DEFINITION
// ======================
var dismiss = '[data-dismiss="alert"]'
var Alert   = function (el) {
  $(el).on('click', dismiss, this.close)
}
Alert.VERSION = '3.3.7'
Alert.TRANSITION_DURATION = 150
Alert.prototype.close = function (e) {
  // close具体实现
}

定义Alert Plugin & 暴露Alert和Alert Plugin

// ALERT PLUGIN DEFINITION
// =======================
function Plugin(option) {
  return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.alert')

      if (!data) $this.data('bs.alert', (data = new Alert(this)))
      if (typeof option == 'string') data[option].call($this)
  })
}
// EXPOSE ALERT & ALERT PLUGIN
// =================
$.fn.alert             = Plugin
$.fn.alert.Constructor = Alert
  • 可以通过$(el).alert()来使el具有Alert的特性。 $(el).data(bs.alert)来获取Alert对应的实例。

Alert Conflict处理

var old = $.fn.alert
// ALERT NO CONFLICT
// =================
$.fn.alert.noConflict = function () {
  $.fn.alert = old
  return this
}
  • 可以通过调用$.fn.alert.noConflict()来恢复之前的$.fn.alert定义

绑定Alert相关事件

// ALERT DATA-API
// ==============
$(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
  • document上绑定click事件的hook函数: Alert.prototyp.close.
  • click.bs.alert.data-api事件, 作用就是我们可以在取消某些事件处理注册的时候,不会影响其它已经注册的事件处理程序。参考jquery event namespace