本文实例为大家介绍了JavaScript插件架构的知识点,供大家参考,具体内容如下
1. JavaScript插件架构
如下是插件alert的全部代码,每个插件都定义在如下类似的作用域中:
// ======================
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) {
var $this = $(this)
var selector = $this.attr('data-target')
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.(?=#[^\s]$)/,'') // strip for ie7
}
var $parent = $(selector === '#' ? [] : selector)
if (e) e.preventDefault()
if (!$parent.length) {
$parent = $this.closest('.alert')
}
$parent.trigger(e = $.Event('close.bs.alert'))
if (e.isDefaultPrevented()) return
$parent.removeClass('in')
function removeElement() {
// detach from parent,fire event then clean up data
$parent.detach().trigger('closed.bs.alert').remove()
}
$.support.transition && $parent.hasClass('fade') ?
$parent
.one('bsTransitionEnd',removeElement)
.emulateTransitionEnd(Alert.TRANSITION_DURATION) :
removeElement()
}
// 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)
})
}
var old = $.fn.alert
$.fn.alert = Plugin
$.fn.alert.Constructor = Alert
// ALERT NO CONFLICT
// =================
$.fn.alert.noConflict = function () {
$.fn.alert = old
return this
}
// ALERT DATA-API
// ==============
$(document).on('click.bs.alert.data-api',Alert.prototype.close)
}(jQuery);
//通过将作用域内的Alert类赋值给jQuery的alert对象的Constructor属性,在IIFE作用域外也可以使用Alert类,比如这行代码
var Alert = $.fn.alert.Constructor
BootStrap所有的插件在开发中都遵循了同样的规则,也为自定义插件提供了规范和依据(如下三个规则): 1.HTML布局规则:基于元素自定义属性的布局规则,比如使用类似于data-target的自定义属性 2.JavaScript实现步骤(所有插件都遵循jQuery插件开发的标准步骤,所有事件保持统一的标准) 3.插件调用方法(插件使用方式可以是HTML声明式或者调用式)
1.1 HTML布局规则
基于元素自定义属性的布局规则,类似于data-* 的自定义属性
默认情况下,所有插件都可以通过设置特定的HTML代码和相应的自定义属性来实现。 在页面加载的时候,js代码会自动检测到这些标记,并自动绑定相应的事件,不需要添加额外的代码。
点击按钮之后就会关闭警告框: