bootstrapプラグイン学習-bootstrap.tab.js
15210 ワード
まずbootstrap-tabを見てみましょう.jsの構造
HTML構造
初期化から開始
bodyにaタグのclickイベントを傍受させ,その泡立ちを阻止させ,jQueryのプロトタイプメソッドtabを呼び出した.
この構造は以前のいくつかのプラグインとあまり差がありませんが、最後にshowメソッドを実行し、コンストラクタに入ります.
オブジェクトをコンストラクタインスタンスのプロパティにカプセル化します.次にshowメソッドを実行します
ラベルaのdata-targetプロパティまたはhrefに基づいて、対応するidのdomノードが見つかります.最後にactivateメソッドを2回実行しましたが、実際にはaラベルのハイライト表示を制御する方法とdomノードの表示と非表示を制御する方法が推測されます.
論理は比較的に簡単で、一般的に他の同類が表示されない場合に遭遇し、基本的にはこの方法で、classを削除して要求を達成します.しかし、jQuery操作cssでclass切り替えを完了するにはjavascriptのオリジナルメソッドに比べて、どの効率が良いのでしょうか.経験のある園友にも答えてほしい.
また一部cssは,2つのactiveクラスの役割を示している.
内容は多くなくて、时間はちょうど良くて、以上は私の少しのコードを読む体得で、もし间违いがあれば、指摘して、みんなは共通して学びます.
var Tab = function ( element ) {} //
Tab.prototype ={} //
$.fn.tab = function ( option ){} //jQuery
$.fn.tab.Constructor = Tab // jQuery
$(function () {}) //
HTML構造
<ul class="nav nav-tabs">
<li class="active"><a href="#home" data-toggle="tab" > </a></li>
<li><a href="#profile" data-toggle="tab"> </a></li>
<li><a href="#messages" data-toggle="tab"> </a></li>
<li><a href="#settings" data-toggle="tab"> </a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="home">1</div>
<div class="tab-pane" id="profile">2</div>
<div class="tab-pane" id="messages">3</div>
<div class="tab-pane" id="settings">4</div>
</div>
初期化から開始
/*
*
* data-toggle='tab' click
* */
$(function () {
$('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault()
$(this).tab('show')// jQuery tab show, show 。this data-toggle a
})
})
bodyにaタグのclickイベントを傍受させ,その泡立ちを阻止させ,jQueryのプロトタイプメソッドtabを呼び出した.
/*
* jQuery
* */
$.fn.tab = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tab')
if (!data) $this.data('tab', (data = new Tab(this)))//
if (typeof option == 'string') data[option]()// option
})
}
この構造は以前のいくつかのプラグインとあまり差がありませんが、最後にshowメソッドを実行し、コンストラクタに入ります.
var Tab = function ( element ) {
this.element = $(element)
}
オブジェクトをコンストラクタインスタンスのプロパティにカプセル化します.次にshowメソッドを実行します
show: function () {
var $this = this.element
, $ul = $this.closest('ul:not(.dropdown-menu)')// dropdown ul
, selector = $this.attr('data-target')
, previous
, $target
// a id
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
// ,
if ( $this.parent('li').hasClass('active') ) return
previous = $ul.find('.active a').last()[0]// active a ,
$this.trigger({
type: 'show'
, relatedTarget: previous
})
$target = $(selector)// jQueryDOM
this.activate($this.parent('li'), $ul)//tab
this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown'
, relatedTarget: previous
})
})
ラベルaのdata-targetプロパティまたはhrefに基づいて、対応するidのdomノードが見つかります.最後にactivateメソッドを2回実行しましたが、実際にはaラベルのハイライト表示を制御する方法とdomノードの表示と非表示を制御する方法が推測されます.
/*
*
* , active , 。
* active , active, , active 。
*
* */
, activate: function ( element, container, callback) {
var $active = container.find('> .active')
, transition = callback
&& $.support.transition// js , 。
&& $active.hasClass('fade')
console.log($active[0])
function next() {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active')
if (transition) {
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
}
if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
}
callback && callback()
}
transition ?
$active.one($.support.transition.end, next) :
next()
$active.removeClass('in')
}
論理は比較的に簡単で、一般的に他の同類が表示されない場合に遭遇し、基本的にはこの方法で、classを削除して要求を達成します.しかし、jQuery操作cssでclass切り替えを完了するにはjavascriptのオリジナルメソッドに比べて、どの効率が良いのでしょうか.経験のある園友にも答えてほしい.
また一部cssは,2つのactiveクラスの役割を示している.
/*tab active */
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover,
.nav-tabs > .active > a:focus {
color: #555555;
cursor: default;
background-color: #ffffff;
border: 1px solid #ddd;
border-bottom-color: transparent;//
}
/*dom*/
.tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none; //
}
.tab-content > .active,
.pill-content > .active {
display: block; // active ,
}
内容は多くなくて、时間はちょうど良くて、以上は私の少しのコードを読む体得で、もし间违いがあれば、指摘して、みんなは共通して学びます.