123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- /**
- * layui 扩展侧边菜单栏组件
- * Autor:masterbeginner / Fhua
- * Date : 16-11-26
- */
- //配置navbar
- //navbar.set({ elem: '#admin-navbar-side', url: 'datas/nav.json' });
- //渲染navbar
- //navbar.render();
- //监听点击事件
- //navbar.on('click(side)', function(data) { });
- layui.define(['element', 'layer', 'common'], function (exports) {
- var $ = layui.jquery,
- layer = layui.layer,
- element = layui.element(),
- common = layui.common,
- cacheName = 'tb_navbar';
- var Navbar = function () {
- /**
- * 默认配置
- */
- this.config = {
- elem: undefined, //容器
- data: undefined, //数据源
- url: undefined, //数据源地址
- type: 'GET', //读取方式
- cached: false //是否使用缓存
- };
- this.v = '0.0.1';
- };
- Navbar.prototype.render = function () {
- var _that = this;
- var _config = _that.config;
- if (typeof (_config.elem) !== 'string' && typeof (_config.elem) !== 'object') {
- common.layerAlertE('Navbar error: elem参数未定义或设置出错.', '出错');
- }
- var $container;
- if (typeof (_config.elem) === 'string') {
- $container = $('' + _config.elem + '');
- }
- if (typeof (_config.elem) === 'object') {
- $container = _config.elem;
- }
- if ($container.length === 0) {
- common.layerAlertE('Navbar error:找不到elem参数配置的容器,请检查.', '出错');
- }
- if (_config.data === undefined && _config.url === undefined) {
- common.layerAlertE('Navbar error:请为Navbar配置数据源.', '出错')
- }
- if (_config.data !== undefined && typeof (_config.data) === 'object') {
- var html = getHtml(_config.data);
- $container.html(html);
- element.init();
- _that.config.elem = $container;
- } else {
- if (_config.cached) {
- var cacheNavbar = layui.data(cacheName);
- if (cacheNavbar.navbar === undefined) {
- $.ajax({
- type: _config.type,
- url: _config.url,
- async: false, //_config.async,
- dataType: 'json',
- success: function (result, status, xhr) {
- //添加缓存
- layui.data(cacheName, {
- key: 'navbar',
- value: result
- });
- var html = getHtml(result);
- $container.html(html);
- element.init();
- },
- error: function (xhr, status, error) {
- common.msgError('Navbar error:' + error);
- },
- complete: function (xhr, status) {
- _that.config.elem = $container;
- }
- });
- } else {
- var html = getHtml(cacheNavbar.navbar);
- $container.html(html);
- element.init();
- _that.config.elem = $container;
- }
- } else {
- //清空缓存
- layui.data(cacheName, null);
- $.ajax({
- type: _config.type,
- url: _config.url,
- async: false, //_config.async,
- dataType: 'json',
- success: function (result, status, xhr) {
- var html = getHtml(result);
- $container.html(html);
- element.init();
- },
- error: function (xhr, status, error) {
- common.msgError('Navbar error:' + error);
- },
- complete: function (xhr, status) {
- _that.config.elem = $container;
- }
- });
- }
- }
- return _that;
- };
- /**
- * 配置Navbar
- * @param {Object} options
- */
- Navbar.prototype.set = function (options) {
- var that = this;
- //采用递归方式合并两个对象,并修改第一个对象。
- $.extend(that.config, options);
- return that;
- };
- Navbar.prototype.on = function (events, callback) {
- var that = this;
- var _con = that.config.elem;
- if (typeof (events) !== 'string') {
- common.layerAlertE('Navbar error:事件名配置出错.', '出错');
- }
- var lIndex = events.indexOf('(');
- var eventName = events.substr(0, lIndex);
- var filter = events.substring(lIndex + 1, events.indexOf(')'));
- if (eventName === 'click') {
- if (_con.attr('lay-filter') !== undefined) {
- _con.children('ul').find('li').each(function () {
- var $this = $(this);
- if ($this.find('dl').length > 0) {
- var $dd = $this.find('dd').each(function () {
- $(this).on('click', function () {
- var $a = $(this).children('a');
- var href = $a.data('url');
- var icon = $a.children('i').attr('class');
- var title = $a.children('cite').text();
- var data = {
- elem: $a,
- field: {
- href: href,
- icon: icon,
- title: title
- }
- }
- callback(data);
- //$(this).parent('dl').parent('li').addClass('layui-this').siblings().removeClass('layui-this');
- });
- });
- } else {
- $this.on('click', function () {
- var $a = $this.children('a');
- var href = $a.data('url');
- var icon = $a.children('i').attr('class');
- var title = $a.children('cite').text();
- var data = {
- elem: $a,
- field: {
- href: href,
- icon: icon,
- title: title
- }
- }
- callback(data);
- //$this.addClass('layui-this').siblings().removeClass('layui-this');
- });
- }
- });
- }
- }
- };
- /**
- * 获取html字符串
- * @param {Object} data
- */
- function getHtml(data) {
- var ulHtml = '<div id="sidebar" class="sidebar-fold"><i class="fa fa-bars"></i></div><ul class="layui-nav layui-nav-tree admin-nav-tree">';
- for (var i = 0; i < data.length; i++) {
- if (data[i].spread) {
- ulHtml += '<li class="layui-nav-item layui-nav-itemed">';
- } else {
- ulHtml += '<li class="layui-nav-item">';
- }
- if (data[i].children !== undefined && data[i].children.length > 0) {
- ulHtml += '<a href="javascript:;">';
- if (data[i].icon !== undefined && data[i].icon !== '') {
- if (data[i].icon.indexOf('fa-') !== -1) {
- ulHtml += '<i class="' + data[i].icon + '" aria-hidden="true"></i>';
- } else {
- ulHtml += '<i class="layui-icon">' + data[i].icon + '</i>';
- }
- }
- ulHtml += '<cite>' + data[i].title + '</cite>'
- ulHtml += '</a>';
- ulHtml += '<dl class="layui-nav-child">'
- for (var j = 0; j < data[i].children.length; j++) {
- ulHtml += '<dd>';
- ulHtml += '<a href="javascript:;" data-url="' + data[i].children[j].href + '">';
- if (data[i].children[j].icon !== undefined && data[i].children[j].icon !== '') {
- if (data[i].children[j].icon.indexOf('fa-') !== -1) {
- ulHtml += '<i class="' + data[i].children[j].icon + '" aria-hidden="true"></i>';
- } else {
- ulHtml += '<i class="layui-icon">' + data[i].children[j].icon + '</i>';
- }
- }
- ulHtml += '<cite>' + data[i].children[j].title + '</cite>';
- ulHtml += '</a>';
- ulHtml += '</dd>';
- }
- ulHtml += '</dl>';
- } else {
- var dataUrl = (data[i].href !== undefined && data[i].href !== '') ? 'data-url="' + data[i].href + '"' : '';
- ulHtml += '<a href="javascript:;" ' + dataUrl + '>';
- if (data[i].icon !== undefined && data[i].icon !== '') {
- if (data[i].icon.indexOf('fa-') !== -1) {
- ulHtml += '<i class="' + data[i].icon + '" aria-hidden="true"></i>';
- } else {
- ulHtml += '<i class="layui-icon">' + data[i].icon + '</i>';
- }
- }
- ulHtml += '<cite>' + data[i].title + '</cite>'
- ulHtml += '</a>';
- }
- ulHtml += '</li>';
- }
- ulHtml += '</ul>';
- return ulHtml;
- }
- var navbar = new Navbar();
- exports('navbar', function (options) {
- return navbar.set(options);
- });
- //exports('navbar', navbar);
- });
|