bootstrap-dropdown源码解读

2023-11-02 22:48

本文主要是介绍bootstrap-dropdown源码解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.插件的使用

<!--[if !supportLists]-->1.           通过data-toggle绑定触发事件的父集元素,点击添加或删除open样式类,由此展开或折叠下拉菜单;

$(“.        dropdown-toggle”).dropdown(‘toggle’)触发下拉菜单的展开或折叠;

  包裹元素的样式类是dropdown,触发元素的样式类是dropdown-toggle,下拉框元素的样式类是dropdown-menu。

  包裹元素dropdown中设置show(展开前)、focus(展开中)、shown(展开后)、hide(隐藏前)、hidden(隐藏后)事件,show和hide事件中可以阻止默认事件发生。

 

<div class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">Java <b class="caret"></b></a><ul class="dropdown-menu"><li><a href="#">jmeter</a></li><li><a href="#">EJB</a></li><li><a href="#">Jasper Report</a></li><li class="divider"></li><li><a href="#">分离的链接</a></li><li class="divider"></li><li><a href="#">另一个分离的链接</a></li>
</ul>
</div>

 

2.整体架构

      构建dropdwon类,当即触发click事件,调用dropdwon.prototype.toggle方法,toggle发放中调用clearMenus函数折叠下拉框,下拉框折叠的情况触发if语句展开下拉框;

      构建$.fn.dropdown插件,data属性中new出一个dropdown类实现初始化,drop类初始化过程中绑定事件。

 

3.js和jquery的新认识

       函数中通过return以及状态改变、if条件前的数据记录使函数拥有不同的功能;

       $.event()为事件设置event-data数据,包括relatedTarget元素,trigger触发事件,on绑定函数,当事件触发执行绑定函数,通过绑定函数的方式使下拉框有效;

         event.isDefaultPrevented判断是否调用了preventDefault方法,使preventDefault()函数有效,event.preventDefault()阻止默认事件;

       event.stopPropagation()阻止事件冒泡,event.isPropagationStopped()判断有否调用stopPropagation方法。

 

function ($) {'use strict';// DROPDOWN CLASS DEFINITION// =========================// 触发元素和下拉元素为兄弟节点关系,[data-toggle="dropdown"]触发元素,dropdown-menu下拉框元素,dropdown包裹元素var backdrop = '.dropdown-backdrop'var toggle   = '[data-toggle="dropdown"]'// click.bs.dropdown事件在click事件的触发的时候也执行toggle函数,hide.bs.drop事件只能通过hide.bs.drop绑定,不能通过hide绑定var Dropdown = function (element) {$(element).on('click.bs.dropdown', this.toggle)}Dropdown.VERSION = '3.3.5'//通过data-target或者href获取包裹元素,不存在就选择父元素function getParent($this) {var selector = $this.attr('data-target')if (!selector) {selector = $this.attr('href')selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7}var $parent = selector && $(selector)return $parent && $parent.length ? $parent : $this.parent()}// clearMenus函数下拉框若为展开状态,就执行收起动作,折叠和展开通过添加open样式类实现// 通过return使函数具有多种用途,折叠状态不执行后续操作// trigger触发hide.bs.dropdown(折叠前)、hidden.bs.dropdown(折叠后)事件,on方法绑定函数,触发时间在clearMenus函数执行过程中// e.isDefaultPrevented()判断使hide事件中e.preventDefault()能阻止下拉框折叠、hidden事件触发,同样效果可以通过缓存实现function clearMenus(e) {if (e && e.which === 3) return //e.which哪个按钮或按键被点击$(backdrop).remove()$(toggle).each(function () {// dropdown方法被调用以外,还需要用[data-toggle="dropdown"]属性指向触发元素,查看该元素的属性填写情况是否合法var $this = $(this)var $parent = getParent($this)var relatedTarget = { relatedTarget: this }if (!$parent.hasClass('open')) return// 触发元素中包含input、textarea时跳出clearMenus函数if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return// 父级元素触发hide事件,relatedTarget的目的是为mouseout、mouseleave指定相关元素/目标元素// $.event构建事件,可以配置数据以及relatedTarget关联元素,以便使用$parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))// event.isDefaultPrevented判断是否调用了preventDefault方法,event.preventDefault()阻止默认事件// event.stopPropagation()阻止事件冒泡,event.isPropagationStopped()判断有否调用stopPropagation方法if (e.isDefaultPrevented()) return$this.attr('aria-expanded', 'false')$parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget);})}// trigger触发show(展开前)、focus(展开中)、shown(展开后)事件// toggle通过单if语句实现折叠时展开,展开时折叠的效果,即顺序执行折叠,折叠前获取展开折叠状态,若为折叠if语句展开Dropdown.prototype.toggle = function (e) {// this指代调用dropdown方法的元素,clearMenus函数里再取填写[data-toggle="dropdown"]属性的元素,避免该属性未曾填写的元素var $this = $(this) if ($this.is('.disabled, :disabled')) returnvar $parent  = getParent($this)var isActive = $parent.hasClass('open')clearMenus()if (!isActive) {if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {// 手机端使用backdrop,以使点击事件有效$(document.createElement('div')).addClass('dropdown-backdrop').insertAfter($(this)).on('click', clearMenus)}var relatedTarget = { relatedTarget: this }$parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))if (e.isDefaultPrevented()) return$this.trigger('focus').attr('aria-expanded', 'true')$parent.toggleClass('open').trigger('shown.bs.dropdown', relatedTarget)}return false}// 下拉框以及触发元素处点击向上向下、空格Esc箭头通过trigger触发相应事件,Dropdown.prototype.keydown = function (e) {// 向上38、向下40、空格32、Esc键27if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) returnvar $this = $(this)e.preventDefault()e.stopPropagation()if ($this.is('.disabled, :disabled')) returnvar $parent  = getParent($this)var isActive = $parent.hasClass('open')// 触发元素折叠时按键触发点击事件,e.target也随之改变,以便上下箭头在下拉框中选择,展开时Esc按键触发focus事件折叠if (!isActive && e.which != 27 || isActive && e.which == 27) {if (e.which == 27) $parent.find(toggle).trigger('focus')return $this.trigger('click')}// 展开时下拉框向上向下箭头得到焦点var desc = ' li:not(.disabled):visible a'var $items = $parent.find('.dropdown-menu' + desc)if (!$items.length) returnvar index = $items.index(e.target)if (e.which == 38 && index > 0)                 index--         // upif (e.which == 40 && index < $items.length - 1) index++         // downif (!~index)                                    index = 0$items.eq(index).trigger('focus')}// DROPDOWN PLUGIN DEFINITION// ==========================// 由触发元素dropdown-toggle调用dropdown方法,通过data属性new出一个dropdown实例,data属性也记录该对象,继而通过传入的option参数调用实例的toggle方法function Plugin(option) {return this.each(function () {var $this = $(this)var data  = $this.data('bs.dropdown')if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))if (typeof option == 'string') data[option].call($this)})}var old = $.fn.dropdown$.fn.dropdown             = Plugin$.fn.dropdown.Constructor = Dropdown// $.fn.dropdown已存在,使用old保存该值,$.fn.dropdown空闲出来完成操作,执行$.fn.dropdown.noConflict回归原$.fn.dropdown$.fn.dropdown.noConflict = function () {$.fn.dropdown = oldreturn this}// APPLY TO STANDARD DROPDOWN ELEMENTS// ===================================// 点击[data-toggle="dropdown"]元素触发toggle方法,toggle方法中调用clearMenus函数先折叠,回到toggle再展开,点击其他区域折叠$(document).on('click.bs.dropdown.data-api', clearMenus).on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }).on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle).on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown).on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)}(jQuery);

 

这篇关于bootstrap-dropdown源码解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/333825

相关文章

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

基于Java医院药品交易系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W+,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码+数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人  Java精品实战案例《600套》 2023-2025年最值得选择的Java毕业设计选题大全:1000个热

美容美发店营销版微信小程序源码

打造线上生意新篇章 一、引言:微信小程序,开启美容美发行业新纪元 在数字化时代,微信小程序以其便捷、高效的特点,成为了美容美发行业营销的新宠。本文将带您深入了解美容美发营销微信小程序,探讨其独特优势及如何助力商家实现业务增长。 二、微信小程序:美容美发行业的得力助手 拓宽客源渠道:微信小程序基于微信社交平台,轻松实现线上线下融合,帮助商家快速吸引潜在客户,拓宽客源渠道。 提升用户体验:

风水研究会官网源码系统-可展示自己的领域内容-商品售卖等

一款用于展示风水行业,周易测算行业,玄学行业的系统,并支持售卖自己的商品。 整洁大气,非常漂亮,前端内容均可通过后台修改。 大致功能: 支持前端内容通过后端自定义支持开启关闭会员功能,会员等级设置支持对接官方支付支持添加商品类支持添加虚拟下载类支持自定义其他类型字段支持生成虚拟激活卡支持采集其他站点文章支持对接收益广告支持文章评论支持积分功能支持推广功能更多功能,搭建完成自行体验吧! 原文

HTML5文旅文化旅游网站模板源码

文章目录 1.设计来源文旅宣传1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 文旅之行界面演示1.5 文旅之行文章内容界面演示1.6 关于我们界面演示1.7 文旅博客界面演示1.8 文旅博客文章内容界面演示1.9 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh

mediasoup 源码分析 (八)分析PlainTransport

mediasoup 源码分析 (六)分析PlainTransport 一、接收裸RTP流二、mediasoup 中udp建立过程 tips 一、接收裸RTP流 PlainTransport 可以接收裸RTP流,也可以接收AES加密的RTP流。源码中提供了一个通过ffmpeg发送裸RTP流到mediasoup的脚本,具体地址为:mediasoup-demo/broadcaste

bootstrap和JS相关

下表列出了模态框中要用到事件。这些事件可在函数中当钩子使用。 bootstrap 显示隐藏div $('.show-info').click(function () {var show = $(this).data('show');if(show =='all'){$('#creative').show();$('#plan').show();$('#plan').attr('class','

Java并发编程—阻塞队列源码分析

在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。   在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了D