前面的話
在 Bootstrap 框架中把模態彈出框統一稱為 Modal。這種彈出框效果在大多數 Web 網站的互動中都可見。例如點擊一個按鈕彈出一個框,彈出的框可能是一段文件描述,也可能有按鈕操作,也有可能彈出的是一張圖片。本文將詳細介紹Bootstrap模態彈出框
結構分析
【相關影片推薦:Bootstrap教學】
Bootstrap框架中的模態彈出框,分別運用了“modal”、“modal-dialog”和“modal-content”樣式,而彈出窗真正的內容都放置在“modal-content”中,其主要又包括三個部分:
☑ 彈出框頭部,一般使用「modal-header」表示,主要包括標題和關閉按鈕
☑ 彈出框主體,一般使用「modal-body」表示,彈出框的主要內容
☑ 彈出框腳部,一般使用「modal-footer」表示,主要放置操作按鈕
<p></p><p></p><p></p><p><button><span>×</span><span>Close</span></button></p><h4 id="模态弹出窗标题">模态弹出窗标题</h4><p></p><p>模态弹出窗主体内容</p><p><button>关闭</button><button>保存</button></p><!-- /.modal-content --><!-- /.modal-dialog --><!-- /.modal -->
對於彈跳視窗而言,modal-content是樣式的關鍵。主要設定了彈跳窗的邊框、邊距、背景色和陰影等樣式
.modal-content { position: relative; background-color: #fff; -webkit-background-clip: padding-box; background-clip: padding-box; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, .2); border-radius: 6px; outline: 0; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); box-shadow: 0 3px 9px rgba(0, 0, 0, .5); }
除此之外,modal-content中的modal-header、modal-body和modal-footer三個部分樣式設置如下
.modal-header { min-height: 16.42857143px; padding: 15px; border-bottom: 1px solid #e5e5e5; }.modal-header .close { margin-top: -2px; }.modal-title { margin: 0; line-height: 1.42857143; }.modal-body { position: relative; padding: 15px; }.modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; }
這三個部分主要控制一些間距的樣式。而modal-footer都是用來放置按鈕,所以底部也對包含的按鈕做了一定的樣式處理
.modal-footer .btn + .btn { margin-bottom: 0; margin-left: 5px; }.modal-footer .btn-group .btn + .btn { margin-left: -1px; }.modal-footer .btn-block + .btn-block { margin-left: 0; }
觸發方式
眾所周知,模態彈出窗在頁面載入完成時,是隱藏在頁面中的,只有透過一定的動作(事件)才能觸發模態彈出窗的顯示。在Bootstrap框架中實作方法有2種
在介紹觸發方式之前,首先要說明.show和.fade這兩個方法。只有模態彈出視窗預設是隱藏的,才能觸發其顯示
.fade {opacity: 0; -webkit-transition: opacity .15s linear; -o-transition: opacity .15s linear; transition: opacity .15s linear; }.show {display: block!important; }
【方法一】
# 模態彈出視窗聲明,只需要自訂兩個必要的屬性:data-toggle和data-target(bootstrap中聲明式觸發方法一般依賴這些自訂的data-xxx 屬性。例如data-toggle="" 或data-dismiss="")
data-toggle必須設定為modal(toggle中文翻譯過來就是觸發器);
data-target可以設定為CSS的選擇符,也可以設定為模態彈出視窗的ID值,一般情況設定為模態彈出視窗的ID值,因為ID值是唯一的值
<p></p><p></p><p></p><p><button><span>×</span><span>Close</span></button></p><h4 id="模态弹出窗标题">模态弹出窗标题</h4><p></p><p>模态弹出窗主体内容</p><p><button>关闭</button><button>保存</button></p><!-- /.modal-content --><!-- /.modal-dialog --><!-- /.modal -->
【方法二】
觸發模態彈出視窗也可以是一個連結元素,那麼可以使用連結元素自帶的href屬性取代data-target屬性
不過建議還是使用統一使用data-target的方式來觸發
点击<p></p><p></p><p></p><p><button><span>×</span><span>Close</span></button></p><h4 id="模态弹出窗标题">模态弹出窗标题</h4><p></p><p>模态弹出窗主体内容</p><p><button>关闭</button><button>保存</button></p><!-- /.modal-content --><!-- /.modal-dialog --><!-- /.modal -->
尺寸
Bootstrap框架為模態彈出視窗提供了不同尺寸,一個是大尺寸樣式“modal-lg”,另一個是小尺寸樣式“modal-sm”。其結構上稍做調整
[注意].bs-example-modal-lg和.bs-example-modal-sm是自訂的名稱,而非必須
<!-- 大尺寸模态弹出窗 --><p></p><p> </p><p> ... </p><!-- 小尺寸模态弹出窗 --><p></p><p> </p><p> ... </p>
<button>大尺寸</button><button>默认尺寸</button><button>小尺寸</button><p></p><p></p><p></p><p></p><p>小火柴的蓝色理想</p><p></p><p></p><p></p><p></p><p>小火柴的蓝色理想</p><p></p><p></p><p></p><p></p><p>小火柴的蓝色理想</p>
CSS解析
bootstrap中的「模態彈出框」有以下幾個特點:
1、模態彈出視窗是固定在瀏覽器中的。
2、點選右側全螢幕按鈕,在全螢幕狀態下,模態彈出視窗寬度是自適應的,而且modal-dialog水平居中。
3、當瀏覽器視窗大於768px時,模態彈出窗的寬度為600px
4、模態彈出窗的背景常常有一個透明的蒙層效果
5、觸發彈窗時,彈跳視窗是從上到下、逐漸浮現到頁面前的
【固定在瀏覽器實作】
.modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0; }
【水平居中實作】
.modal-dialog { position: relative; width: auto; margin: 10px; }
【當瀏覽器視窗大於768px時,模態彈出視窗的寬度為600px實作】
@media (min-width: 768px) { .modal-dialog { width: 600px;margin: 30px auto; } .modal-content {-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);box-shadow: 0 5px 15px rgba(0, 0, 0, .5); } .modal-sm {width: 300px; }}
【蒙版】
彈窗彈出時為 < ;body>
元素添加 .modal-open
類,從而覆寫頁面預設的滾動行為,並且還會自動產生一個 .modal-backdrop
元素用於提供一個可點選的區域,點選此區域就即可關閉模態框
.modal-open {overflow: hidden; }
.modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; }
給其添加了一個過渡動畫,從fade到in,把opacity值從0變成了0.5
.modal-backdrop.fade { filter: alpha(opacity=0); opacity: 0; }.modal-backdrop.in { filter: alpha(opacity=50); opacity: .5; }
【動畫效果】
彈窗的動畫內容是從-25%的top值位置到top:0的位置
.modal.fade .modal-dialog { -webkit-transition: -webkit-transform .3s ease-out; -o-transition: -o-transform .3s ease-out; transition: transform .3s ease-out; -webkit-transform: translate3d(0, -25%, 0); -o-transform: translate3d(0, -25%, 0); transform: translate3d(0, -25%, 0); }.modal.in .modal-dialog { -webkit-transform: translate3d(0, 0, 0); -o-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); }
如果不需要模態框彈出時的動畫效果(淡入淡出效果),刪除 .fade
類別即可
<p></p><p></p><p></p><p><button><span>×</span><span>Close</span></button></p><h4 id="模态弹出窗标题">模态弹出窗标题</h4><p></p><p>模态弹出窗主体内容</p><p><button>关闭</button><button>保存</button></p><!-- /.modal-content --><!-- /.modal-dialog --><!-- /.modal -->
參數說明
除了透過data-toggle和data-target來控制模態彈出視窗之外, Bootstrap框架針對模態彈出框也提供了其他自訂data-屬性,來控制模態彈出視窗。有關Modal彈出視窗自訂屬性相關說明如下所示
此參數設定在按鈕上,或彈跳視窗上都可以。出於方便,一般地,在按鈕上設定
[注意]屬性值一定要加引號,如data-backdrop="false"
如果想要支援esc鍵關閉彈窗,需要在彈跳窗上設定tabindex="-1"
<button>默认样式</button><button>无蒙版</button><button>ESC失效</button><button>弹窗默认不显示</button><p></p><p></p><p></p><p><button><span>×</span><span>Close</span></button></p><h4 id="小火柴的蓝色理想">小火柴的蓝色理想</h4> <p></p><p>好的代码像粥一样,都是用时间熬出来的</p><p tabindex="-1"></p><p></p><p></p><p><button><span>× </span><span>Close</span></button></p><h4 id="小火柴的蓝色理想">小火柴的蓝色理想</h4> <p></p><p>好的代码像粥一样,都是用时间熬出来的</p><p tabindex="-1"></p><p></p><p></p><p><button><span>× </span><span>Close</span></button></p><h4 id="小火柴的蓝色理想">小火柴的蓝色理想</h4> <p></p><p>好的代码像粥一样,都是用时间熬出来的</p><p tabindex="-1"></p><p></p><p></p><p><button><span>× </span><span>Close</span></button></p><h4 id="小火柴的蓝色理想">小火柴的蓝色理想</h4> <p></p><p>好的代码像粥一样,都是用时间熬出来的</p>
JS触发
除了使用自定义属性data-触发模态弹出框之外,还可以通过JavaScript方法来触发模态弹出窗。比如说给按钮设置一个单击事件,然后触发模态弹出窗
只需一行 JavaScript 代码,即可通过元素的 id myModal
调用模态框
$('#myModal').modal()
<button>点击</button><p tabindex="-1"></p><p></p><p></p><p><button><span>× </span><span>Close</span></button></p><h4 id="小火柴的蓝色理想">小火柴的蓝色理想</h4> <p></p><p>好的代码像粥一样,都是用时间熬出来的</p><script>$(function(){ $(".btn").click(function(){ $("#mymodal").modal(); }); });</script>
使用JavaScript触发模态弹出窗时,Bootstrap框架提供了一些设置,主要包括属性设置、参数设置和事件设置
【属性设置】
模态弹出窗默认支持的自定义属性主要有
不想让用户按ESC键关闭模态弹出窗,可以这样做
$(function(){ $(".btn").click(function(){ $("#mymodal").modal({ keyboard:false}); }); });
【参数设置】
在Bootstrap框架中还为模态弹出窗提供了三种参数设置,具体说明如下
<button>打开(关闭)</button> <p> </p><p> </p><p> </p><p> <button><span>× </span><span>Close</span></button> </p><h4 id="小火柴的蓝色理想">小火柴的蓝色理想</h4> <p> </p><p>好的代码像粥一样,都是用时间熬出来的</p> <script>;$(function(){ $("#btn").click(function(){ $("#mymodal").modal("toggle"); }); });</script>
【事件设置】
模态弹窗还支持五种类型的事件,分别是模态弹出窗的弹出前、弹出后,关闭前、关闭后及远端数据加载后,具体描述如下:
<button>打开</button><p tabindex="-1"></p><p></p><p></p><p><button><span>× </span><span>Close</span></button></p><h4 id="小火柴的蓝色理想">小火柴的蓝色理想</h4> <p></p><p>好的代码像粥一样,都是用时间熬出来的</p><script>;$(function(){ $("#btn").click(function(){ $("#mymodal").modal("toggle"); }); $('#mymodal').on('hide.bs.modal', function(){ $("#btn").html("打开"); }); $('#mymodal').on('show.bs.modal', function(){ $("#btn").html("关闭"); }); });</script>
JS解析
【1】IIFE
使用立即调用函数,防止插件内代码外泄,从而形成一个闭环,并且只能从jQuery的fn里进行扩展
+function ($) {//使用es5严格模式'use strict';//}(window.jQuery);
【2】初始设置
var Modal = function (element, options) { this.options = options//options是设置选项this.$body = $(document.body)//body元素this.$element = $(element)////element表示modal弹出框容器及内容元素this.$dialog = this.$element.find('.modal-dialog')//弹窗对象this.$backdrop = null //蒙版对象this.isShown = null //弹窗是否显示的标识this.originalBodyPad = null //body的padding-right标识this.scrollbarWidth = 0 //滚动条宽度为0this.ignoreBackdropClick = false //默认蒙板可点击 //如果设置了remote,就加载remote指定url的内容到modal-content样式的元素内,并触发loaded.bs.modal事件 if (this.options.remote) { this.$element .find('.modal-content') .load(this.options.remote, $.proxy(function () { this.$element.trigger('loaded.bs.modal') }, this)) } } //组件版本号3.3.7 Modal.VERSION = '3.3.7' //动画持续时间300ms Modal.TRANSITION_DURATION = 300 //蒙版动画持续时间150ms Modal.BACKDROP_TRANSITION_DURATION = 150 //默认设置 Modal.DEFAULTS = { backdrop: true, //显示蒙版keyboard: true, //按ESC键关闭弹窗show: true //单击触发元素时打开弹窗 }
【3】插件核心代码
主要是Modal核心类函数的定义、默认参数的定义和9个原型方法的定义,这9个原型方法主要是处理弹窗的反转、打开、关闭和弹窗背景设置、取消等操作
// 反转弹窗(打开或关闭) Modal.prototype.toggle = function (_relatedTarget) {//如果弹窗处于显示状态,则调用hide()方法,关闭它;否则,调用show()方法,打开弹窗return this.isShown ? this.hide() : this.show(_relatedTarget) } // 打开弹窗 Modal.prototype.show = function (_relatedTarget) {//保存this值var that = this//定义弹窗前的触发事件 var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })//打开弹窗前,触发事件 this.$element.trigger(e)// 如果已经打开了(或者曾经被阻止过),则退出执行,后续代码不做处理 if (this.isShown || e.isDefaultPrevented()) return//设置弹窗显示标识为true this.isShown = truethis.checkScrollbar()this.setScrollbar()this.$body.addClass('modal-open')//处理键盘事件,主要是设置按esc键时是否关闭弹窗 this.escape()this.resize()// 如果单击了元素内的子元素(带有[data-dismiss="modal"]属性),则关闭弹窗 this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))//点击弹窗时,如果鼠标的目标是当前弹窗,则将默认蒙板不可点击的标识置为true,并不可再设置 this.$dialog.on('mousedown.dismiss.bs.modal', function () { that.$element.one('mouseup.dismiss.bs.modal', function (e) { if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true }) })//绘制蒙版后,处理以下代码this.backdrop(function () { // 判断浏览器是否支持动画,并且弹窗是否设置了动画过渡效果(是否有fade样式) var transition = $.support.transition && that.$element.hasClass('fade') // 如果modal弹窗没有父容器,则将它附加到body上 if (!that.$element.parent().length) { that.$element.appendTo(that.$body) } // 显示modal弹窗 that.$element .show() .scrollTop(0) that.adjustDialog() // 如果支持动画,强制刷新UI现场,重绘弹窗 if (transition) { that.$element[0].offsetWidth } // 给modal弹窗添加in样式,和modal样式一起 that.$element.addClass('in') // 强制给弹窗设定焦点 that.enforceFocus() // 打开弹窗显示后的触发事件 var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) transition ?that.$dialog //找到弹窗元素 .one('bsTransitionEnd', function () {// 如果支持动画,则动画结束以后给弹窗内的元素设置焦点,并触发shown事件that.$element.trigger('focus').trigger(e) }) .emulateTransitionEnd(Modal.TRANSITION_DURATION) :// 否则直接设置焦点,并触发shown事件 that.$element.trigger('focus').trigger(e) }) } // 关闭弹窗 Modal.prototype.hide = function (e) {//阻止冒泡 if (e) e.preventDefault()//定义关闭弹窗前的触发事件 e = $.Event('hide.bs.modal')//关闭弹窗前触发事件 this.$element.trigger(e)// 如果已经关闭了(或者曾经被阻止过),则退出执行,后续代码不做处理 if (!this.isShown || e.isDefaultPrevented()) return//设置显示状态标识为false this.isShown = false//处理键盘事件,主要是设置按Esc键的时候是否关闭弹窗 this.escape()this.resize()//取消所有的focusin.bs.modal事件 $(document).off('focusin.bs.modal')this.$element .removeClass('in') //删除in样式 .off('click.dismiss.bs.modal') //取消dismiss的单击事件 .off('mouseup.dismiss.bs.modal')//取消dismiss的鼠标抬起事件//取消dismiss的鼠标放下事件 this.$dialog.off('mousedown.dismiss.bs.modal')//如果支持动画,则动画结束以后再关闭,否则直接关闭 $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } //强制弹窗处于焦点状态 Modal.prototype.enforceFocus = function () { $(document) // 禁用所有的focusin事件,防止无限循环 .off('focusin.bs.modal') .on('focusin.bs.modal', $.proxy(function (e) { if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { // 如果处于焦点的元素不是当前元素(或不包含当前元素),则强制给当前元素设置焦点 this.$element.trigger('focus') } }, this)) } //按Esc键是否退出的处理 Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { //如果弹窗是打开状态,并且keyboard选项为true,则说明允许按ESC键可以关闭弹窗 this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {//检测键盘事件,如果是ESC(keycode=27),则关闭 e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { // 否则,取消键盘事件检测 this.$element.off('keydown.dismiss.bs.modal') } } Modal.prototype.resize = function () {if (this.isShown) { $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) } else { $(window).off('resize.bs.modal') } } //关闭弹窗 Modal.prototype.hideModal = function () { var that = this//关闭弹窗 this.$element.hide()this.backdrop(function () { //移除body上的modal-open样式 that.$body.removeClass('modal-open') that.resetAdjustments() that.resetScrollbar() //关闭以后,触发hidden事件 that.$element.trigger('hidden.bs.modal') }) } //删除蒙版,关闭弹窗时触发 Modal.prototype.removeBackdrop = function () {// 删除蒙版 this.$backdrop && this.$backdrop.remove()// 设置蒙版对象为null this.$backdrop = null } //添加蒙版,打开弹窗时触发 Modal.prototype.backdrop = function (callback) { var that = this//是否设置了动画过渡效果,如果是则将animate设置为fade var animate = this.$element.hasClass('fade') ? 'fade' : ''//如果是打开状态,并且设置了backdrop参数 if (this.isShown && this.options.backdrop) { //定义动画标识 var doAnimate = $.support.transition && animate // 在body上定义蒙版p元素,并附加fade标识以支持动画 this.$backdrop = $(document.createElement('p')) .addClass('modal-backdrop ' + animate) .appendTo(this.$body) //蒙版被单击时进行判断:如果backdrop参数为static,则强制将弹窗设置为售点;否则,关闭弹窗 this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {if (this.ignoreBackdropClick) { this.ignoreBackdropClick = false return}if (e.target !== e.currentTarget) returnthis.options.backdrop == 'static' ? this.$element[0].focus() : this.hide() }, this)) // 如果支持动画,强制刷新UI现场,重绘弹窗 if (doAnimate) this.$backdrop[0].offsetWidth //添加in样式 this.$backdrop.addClass('in') //如果没有回调,则直接返回 if (!callback) return // 如果支持动画,则动画结束执行回调函数;否则,直接执行回调函数 doAnimate ?this.$backdrop .one('bsTransitionEnd', callback) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callback() //如果是关闭状态,但蒙版对象依然还存在 } else if (!this.isShown && this.$backdrop) { //去除in样式 this.$backdrop.removeClass('in') var callbackRemove = function () { that.removeBackdrop() callback && callback() } // 如果支持动画,则动画结束执行回调函数;否则,直接执行回调函数 $.support.transition && this.$element.hasClass('fade') ?this.$backdrop .one('bsTransitionEnd', callbackRemove) .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : callbackRemove() } else if (callback) { callback() } }
【4】滚动条处理
在弹窗插件中,使用了大量的代码对滚动条进行处理
Modal.prototype.handleUpdate = function () {this.adjustDialog() } //处理因为滚动条而使弹窗位置不固定问题 Modal.prototype.adjustDialog = function () {//如果元素的高度大于页面的高度,即溢出屏幕,则modalIsOverflowing置为true var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight//将元素的paddingLeft和paddingRight设置为scrollbarWidth this.$element.css({ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''}) } //重置调节器 Modal.prototype.resetAdjustments = function () {//将元素的paddingLeft和paddingRight置为空this.$element.css({ paddingLeft: '', paddingRight: ''}) } //检查滚动条 Modal.prototype.checkScrollbar = function () {//fullWindowWidth储存页面宽度 var fullWindowWidth = window.innerWidth//IE8-浏览器不支持innerWidth属性 if (!fullWindowWidth) { //使用getBoundingClientRect方法来获得页面宽度 var documentElementRect = document.documentElement.getBoundingClientRect() fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) }//如果有滚动条,则bodyIsOverflowing置为true this.bodyIsOverflowing = document.body.clientWidth <p>【5】jQuery插件定义</p><p> 在jQuery上定义插件,有点特殊的代码是options参数的收集和合并,主要收集了3个部分:插件的默认参数DEFAULTS、modal元素上的data-属性,执行插件时传入的option对象,这三个部分的优先级依次升高</p><pre class="brush:php;toolbar:false"> function Plugin(option, _relatedTarget) {//根据选择器,遍历所有符合规则的元素 return this.each(function () { var $this = $(this) //获取自定义属性bs.modal的值 var data = $this.data('bs.modal') //将插件的默认参数DEFAULTS、modal元素上的data-属性,执行插件时传入的option对象,这三种值合并到一起,作为options参数 //后面的参数的优先级高于前面的参数 var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) //如果值不存在,则将Modal实例设置为bs.modal值 if (!data) $this.data('bs.modal', (data = new Modal(this, options))) //如果option传递了string,则表示要执行某个方法 if (typeof option == 'string') data[option](_relatedTarget) else if (options.show) data.show(_relatedTarget) }) } var old = $.fn.modal //保留其他库的$.fn.modal代码(如果定义的话),以便在noConflict之后可以继续使用该老代码 $.fn.modal = Plugin //重设插件构造器,可以通过该属性获取插件的真实类函数 $.fn.modal.Constructor = Modal
【6】防冲突处理
$.fn.modal.noConflict = function () {//恢复以前的旧代码$.fn.modal = old//将$.fn.modal.noConflict()设置为Bootstrap的Modal插件return this }
【7】绑定触发事件
//监测所有拥有自定义属性data-toggle="modal"的元素上的单击事件 $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { var $this = $(this)//获取href属性值 var href = $this.attr('href')//获取data-target属性值,如果没有,则获取href值,该值是所弹出元素的idvar $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //如果弹窗元素上已经弹窗实例(即弹出过一次了),则设置option值为字符串toggle,否则将remote值(如果有的话)、弹窗元素上的自定义属性值集合、触发元素上的自定义属性值集合,合并为option对象var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())//如果是a链接,则阻止其默认行为if ($this.is('a')) e.preventDefault() $target.one('show.bs.modal', function (showEvent) { if (showEvent.isDefaultPrevented()) return //定义一次hidden事件,给所单击元素设置focus $target.one('hidden.bs.modal', function () { $this.is(':visible') && $this.trigger('focus') }) }) Plugin.call($target, option, this) }) }(jQuery);
以上是Bootstrap模態彈出框的實例教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用