当前位置: 首页 > news >正文

Bootstrap JS插件Alert源码分析

1、先附上alert的源代码
将Alert放在自执行函数中,避免变量污染

/* ====================================================================
 * Bootstrap: alert.js v3.3.7
 * http://getbootstrap.com/javascript/#alerts
 * ====================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */
+function ($) {
  'use strict'; //使用严格模式 执行js代码

  var dismiss = '[data-dismiss="alert"]' //alert警告框事件选择器
  var Alert   = function (el) {  //alert警告框构造函数
    $(el).on('click', dismiss, this.close)//选择器绑定点击关闭alert警告框的事件
  }

  Alert.VERSION = '3.3.7'//版本
  Alert.TRANSITION_DURATION = 150//过渡时间  为了让警告框在关闭时表现出动画效果

  Alert.prototype.close = function (e) {//在alert原型上添加close方法
    var $this    = $(this)//当前对象包装成jquery对象
    var selector = $this.attr('data-target') //获取jquery对象的date-target属性值

    if (!selector) {//如果没有获取到
      selector = $this.attr('href')//获取href属性值
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    var $parent = $(selector === '#' ? [] : selector)//如果selector是#则返回空数组,返回自身

    if (e) e.preventDefault()//取消事件的默认动作 a标签的链接不会打开

    if (!$parent.length) {
      $parent = $this.closest('.alert')//找到祖先中类名为alert的元素
    }

    $parent.trigger(e = $.Event('close.bs.alert'))//触发自定义的close.bs.alert事件 
    //并将e重新复制

    if (e.isDefaultPrevented()) return //e被重新赋值为jquery事件对象 e.isDefaultPrevented()值为false  不会走return语句

    $parent.removeClass('in')//删除具有动画效果的 类 

    function removeElement() {
      // detach from parent, fire event then clean up data
      //detach删除匹配元素,但是不从jquery对象上删除
      //remove删除元素,元素对应的事件,数据,全部移除
      //元素动画效果结束后触发closed.bs.alert事件,并移除
      $parent.detach().trigger('closed.bs.alert').remove()
    }
    //探测浏览器是否支持transition,以及祖先元素是否包含fade类,如果都支持,
    //在关闭alert警告框时,会有动画效果,如果不支持则直接删除

    $.support.transition && $parent.hasClass('fade') ?
      $parent
        .one('bsTransitionEnd', removeElement)
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
      removeElement()
  }
  //对外暴露的函数
  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)))
      //判断传入的option是否为String类型,是则调用Alert实例的对应方法
      if (typeof option == 'string') data[option].call($this)
    })
  } 
 //保存一份alert引用
  var old = $.fn.alert
 //jquery实例上的alert方法,当调用该方法是遍历所有的选中的元素,设置对应的data,并调用其原型的close方法,
  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert

  //当alert方法冲突时,调用次方法避免冲突
  $.fn.alert.noConflict = function () {
    $.fn.alert = old
    return this
  }
  //在document上绑定事件 ,通过jquery的off方法,可以解除该事件
  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
}(jQuery);

2、使用

<div class="alert alert-warning">
    <button type="button" class="close" data-dismiss="alert">
        &times;
    </button>
    警告!请不要提交。
</div>
<div class="alert alert-danger">
    <a href="#" class="close" data-dismiss="alert">
        &times;
    </a>
    错误!请进行一些更改。
</div>

3、调用
当我们调用

$(".alert").alert('close')

的时候,就会调用源码中Plugin函数,遍历所有的警告框,并关闭。

4、解除警告框点击关闭事件,传入对应的事件命名空间(namespace)即可

$(document).off('.bs.alert.data-api') 

相关文章:

  • 终于盼来了,2BizBox最新版本 v3.5.0版本正式发布
  • 自定义标签【包含标签体】
  • JQuery Hello World及注意事项
  • MySQL 高可用:mysql+mycat实现数据库分片(分库分表)
  • 用FlashFXP上传文件到SSH服务器,附FlashFXP显示中文乱码的解决方法
  • Ansible-playbook 之 loops 循环一
  • 按大小拆分超大文件的方法(本文测试了一个62G的文件)
  • Ansible源码解析Inventory动态inventory脚本解析script.py
  • 《Java 学习笔记》 第九章阅读体验
  • pyCharm远程连接服务器
  • android应用程序跳转到系统的各个设置页面
  • Jboss问题总结 - 1
  • [转]三维成像原理
  • hdu 1671(字典树)
  • ![CDATA[ ]] 是什么东东
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android 控件背景颜色处理
  • JavaScript对象详解
  • node学习系列之简单文件上传
  • React+TypeScript入门
  • Spark RDD学习: aggregate函数
  • Vue实战(四)登录/注册页的实现
  • 好的网址,关于.net 4.0 ,vs 2010
  • 看域名解析域名安全对SEO的影响
  • 聊聊flink的BlobWriter
  • 前端之Sass/Scss实战笔记
  • 前嗅ForeSpider教程:创建模板
  • 区块链技术特点之去中心化特性
  • 人脸识别最新开发经验demo
  • 如何学习JavaEE,项目又该如何做?
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 探索 JS 中的模块化
  • 我是如何设计 Upload 上传组件的
  • ​用户画像从0到100的构建思路
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $GOPATH/go.mod exists but should not goland
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (Oracle)SQL优化技巧(一):分页查询
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (简单) HDU 2612 Find a way,BFS。
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .net core 控制台应用程序读取配置文件app.config
  • .Net Web窗口页属性
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net分布式压力测试工具(Beetle.DT)
  • .Net小白的大学四年,内含面经
  • .sdf和.msp文件读取
  • @EnableAsync和@Async开始异步任务支持