/* ================================================================================ * dever.js v1.0 * http://git.shemic.com/dever/script * ================================================================================ * Copyright 2017-2018 Dever(dever.cc) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ================================================================================ */ // $(function() { Dever.Init(); }); //公共类库 var Dever = { countdown : -1, modal : false, Init : function() { this.Import(); this.Page().Init(); this.User().Init(); this.Editor().Init(); this.Upload().Init(); this.Change(); this.LoadPage(); this.Extend(); //this.Target(); //this.Pjax(); this.AutoComplete(); this.Emoji().Init(); } ,AutoComplete : function() { if ($("input").length) { $("input").each(function() { //$(this).attr('autocomplete', 'new-password'); $(this).attr('autocomplete', 'off'); /* $(this).attr('readonly', true); $(this).focus(function() { $(this).attr('readonly', false); }); */ }); } } ,Pjax : function() { $(document).pjax('a', '.container'); //$.pjax.reload('.container'); } ,Emoji : function() { return _Dever_Emoji; } ,Page : function() { return _Dever_Page; } ,Template : function() { return _Dever_Template; } ,Editor : function() { return _Dever_Editor; } ,User : function() { return _Dever_User; } ,Modal : function() { return new _Dever_Modal(); } ,Upload : function() { return _Dever_Upload; } ,Proxy : function(uri) { return config.proxy + 'proxy_method=' + encodeURIComponent(uri); } ,Jump : function(url) { location.href = url; } ,BackRun : function(url) { $.post(url); } ,Reload : function(e) { e.attr('src', e.attr('src')); } ,Target : function() { var link = config.host; $("a").each(function() { if (!$(this).attr('onclick')) { var url = $(this).attr('href'); if (url && url.indexOf(link) == -1) { //$(this).attr('target', '_blank'); } } }) } ,Time : function(e, time, text) { var self = this; if (this.countdown < 0) { this.countdown = time; } if (this.countdown == 0) { e.attr("disabled", false); e.html(text); self.Init(); this.countdown = time; } else { e.attr("disabled", true); e.html(this.countdown + 's后' + text); this.countdown--; e.unbind('click'); setTimeout(function() { self.Time(e, time, text) },1000) } } ,Import : function() { var self = this; var include = $("include"); var count = include.length-1; if (include.length) { include.each(function(i){ var dom = $(this); var system = dom.attr('system'); var path = dom.attr('path'); var name = dom.attr('file'); var file = ''; if(path) file = path; if(system) file = file + '/' + system; file += name + '.html'; dom.load(file, function(){ $("html").find("include").eq(i).get(0).outerHTML = dom.html(); if (i == count) { self.Template().Init(); } }); }) } else { self.Template().Init(); } } ,LoadPage : function() { if ($('.dever-loadpage').length) { $('.dever-loadpage').each(function() { var url = $(this).attr('dever-url'); var self = $(this); $.getJSON(Dever.CallUrl(url), function(t) { self.html(t.msg); _Dever_Page.Ajax(self); }); }); } } ,CallUrl : function(url) { if (url.indexOf('callback') == -1) { if (url.indexOf('=') != -1) { url += '&json=1&callback=?'; } else { url += '?json=1&callback=?'; } } return url; } ,Change : function() { if ($('.dever-change').length) { $('.dever-change').change(function() { Dever.Jump($(this).attr('dever-change')+$(this).val()); }); //$('.dever-change').val($('.dever-change').attr('dever-value')); } } ,Host : function(host, uri, state) { var result = ''; uri = uri ? uri : ''; if (state) { result = config.host.replace('www', host); } else { result = config.host; } result = result.replace('main', host); if (config.proxy) { return this.Proxy(host + '/' + uri); } return result + uri; } // 输出数据,提示框 ,Out : function(content, callback, title) { if (content && content.indexOf('登录') != -1 && $("#login_url").length) { var href = $("#login_url").val(); location.href = href; return; } else { if (callback) { callback = {'yes':callback, 'no':callback}; } if (this.modal) { this.modal.Alert(content, callback, title); } else { this.Modal().Alert(content, callback, title); } } } // 将数据解析,并进行下一步操作 ,Msg : function(result, error_callback, success_callback) { if (result.status == 2) { if (result.data) { if (result.data.element) { if (result.data.attr) { $(result.data.element).attr(result.data.attr, result.data.value); } else { $(result.data.element).val(result.data.value); } } else if (result.data.url) { location.href = result.data.url; } } if (error_callback) { return error_callback(result.msg); } this.Out(result.msg); } else { if (typeof(result.data) != 'object') { result.msg = result.data; } if (success_callback) { return success_callback(result.msg); } if (result.msg.indexOf('http://') != -1) { var self = this; if (result.msg.indexOf('||') != -1) { var temp = result.msg.split('||'); result.msg = temp[0]; result.data = temp[1]; this.Out(result.data, function() { self.Jump(result.msg); }); } else { self.Jump(result.msg); } } else if (parseInt(result.msg) > 0) { this.Out('操作成功', function() { location.reload(); }); } else { this.Out(result.msg); } } } ,Confirm : function(content, callback, title) { if (this.modal) { this.modal.Confirm(content, {'yes':callback}, title); } else { this.Modal().Confirm(content, {'yes':callback}, title); } } ,Extend : function() { Array.prototype.indexIn = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] == val) return i; } return -1; }; Array.prototype.remove = function(val) { var index = this.indexIn(val); if (index > -1) { this.splice(index, 1); } }; /* $("select option").each(function() { if ($(this).attr('select') && $(this).attr('select') == 'true') { $(this).attr('selected', 'true'); } else { $(this).removeAttr('selected'); } });*/ } ,Ucfirst : function(str) { var str = str.toLowerCase(); var strarr = str.split(' '); var result = ''; for (var i in strarr){ result += strarr[i].substring(0,1).toUpperCase()+strarr[i].substring(1)+' '; } return result; } }; //瀑布流分页 var _Dever_Page = { name : '', loading : '', button : '', state :false, Init : function() { if ($(this.name).length) { var self = this; if (navigator.userAgent.match(/mobile/i)) { $(window).scroll(function() { if ($(window).scrollTop() >= $(document).height() - $(window).height()) { self.Start(self.name, self.loading); } }); } if (self.button && $(self.button).length) { $(self.button).click(function() { self.Start(); }) } } } ,Start : function(page, loading) { page = page ? page : this.name; loading = loading ? loading : this.loading; if ($(page).length) { $(page).hide(); var url = $(page).attr('dever-page-link'); if (url) { var key = $(page).attr('dever-page-list'); if ($(loading).length) { $(loading).show(); } var self = this; if (self.state) { return; } self.state = true; $.get(url, function(t) { self.state = false; t = '
' + t + '
'; var c = $(t).find(key).html(); if ($(loading).length) { $(loading).hide(); } if (self.button && $(self.button).length) { var button = $(t).find(self.button).attr('dever-show'); if (button == 2) { $(self.button).hide(); } } if (c) { $(key).append(c); var l = $(t).find(page).attr('dever-page-link'); $(page).attr('dever-page-link', l); //Dever.Init(); var callback = $(page).attr('dever-page-call'); if (callback) { eval(callback); } } }); } } } ,Ajax : function(e) { var self = this; e.find('a').each(function() { var url = $(this).attr('href'); $(this).attr('href', 'javascript:;'); $(this).unbind('click').bind('click', function() { $.get(url.replace('callback', ''), function(t) { e.html(t); self.Ajax(e); }); }); }); } } //模态框 非静态类 var _Dever_Modal = function() { var self = this; self.state = false; self.html = ''; self.box = ''; self.title = ''; self.content = ''; self.yes = ''; self.no = ''; self.setting = ''; self.confirm = ''; self.open = false; self.Init = function() { this.state = false; if (this.html) { $('body').append(this.html); } if (this.box && this.content) { this.box = $(this.box); if (this.box.length) { this.box.hide(); this.content = $(this.content); if(this.title) this.title = $(this.title); if(this.yes) this.yes = $(this.yes); if(this.no) this.no = $(this.no); if(this.setting) this.setting = $(this.setting); if(this.confirm) this.confirm = $(this.confirm); if(!this.timeout) this.timeout = 3000; this.state = true; } } }; self.Alert = function(content, callback, title) { if (self.open == true) { return; } self.open = true; if (this.state == false) { alert(content); if (callback) { callback.yes(); } } else { if (this.setting.length && this.setting.html()) { if (this.confirm) this.confirm.hide(); this.setting.show(); } else { if (this.setting) this.setting.hide(); if (this.confirm) this.confirm.show(); } this.content.html(content); if (title) { this.title.html(title); } this.box.show(); if (this.yes && callback.yes) { this.Bind(callback); } else { this.TimeOut(callback); } } }; self.Confirm = function(content, callback, title) { if (self.open == true) { return; } self.open = true; if (this.state == false) { if (confirm(content)) { callback.yes(); } } else { if (this.confirm) this.confirm.show(); if (this.setting) this.setting.hide(); this.content.html(content); if (title) { this.title.html(title); } this.box.show(); if (callback.yes) { this.Bind(callback); } } } self.Bind = function(callback) { if (this.yes.length && callback.yes) { this.yes.unbind('click').bind('click', callback.yes); } if (this.no.length) { if (callback.no) { this.no.unbind('click').bind('click', callback.no); } else { var self = this; this.no.unbind('click').bind('click', function() { self.Close(); }); } } }; self.TimeOut = function(callback) { var self = this; setTimeout(function() { if (callback && callback.yes) { callback.yes(); } else { self.Close(); } }, self.timeout); } self.Close = function() { this.open = false; this.box.hide(); } return self; }; //用户相关 静态类 var _Dever_User = { config : [], uid : -1, name : '匿名用户', //按钮不可点击的样式 disable : '', Init : function() { var self = this; if (this.config.click) { for (var i in this.config.click) { var e = self.config.click[i]; var c = 1; if (e.indexOf('|') != -1) { var t = e.split('|'); e = t[0]; c = 2; } var e = $(e); if (e.length) { e.attr('data-i', i); e.attr('data-c', c); if (self.disable) { e.addClass(self.disable); self.DisableCheck(e); } else { self.Bind(e); } } } } } ,Bind : function(e) { var self = this; e.unbind('click').bind('click', function() { if ($(this).attr('data-c') == 2) { Dever.Confirm(function() { self.Save($(this), config); }); } else { self.Save($(this), config); } }); } ,DisableCheck : function(e) { var self = this; var key = e.attr('data-i'); var config = self.config[key]; var callback = function(msg,state) { e.addClass(self.disable); } var blur = function() { var send = self.Check(e, callback, config); if (!send) { e.addClass(self.disable); return; } e.removeClass(self.disable); self.Bind(e); } var send = self.Check(e, callback, config, blur); if (!send) { callback(config.error); return; } e.removeClass(self.disable); self.Bind(e); } ,Check : function(e, callback, config, blur) { var self = this; var send = {}; if (typeof(config.input) != 'undefined') { if (typeof(config.input) == 'string' && config.input == 'parent') { if (e.attr('dever-send')) { send[e.attr('dever-send')] = e.attr('dever-' + e.attr('dever-send')); } send.id = e.attr('dever-id'); send.value = e.parent().find('input').val(); if (!send.id || !send.value) { callback(config.error); return false; } } else if (typeof(config.input) == 'string' && config.input == 'click') { if (e.attr('dever-send')) { var a = e.attr('dever-send').split('&'); for (var i in a) { if (typeof(a[i]) == 'string') { var b = a[i].split('='); send[b[0]] = b[1]; } } } } else if (typeof(config.input) == 'object') { if (blur) { for (var i in config.input) { var input = config.input[i]; if (typeof(input) == 'string') { if (input.indexOf('|') != -1) { var t = input.split('|'); input = t[0]; } var el = $(input); el.on('input',function() { blur(); }); el.blur(function() { blur(); }); } } } for (var i in config.input) { var option = false; var input = config.input[i]; if (typeof(input) == 'object' || typeof(input) == 'function') { send[i] = input(); } else { var select = []; if (input.indexOf('|') != -1) { var t = input.split('|'); input = t[0]; option = true; if (t[1]) { select = t; } } var el = $(input); //e.get(0).tagName == 'TEXTAREA' send[i] = el.val(); if (option == false) { state = self.Match(el, send[i], callback, config); if (!state) { return state; } } else if(select) { //只要有一个为真即可 var result = false; if (select.length <= 0) { result = true; } for (var i in select) { if (typeof(select[i]) == 'string') { var el = $(select[i]); state = self.Match($(el), $(el).val(), false, config); if (state) { result = true; } } } if (result == false) { return result; } } } } } } return send; } ,Match : function(e, value, callback, config) { var m = true; if (value && e.attr('dever-match')) { var r = new RegExp(e.attr('dever-match')); m = r.test(value); } if (value && e.attr('dever-value')) { m = $(e.attr('dever-value')).val() == value; } if (!value || m != true) { if (callback) { var error = e.attr('dever-error') ? e.attr('dever-error') : config.error; callback(error); } return false; } return true; } //通用的保存数据功能 ,Save : function(e, setting) { var self = this; var key = e.attr('data-i'); var config = self.config[key]; if (config.start) { config.start.call(); } var callback = function(msg,state) { if (config.status && $(config.status).length) { //$(config.status).html(msg).css('visibility','initial'); state ? $(config.status).html(msg).hide() : $(config.status).html(msg).show(); } else if(!state) { Dever.Out(msg); } } var send = self.Check(e, callback, config); if (!send) { //callback(config.error); return; } if (!config.url) { config.url = e.attr('dever-send'); } if (e.attr('dever-refresh')) { config.url = e.attr('dever-refresh'); } callback(1,1); config.url = Dever.CallUrl(config.url); if (setting.proxy) { $.post(config.url, send, function(t) { t = eval('(' + t + ')'); Dever.Msg(t, callback, (config.callback ? function(msg){config.callback(e,msg,t)} : false)); }); } else { $.getJSON(config.url, send, function(t) { Dever.Msg(t, callback, (config.callback ? function(msg){config.callback(e,msg,t)} : false)); }); } } }; //编辑器相关 var _Dever_Editor = { state : false, editors : [], Init : function() { if (typeof marked == 'function') { this.state = true; } else { this.state = false; } this.SetMark(); var self = this; if ($('.dever-note').length) { $('.dever-note').each(function() { self.InitEditor($(this)); }) } } ,InitEditor : function(e) { var id = e.attr('id'); var key = e.attr('key'); if (config.uid && config.uid > 0) { var toolbar = [ 'title' ,'bold' ,'italic' ,'underline' ,'strikethrough' ,'fontScale' ,'color' ,'ol' ,'ul' ,'blockquote' ,'code' ,'table' ,'link' ,'image' ,'hr' ,'indent' ,'outdent' ,'alignment' //,'emoji' ]; } else { var toolbar = [ 'title' ,'bold' ,'fontScale' ,'color' ,'ol' ,'ul' ,'blockquote' ,'indent' ,'outdent' ,'alignment' ]; } if (typeof(this.editors[id]) == "undefined") { this.editors[id] = new Simditor({ textarea: e, upload: { url: config.upload + '.simditor', params: {key:key}, fileKey: 'file', connectionCount: 10, leaveConfirm: 'Uploading is in progress, are you sure to leave this page?' }, toolbar : toolbar /* ,emoji: { imagePath: config.lib + 'simditor/plugins/emoji/images/emoji/' } */ }); } } ,SetMark : function() { return; } ,GetMark : function(content) { if (this.state == true) { return marked(content); } return content; } }; //模板 var _Dever_Template = { state : false, method : '', element : '', data : '', param : '', attr : '', Init : function() { if (this.Check()) { var url = config.proxyTemplateUrl; var send = {}; var parsing = []; $("dever").each(function(){ parsing.push($(this).html()); $(this).remove(); }); send.url = location.href; send.parsing = parsing.join(''); send.html = $("html").html(); //$("html").html('dever template loading...'); $.ajax({ type: "POST", url: url, data: send, dataType: "json", success: function(result){ $("html").html(result.data); } }); } } ,Check : function() { if ($("dever").length) { this.state = true; } else { this.state = false; } return this.state; } } //上传 请载入layui var _Dever_Upload = { upload : [], upload_file : [], upload_pic : [], callback : {}, Init : function() { var self = this; if ($(".dever-upload-drag").length) { $(".dever-upload-drag").each(function() { var key = $(this).attr('key'); if (config.proxy) { var url = Dever.Proxy('upload/save.drag') + '&key=' + key; } else { var url = config.upload + '.drag?key='+ key; } $(this).inlineattachment({ uploadUrl: url, progressText: '![文件上传中...]()', urlText: "![文件描述]({filename})\n", errorText: '上传失败' }); }); } if ($(".dever-upload").length) { $(".dever-upload").each(function(i) { self.Load(i,$(this)); }) } } ,Load : function(i,e) { var self = this; var id = e.attr('id'); var value = e.attr('dever-upload-value'); var key = e.attr('dever-upload-key'); var pic = e.attr('dever-upload-pic'); var type = e.attr('dever-upload-type'); var callback = e.attr('dever-upload-callback'); var input = $("#" + value); if (!input.length) { return; } var url = config.upload + '.start'; if (typeof(this.upload[value]) != "undefined") { return; } if (!key) { key = 1; } self.upload[value] = true; self.upload_pic[value] = []; self.upload_file[value] = []; var input_value = input.val(); if (input_value && type == 'mul') { var input_value_array = input_value.split(','); for (var i in input_value_array) { self.Set(type, e, input, value, callback, input_value_array[i]); } } layui.use(['upload','layer'], function() { var layer = layui.layer; var layuiUpload = layui.upload; var uploadInst = layuiUpload.render({ elem: '#' + id ,data: {'key' : key} ,field: 'file' ,url: url ,multiple: true ,xhr:xhrOnProgress ,before: function(obj) { layer.load(); } ,done: function(data) { layer.closeAll('loading'); if (data.status == 1) { self.Set(type, e, input, value, callback, data.url, pic); } else { layer.msg(data.msg, {icon: 4}); return false; } } ,error: function() { layer.closeAll('loading'); layer.msg('上传失败', {icon: 4}); return false; } }); }); } ,Set : function(type, e, input, value, callback, url, pic) { if (type == 'mul') { this.SetMul(e, input, value, callback, url); } else { this.SetOne(e, input, value, callback, url, pic); } } ,SetOne : function(e, input, value, callback, url, pic) { var html = ''; if (this.callback && this.callback[callback]) { html = this.callback[callback].call(this, e, url, 'dever-upload-close'); } else { pic = $("#" + pic); if (pic.length) { pic.attr('src', url).show(); } else { html = ''; } } if (html) { e.html(html); } var input_value = input.val(); if (input_value != url) { input.val(url); this.Blur(input); } } ,SetMul : function(e, input, value, callback, url) { var html = ''; var input_value = input.val(); if (this.upload_pic[value].length <= 0 && input_value) { this.upload_pic[value] = input_value.split(','); } if (this.callback && this.callback[callback]) { html += this.callback[callback].call(this, e, url, 'dever-upload-close'); } else { html += '
  • '; } if (html) { e.before(html); } this.Close(value); if (input_value.indexOf(url) == -1) { this.upload_pic[value].push(url); input.val(this.upload_pic[value].join(',')); this.Blur(input); } } ,Blur : function(input) { var events = $._data(input[0], 'events'); if (events && events["blur"]) { input.blur(); } } ,Close : function(v) { var self = this; $('.dever-upload-close').each(function() { $(this).unbind('click').bind('click', function() { var e = $(this).parent(); var p = e.find('img').attr('src'); e.remove(); self.upload_pic[v].remove(p); $("#" + v).val(self.upload_pic[v].join(',')); }); }); } } var _Dever_Emoji = { Init : function() { var self = this; if ($('.dever-emoji').length) { $('.dever-emoji').each(function() { self.Get($(this), $(this).html()); }) } } ,Get : function(e, content) { var handle = function() { e.html(twemoji.parse(content)).show(200); }; if (typeof jEmoji != 'object') { $.getScript('//twemoji.maxcdn.com/2/twemoji.min.js?11.4', function() { /* $("head").append(""); var css = $("head").children(":last"); css.attr({ rel: "stylesheet", type: "text/css", href: config.script + '/lib/emoji/emoji.css' }); */ return handle(); }); } else { return handle(); } } } //创建监听函数 var xhrOnProgress=function(fun) { xhrOnProgress.onprogress = fun; //绑定监听 //使用闭包实现监听绑 return function() { //通过$.ajaxSettings.xhr();获得XMLHttpRequest对象 var xhr = $.ajaxSettings.xhr(); //判断监听函数是否为函数 if (typeof xhrOnProgress.onprogress !== 'function') return xhr; //如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去 if (xhrOnProgress.onprogress && xhr.upload) { xhr.upload.onprogress = xhrOnProgress.onprogress; } return xhr; } }