jQuery UI Widget Factory Sample 3

ダイアログを追加

HTML

<script src="https://code.jquery.com/ui/1.11.1/jquery-ui.min.js"></script>
<div class="js-tabContainer">
    <div class="mod-tabNavs js-tabNavs">
        <a href="#tabA" class="mod-tabNav js-tabNav state-active">foo</a>
        <a href="#tabB" class="mod-tabNav js-tabNav">bar</a>
        <a href="#tabC" class="mod-tabNav js-tabNav">baz</a>
    </div>
    <div class="mod-tabContents js-tabContents">
        <div id="tabA" class="mod-tabContent js-tabContent state-active">foo</div>
        <div id="tabB" class="mod-tabContent js-tabContent">bar</div>
        <div id="tabC" class="mod-tabContent js-tabContent">baz</div>
    </div>
</div>

<div class="mod-dialog js-dialog">
    <div class="mod-dialog-overlay js-dialog-overlay"></div>
    <div class="mod-dialog-content js-dialog-content">Dialog!!!</div>
</div>

<button class="mod-button js-button">open dialog plz!!!!!!!!!!!!!!!!!!!</button>

CSS

.mod-dialog {
    display: none;
}

.mod-dialog.state-active {
    display: block;
}

.mod-dialog-overlay {
    background: black;
    cursor: pointer;
    opacity: .6;
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1;
}

.mod-dialog-content {
    background: white;
    height: 200px;
    left: 50%;
    margin-left: -100px;
    margin-top: -100px;
    position: absolute;
    top: 50%;
    width: 200px;
    z-index: 1;
}

.mod-tabContainer {}

.mod-tabNavs {
    overflow: hidden;
}

.mod-tabNav {
    background: black;
    color: white;
    display: block;
    float: left;
    font-size: 14px;
    margin-right: 8px;
    padding: 10px;
    text-align: center;
    text-decoration: none;
    width: 80px;
}

.mod-tabNav.state-active,
.mod-tabNav:hover {
    background: skyblue;
}

.mod-tabNav:last-child {
    margin-right: 0;
}

.mod-tabContents {
    background: skyblue;
    width: 316px;
}

.mod-tabContent {
    display: none;
    min-height: 100px;
    padding: 10px;
}

.mod-tabContent.state-active {
    display: block;
}

.mod-button {
    cursor: pointer;
    margin-top: 30px;
}

JavaScript

$.widget('ui.tab', {
    options: {
        selectorNav: '.js-tabNav',
        selectorContent: '.js-tabContent',
        classActive: 'state-active'
    },
    _create: function () {
        this._setUpElements();
        this._setEvents();
    },
    _setUpElements: function () {
        var elem = this.element,
            o = this.options;
        this._$nav = elem.find(o.selectorNav);
        this._$content = elem.find(o.selectorContent);
    },
    _setEvents: function () {
        this._$nav.on('click', $.proxy(this._onClickHandler, this));
    },
    _onClickHandler: function (e) {
        e.preventDefault();
        this.switchTab(e.currentTarget.hash);
    },
    switchTab: function (fragment) {
        this._changeContent(fragment);
        this._changeTab(fragment);
    },
    _changeContent: function (fragment) {
        var active = this.options.classActive;
        this._$content.removeClass(active).filter(function () {
            return this.id === fragment.substring(1);
        }).addClass(active);
    },
    _changeTab: function (fragment) {
        var active = this.options.classActive;
        this._$nav.removeClass(active).filter(function () {
            return this.hash === fragment;
        }).addClass(active);
    }
});

$.widget('ui.dialog', {
    options: {
        selectorOverlay: '.js-dialog-overlay',
        selectorContent: '.js-dialog-content',
        classActive: 'state-active'
    },
    _create: function () {
        this._setUpElements();
        this._setEvents();
    },
    _setUpElements: function () {
        var elem = this.element,
            o = this.options;
        this._$overlay = elem.find(o.selectorOverlay);
        this._$content = elem.find(o.selectorContent);
    },
    _setEvents: function () {
        this._$overlay.on('click', $.proxy(this._onClickHandler, this));
    },
    _onClickHandler: function () {
        this._close();
    },
    _close: function () {
       ...