common.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895
  1. var web = {};
  2. var btns = [];
  3. var dictMap = {};
  4. var paramMap = {};
  5. var loginuser = {};
  6. $(document).ready(function () {
  7. //按钮权限
  8. if (web.getUrlVars("menuId")) {
  9. $.post(base + "/sysRoleBtn/getRoleBtns", {menuId: web.getUrlVars("menuId")}, function (json) {
  10. if (json.data) {
  11. $.each(json.data, function (id, item) {
  12. btns.push(item.btn_code);
  13. });
  14. web.hideBtns();
  15. }
  16. });
  17. } else {
  18. btns=parent.btns;
  19. web.hideBtns();
  20. }
  21. //查询-更多
  22. $('#btn-more').on('click', function (e) {
  23. $('.query-more').toggle();
  24. if ($('.query-more').css('display') == 'none') {
  25. $(this).html('更多');
  26. } else {
  27. $(this).html('隐藏');
  28. }
  29. });
  30. //table 双击单击添加样式
  31. $(".layui-table").on('dblclick','tr',function(){
  32. $(this).addClass("selected");
  33. $(this).siblings().removeClass("selected");
  34. });
  35. $(".layui-table").on('click','tr',function(){
  36. $(this).addClass("selected");
  37. $(this).siblings().removeClass("selected");
  38. });
  39. $(".layui-colla-content .form-group:last").css("margin-bottom","0");
  40. });
  41. /**
  42. * DataTable公用属性
  43. */
  44. $.extend(true,$.fn.dataTable.defaults, {
  45. "dom": '<"top">rt<"bottom"flip><"clear">',
  46. "autoWidth": true, // 自适应宽度
  47. "stateSave": true, // 刷新后保存页数
  48. "ordering" :false,
  49. "searching": false, // 本地搜索
  50. "info": true, // 控制是否显示表格左下角的信息
  51. "stripeClasses": ["odd", "even"], // 为奇偶行加上样式,兼容不支持CSS伪类的场合
  52. "pagingType": "simple_numbers", // 分页样式 simple,simple_numbers,full,full_numbers
  53. "language": { // 国际化
  54. "url":base+'/static/web/frame/jquery/language.json'
  55. },
  56. "serverSide":true, //开启服务器模式
  57. "deferRender": true, // 当处理大数据时,延迟渲染数据,有效提高Datatables处理能力
  58. "sServerMethod" : "POST"
  59. });
  60. /**
  61. * form赋值
  62. */
  63. web.toForm = function (form,data) {
  64. if(data){
  65. $.each(data,function(key,value){
  66. if($('#'+key)){
  67. $('#'+key).val(web.nullToSpace(value));
  68. }
  69. });
  70. }
  71. form.render('select');
  72. }
  73. /**
  74. * flag 当子窗口取不到是否不取父窗口的值,默认取父窗口
  75. */
  76. web.getUrlVars = function (name, flag) {
  77. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  78. var r = window.location.search.substr(1).match(reg);
  79. //modify by zhengwei
  80. if (flag) {
  81. if (r == null) {
  82. r = window.parent.location.search.substr(1).match(reg);
  83. }
  84. }
  85. if (r != null) return decodeURI(r[2]);
  86. return null;
  87. };
  88. //把null转为空
  89. web.nullToSpace = function (param) {
  90. if (param == null || typeof param == 'undefined') {
  91. param = '';
  92. }
  93. return param;
  94. }
  95. //ajax post
  96. web.ajaxPost = function (url, params, callback) {
  97. var index = null;
  98. return $.ajax({
  99. type: "POST",
  100. url: url,
  101. data: params,
  102. dataType: "json",
  103. timeout: 10000,
  104. beforeSend: function () {
  105. index = layer.load("加载中...");
  106. },
  107. success: function (data) {
  108. if (index) {
  109. layer.close(index);
  110. }
  111. if (typeof callback == 'function') {
  112. callback(data);
  113. }
  114. },
  115. error: function (XMLHttpRequest, textStatus, errorThrown) {
  116. if (index) {
  117. layer.close(index);
  118. }
  119. if (XMLHttpRequest.responseText && XMLHttpRequest.responseText.indexOf("<!DOCTYPE html>") != -1) {
  120. layer.confirm('登录超时,请重新登录', {
  121. btn: ['确定', '取消'] //按钮
  122. }, function () {
  123. location.href = base + "/admin";
  124. });
  125. } else {
  126. switch (XMLHttpRequest.status) {
  127. case(500):
  128. layer.msg("服务异常");
  129. break;
  130. case(408):
  131. layer.msg("请求超时");
  132. break;
  133. case(403):
  134. layer.msg("无权限执行此操作");
  135. break;
  136. case(0):
  137. layer.msg("网络连接异常");
  138. break;
  139. default:
  140. layer.msg("请求失败,请联系管理人员");
  141. }
  142. }
  143. },
  144. complete: function (XHR, TS) {
  145. XHR = null;
  146. }
  147. });
  148. };
  149. //保留两位小数
  150. web.toDecimal = function (x) {
  151. var f = parseFloat(x);
  152. if (isNaN(f)) {
  153. return;
  154. }
  155. f = Math.round(x * 100) / 100;
  156. return f;
  157. }
  158. //table 获取选中Ids
  159. web.getIds = function (o, str) {
  160. var obj = o.find('tbody tr td:first-child input[type="checkbox"]:checked');
  161. var list = [];
  162. obj.each(function (index, elem) {
  163. list.push($(elem).attr(str));
  164. });
  165. return list;
  166. }
  167. //table 获取当前页Ids
  168. web.getAllIds = function (o, str) {
  169. var obj = o.find('tbody tr td:first-child input[type="checkbox"]');
  170. var list = [];
  171. obj.each(function (index, elem) {
  172. list.push($(elem).attr(str));
  173. });
  174. return list;
  175. }
  176. //table 获取选中行数据
  177. web.getRows = function (table, o) {
  178. var obj = o.find('tbody tr td:first-child input[type="checkbox"]:checked');
  179. var list = [];
  180. obj.each(function (index, elem) {
  181. list.push(table.row($(elem).parents("tr")).data());
  182. });
  183. return list;
  184. }
  185. // table rows获取指定属性值集合
  186. web.getPropValueFromRows = function (rows, fieldName) {
  187. var data = [];
  188. for (var i = 0; i < rows.length; i++) {
  189. data.push(rows[i][fieldName]);
  190. }
  191. return data;
  192. };
  193. //table 按钮权限
  194. web.hideTableBtns = function (table) {
  195. $("" + table + " a").each(function (i) {
  196. if ($(this).attr("code")) {
  197. if (!btns.contains($(this).attr("code"))) {
  198. $(this).remove();
  199. }
  200. }
  201. });
  202. }
  203. //按钮权限
  204. web.hideBtns = function () {
  205. $(".layui-btn").each(function (i) {
  206. if ($(this).attr("code")) {
  207. if (!btns.contains($(this).attr("code"))) {
  208. if($(this).parent().children().length==1){
  209. $(this).parent().remove();
  210. }else{
  211. $(this).remove();
  212. }
  213. }
  214. }
  215. });
  216. }
  217. //日期格式化
  218. Date.prototype.format = function (fmt) {
  219. var o = {
  220. "M+": this.getMonth() + 1, //月份
  221. "d+": this.getDate(), //日
  222. "h+": this.getHours(), //小时
  223. "m+": this.getMinutes(), //分
  224. "s+": this.getSeconds(), //秒
  225. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  226. "S": this.getMilliseconds() //毫秒
  227. };
  228. if (/(y+)/.test(fmt))
  229. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  230. for (var k in o)
  231. if (new RegExp("(" + k + ")").test(fmt))
  232. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  233. return fmt;
  234. }
  235. //数组移除
  236. Array.prototype.removeAt = function (Index) {
  237. if (isNaN(Index) || Index > this.length) {
  238. return false;
  239. }
  240. for (var i = 0, n = 0; i < this.length; i++) {
  241. if (this[i] != this[Index]) {
  242. this[n++] = this[i]
  243. }
  244. }
  245. this.length -= 1
  246. }
  247. //数组是否包含某项
  248. Array.prototype.contains = function (needle) {
  249. for (i in this) {
  250. if (this[i] == needle)
  251. return true;
  252. }
  253. return false;
  254. }
  255. /**
  256. * 根据字典类型获取items
  257. * @param d_key
  258. * @returns
  259. */
  260. web.getDictMap = function (key) {
  261. if (dictMap[key]) {
  262. return dictMap[key];
  263. }
  264. };
  265. /**
  266. * 根据系统参数
  267. * @param code
  268. * @returns
  269. */
  270. web.getParam = function (code) {
  271. if (paramMap[code]) {
  272. return paramMap[code];
  273. } else {
  274. return "";
  275. }
  276. };
  277. /**
  278. * 根据代码和字典类型获取下拉选项的名称item{value:'1',label:'测试'}
  279. * @param d_key
  280. * @param code
  281. * @returns
  282. */
  283. web.getDictVal = function (key, code) {
  284. var items = dictMap[key];
  285. if (items && items.length > 0) {
  286. for (var i = 0; i < items.length; i++) {
  287. item = items[i];
  288. if (item.dict_code == code) {
  289. return item.dict_name;
  290. break;
  291. }
  292. }
  293. }
  294. return "";
  295. }
  296. /**
  297. * 弹出框 弹出界面必须包含 data
  298. * @param url
  299. * @param title
  300. * @param width
  301. * @param hight
  302. * @param id
  303. * @param name
  304. * @param callback
  305. * @returns
  306. */
  307. web.popWin = function (url, title, width, hight,callback,flag) {
  308. layer.open({
  309. title: [title],
  310. type: 2,
  311. content: url,
  312. area: [width + 'px', hight + 'px'],
  313. shade: 0.4,
  314. skin: 'layer-popup',
  315. btn: ['确定', '关闭'],
  316. yes: function (index) {
  317. var res = window["layui-layer-iframe" + index].getData();
  318. if(!res){
  319. layer.msg("请选择记录");
  320. return;
  321. }
  322. if(res.length<1){
  323. layer.msg("请选择记录");
  324. return;
  325. }
  326. if(!flag&&res.length!=1){
  327. layer.msg("只能选择一条记录")
  328. return;
  329. }
  330. if (typeof callback === 'function') {
  331. if(!flag){
  332. callback(res[0]);
  333. }else{
  334. callback(res);
  335. }
  336. }
  337. layer.close(index);
  338. }
  339. });
  340. }
  341. /**
  342. * 设置复选框的值
  343. */
  344. web.setCheckBoxVal = function (id, v) {
  345. var obj = document.getElementById(id);
  346. if (obj) {
  347. obj.checked = v;
  348. }
  349. }
  350. /**
  351. * 获取复选框的值
  352. */
  353. web.getCheckBoxVal = function (id) {
  354. var obj = document.getElementById(id);
  355. if (obj && obj.checked) {
  356. return 1;
  357. } else {
  358. return 0;
  359. }
  360. }
  361. //日期区间
  362. web.daterange = function (laydate,startFieldId, endFieldId, format) {
  363. var start = {
  364. elem: '#'+startFieldId,
  365. trigger: 'click',
  366. done: function(value, date){
  367. end.min = value; //开始日选好后,重置结束日的最小日期
  368. }
  369. };
  370. laydate.render(start);
  371. var end = {
  372. elem: '#'+endFieldId,
  373. trigger: 'click',
  374. done: function(value, date){
  375. start.max = value; //结束日选好后,重置开始日的最大日期
  376. }
  377. };
  378. laydate.render(end);
  379. }
  380. //下拉选择树
  381. //objId 点击的inputID
  382. //treeId 树形ID
  383. //url 获取数据url地址
  384. //params 参数
  385. //check 是否多选
  386. web.treeSelect = function (objId, treeId, url,params,check) {
  387. $('#'+objId+'').on('click',function(){
  388. var obj = $(this);
  389. var objOffset = $(this).offset();
  390. var setting = {
  391. check: {
  392. enable: check,
  393. chkboxType: {"Y":"", "N":""}
  394. },
  395. data: {
  396. simpleData: {
  397. enable: true
  398. }
  399. },
  400. view: {
  401. showIcon: false,
  402. showLine: false
  403. },
  404. callback: {
  405. onCheck: onCheck,
  406. onClick: zTreeOnClick
  407. }
  408. };
  409. //判断树是否要重新加载
  410. if($('#'+treeId+' li').length>0){
  411. $('#'+treeId+'').parent().css({left:objOffset.left + "px", top:objOffset.top + obj.outerHeight() + "px"}).slideDown("fast");
  412. $(document).bind("mousedown", onBodyDown);
  413. }else{
  414. web.ajaxPost(base+url,params,function(json){
  415. $.fn.zTree.init($('#'+treeId+''), setting, json.data);
  416. $('#'+treeId+'').parent().css({left:objOffset.left + "px", top:objOffset.top + obj.outerHeight() + "px"}).slideDown("fast");
  417. $(document).bind("mousedown", onBodyDown);
  418. });
  419. }
  420. function onBodyDown(event) {
  421. if (!(event.target.id == obj.id || event.target.id == $('#'+treeId+'').parent().id || $(event.target).parents(".treeContent").length>0)) {
  422. hideMenu();
  423. }
  424. }
  425. //选择事件
  426. function onCheck(e, treeId, treeNode) {
  427. var zTree = $.fn.zTree.getZTreeObj(treeId),
  428. nodes = zTree.getCheckedNodes(true),
  429. n = "";
  430. v = "";
  431. for (var i=0, l=nodes.length; i<l; i++) {
  432. n += nodes[i].name + ",";
  433. v += nodes[i].id + ",";
  434. }
  435. if (n.length > 0 ) n = n.substring(0, n.length-1);
  436. if (v.length > 0 ) v = v.substring(0, v.length-1);
  437. $('#'+objId+'').val(n);
  438. $('#'+objId+'').siblings("input[type=hidden]").val(v);
  439. }
  440. //树点击事件
  441. function zTreeOnClick(event, treeId, treeNode) {
  442. if(check){
  443. return;
  444. }
  445. var zTree = $.fn.zTree.getZTreeObj(treeId),
  446. nodes = zTree.getSelectedNodes(),
  447. n = "";
  448. v = "";
  449. nodes.sort(function compare(a,b){return a.id-b.id;});
  450. for (var i=0, l=nodes.length; i<l; i++) {
  451. n += nodes[i].name + ",";
  452. v += nodes[i].id + ",";
  453. }
  454. if (n.length > 0 ) n = n.substring(0, n.length-1);
  455. if (v.length > 0 ) v = v.substring(0, v.length-1);
  456. $('#'+objId+'').val(n);
  457. $('#'+objId+'').siblings("input[type=hidden]").val(v);
  458. hideMenu();
  459. };
  460. //隐藏树
  461. function hideMenu() {
  462. $('#'+treeId+'').parent().fadeOut("fast");
  463. $(document).unbind("mousedown", onBodyDown);
  464. }
  465. });
  466. }
  467. /**
  468. * 设置行政区划选中器的值
  469. * @param addrselectorId 界面行政区划的Id
  470. * @param params 行政区划数组
  471. */
  472. web.setAddressSelectorValue = function (addrselectorId, params) {
  473. // 行政区划数组prams值如下:
  474. /* var address ={};
  475. address['provinceCode'] = '320000';
  476. address['provinceName'] = '江苏省';
  477. address['cityCode'] = '320900';
  478. address['cityName'] = '盐城市';
  479. address['countyCode'] = '320923';
  480. address['countyName'] = '阜宁县';
  481. */
  482. var addressSelect = '#' + addrselectorId;
  483. var $hideInputs = $(addressSelect).find('input:hidden').not('.em');
  484. if ($hideInputs) {
  485. $hideInputs.eq(0).val(params.provinceCode);
  486. $hideInputs.eq(1).val(params.provinceName);
  487. $hideInputs.eq(2).val(params.cityCode);
  488. $hideInputs.eq(3).val(params.cityName);
  489. $hideInputs.eq(4).val(params.countyCode);
  490. $hideInputs.eq(5).val(params.countyName);
  491. var $dd = $(addressSelect).find('dd'), $provinceName = $hideInputs.eq(1),
  492. $cityName = $hideInputs.eq(3), $countyCode = $hideInputs.eq(4), $countyName = $hideInputs.eq(5);
  493. var addrTxt = '';
  494. // 获取显示的标签的地址
  495. if ($provinceName.val() == $cityName.val()) {
  496. addrTxt = $provinceName.val();
  497. } else {
  498. addrTxt = $provinceName.val() + $cityName.val();
  499. }
  500. if ($countyName.val()) {
  501. addrTxt += $countyName.val();
  502. }
  503. // 填充回显的地址
  504. $(addressSelect).find('.em').val(addrTxt);
  505. }
  506. }
  507. web.fileUploader = function(filePicker,callback,options,params){
  508. //添加删除事件结束
  509. var imgUploadUrl = base+'/common/upload';
  510. if(typeof params!='undefined'){
  511. imgUploadUrl = imgUploadUrl+"?"+params;
  512. }
  513. var opt={
  514. auto: true,
  515. // swf文件路径
  516. swf: base+'/static/frame/webuploader/Uploader.swf',
  517. // 文件接收服务端。
  518. server : imgUploadUrl,
  519. // 内部根据当前运行是创建,可能是input元素,也可能是flash.
  520. pick : {
  521. id : '#'+filePicker,
  522. multiple : false
  523. },
  524. //fileSingleSizeLimit: 5*1024*1024, //最大5M
  525. // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
  526. resize : false,
  527. multiple : false,
  528. duplicate :true
  529. };
  530. if(typeof options!='undefined'){
  531. opt = $.extend(opt,options);
  532. }
  533. var uploader = WebUploader.create(opt);
  534. // 文件上传过程中提示。
  535. uploader.on( 'uploadProgress', function( file, percentage ) {
  536. //layer.msg
  537. });
  538. uploader.on( 'uploadError', function( file ) {
  539. layer.msg("上传失败");
  540. uploader.reset();
  541. });
  542. uploader.onError = function( code ) {
  543. switch(code){
  544. case 'F_EXCEED_SIZE':
  545. layer.msg('文件大小超出最大值');
  546. break;
  547. case 'Q_EXCEED_NUM_LIMIT':
  548. layer.msg('超过最大上传数量');
  549. break;
  550. case 'Q_EXCEED_SIZE_LIMIT':
  551. layer.msg('文件大小超出最大值');
  552. break;
  553. case 'Q_TYPE_DENIED':
  554. layer.msg('文件类型不允许');
  555. break;
  556. default:
  557. layer.msg('未知错误:'+code);
  558. break;
  559. }
  560. };
  561. //如果服务器端返回的code不为0,那么也是没有成功,会触发uploadError事件
  562. uploader.on("uploadAccept", function(file,data){
  563. if(!data.success){
  564. return false;
  565. }
  566. });
  567. // 文件上传成功,给item添加成功class, 用样式标记上传成功。
  568. uploader.on( 'uploadSuccess', function(file,data) {
  569. if(typeof callback=='function'){
  570. callback(data);
  571. }
  572. uploader.reset();
  573. });
  574. // 完成上传完了,成功或者失败,先删除进度条。
  575. uploader.on( 'uploadComplete', function(file,data) {
  576. });
  577. }
  578. /**
  579. * 图片预览
  580. * @param data 数组类型或者字符串
  581. */
  582. web.showImage = function (data,index) {
  583. if(!index){
  584. index=0;
  585. }
  586. var photos=[];
  587. if(typeof(data) == "string"){
  588. var obj = new Object();
  589. obj.src=data;
  590. photos.push(obj);
  591. }else{
  592. $.each(data,function(id,item){
  593. var obj = new Object();
  594. obj.src=item;
  595. photos.push(obj);
  596. });
  597. }
  598. layer.photos({
  599. photos: {
  600. "start": index,
  601. "data": photos
  602. }
  603. });
  604. }
  605. /**
  606. * 加载图片
  607. * @param fileList 容器ID
  608. * @param data 数组类型或者字符串
  609. * @param width 图片宽度
  610. * @param height 图片高度
  611. */
  612. web.loadImage = function(fileList,data,width,height,editFlag){
  613. if(!width){//如果没有设置,默认为100px
  614. width=100;
  615. }
  616. if(!height){
  617. height=100;
  618. }
  619. var $list = $('#'+fileList);
  620. var arr=[];
  621. if(typeof(data) == "string"){
  622. var $li = $(
  623. '<div class="file-item thumbnail">' +
  624. '<img src="'+data+'" style="width:'+width+'px;height:'+height+'px;">' +
  625. '</div>'
  626. );
  627. if(editFlag){
  628. var $btns = $('<div class="file-panel" style="height:0px;">' +
  629. '<span class="cancel">删除</span>' +
  630. '</div>').appendTo( $li );
  631. }
  632. arr.push(data);
  633. $list.append( $li );
  634. }else{
  635. $.each(data,function(id,item){
  636. if(typeof(item) == "string"){
  637. var $li = $(
  638. '<div class="file-item thumbnail">' +
  639. '<img src="'+item+'" style="width:'+width+'px;height:'+height+'px;">' +
  640. '</div>'
  641. );
  642. arr.push(item);
  643. }else{
  644. var $li = $(
  645. '<div class="file-item thumbnail">' +
  646. '<img src="'+item.imgUrl+'" style="width:'+width+'px;height:'+height+'px;">' +
  647. '<div class="info">"'+item.imgName+'"</div>' +
  648. '</div>'
  649. );
  650. arr.push(item.imgUrl);
  651. }
  652. if(editFlag){
  653. var $btns = $('<div class="file-panel" style="height:0px;">' +
  654. '<span class="cancel">删除</span>' +
  655. '</div>').appendTo( $li );
  656. }
  657. $list.append( $li );
  658. });
  659. }
  660. $list.find("img").on('click',function(){
  661. web.showImage(arr,$(this).parent().index());
  662. });
  663. }
  664. /**
  665. * 上传图片
  666. * @param fileList 容器ID
  667. * @param filePicker 上传按钮ID
  668. * @param callback 返回方法
  669. * @param options 自定义上传
  670. * @param params 参数
  671. */
  672. web.imageUploader = function(fileList,filePicker,callback,options,params){
  673. $('#'+fileList).on('mouseover','.file-item',function(){
  674. $(this).find('.file-panel').css('height','30px');
  675. });
  676. $('#'+fileList).on('mouseout','.file-item',function(){
  677. $(this).find('.file-panel').css('height','0');
  678. });
  679. $('#'+fileList).on('click','.cancel',function(){
  680. var obj = $(this);
  681. setTimeout(function () {
  682. $(obj).parents('.file-item').remove();
  683. },100);
  684. });
  685. //添加删除事件结束
  686. var imgUploadUrl = base+'/common/upload';
  687. if(typeof params!='undefined'){
  688. imgUploadUrl = imgUploadUrl+"?"+params;
  689. }
  690. var opt={
  691. auto: true,
  692. // swf文件路径
  693. swf: base+'/static/frame/webuploader/Uploader.swf',
  694. // 文件接收服务端。
  695. server : imgUploadUrl,
  696. // 内部根据当前运行是创建,可能是input元素,也可能是flash.
  697. pick : {
  698. id : '#'+filePicker,
  699. multiple : true
  700. },
  701. fileSingleSizeLimit: 5*1024*1024, //最大5M
  702. // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
  703. resize : false,
  704. duplicate :true,
  705. fileNumLimit:10,
  706. accept: {
  707. title: 'Images',
  708. extensions: 'gif,jpg,bmp,png',
  709. mimeTypes: 'image/*'
  710. }
  711. };
  712. if(typeof options!='undefined'){
  713. opt = $.extend(opt,options);
  714. }
  715. if(!opt.thumbnailWidth){//如果没有设置,默认为100px
  716. opt.thumbnailWidth=100;
  717. }
  718. if(!opt.thumbnailHeight){
  719. opt.thumbnailHeight=100;
  720. }
  721. var $list = $('#'+fileList);
  722. var uploader = WebUploader.create(opt);
  723. uploader.on( 'fileQueued', function( file ) {
  724. if($list.find('.file-item').length>=opt.maxLength){
  725. layer.msg('最多上传'+opt.maxLength+'张图片');
  726. uploader.cancelFile( file );
  727. return;
  728. }
  729. var $li = $(
  730. '<div id="' + file.id + '" class="file-item thumbnail">' +
  731. '<img>' +
  732. '<div class="info">' + file.name + '</div>' +
  733. '</div>'
  734. );
  735. var $img = $li.find('img');
  736. var $btns = $('<div class="file-panel" style="height:0px;">' +
  737. '<span class="cancel">删除</span>' +
  738. '</div>').appendTo( $li );
  739. // $list为容器jQuery实例
  740. if(opt.pick.multiple){
  741. $list.append( $li );
  742. }else{
  743. $list.html( $li );
  744. }
  745. // 创建缩略图
  746. // 如果为非图片文件,可以不用调用此方法。
  747. // thumbnailWidth x thumbnailHeight 为 100 x 100
  748. uploader.makeThumb( file, function( error, src ) {
  749. if ( error ) {
  750. $img.replaceWith('<span>不能预览</span>');
  751. return;
  752. }
  753. $img.attr( 'src', src );
  754. }, opt.thumbnailWidth, opt.thumbnailHeight);
  755. });
  756. // 文件上传过程中创建进度条实时显示。
  757. uploader.on( 'uploadProgress', function( file, percentage ) {
  758. var $li = $( '#'+file.id );
  759. var $percent = $li.find('.progress span');
  760. // 避免重复创建
  761. if ( !$percent.length ) {
  762. $percent = $('<p class="progress"><span></span></p>')
  763. .appendTo( $li )
  764. .find('span');
  765. }
  766. $percent.css( 'width', percentage * 100 + '%' );
  767. });
  768. uploader.on( 'uploadError', function( file ,reason) {
  769. var $li = $( '#'+file.id );
  770. var $error = $li.find('div.error');
  771. // 避免重复创建
  772. if ( !$error.length ) {
  773. $error = $('<div class="error"></div>').appendTo( $li );
  774. }
  775. $error.text('上传失败');
  776. });
  777. uploader.onError = function( code ) {
  778. switch(code){
  779. case 'F_EXCEED_SIZE':
  780. layer.msg('文件大小超出最大值');
  781. break;
  782. case 'Q_EXCEED_NUM_LIMIT':
  783. layer.msg('超过最大上传数量');
  784. break;
  785. case 'Q_EXCEED_SIZE_LIMIT':
  786. layer.msg('文件大小超出最大值');
  787. break;
  788. case 'Q_TYPE_DENIED':
  789. layer.msg('文件类型不允许');
  790. break;
  791. default:
  792. layer.msg('未知错误:'+code);
  793. break;
  794. }
  795. };
  796. //如果服务器端返回的code不为0,那么也是没有成功,会触发uploadError事件
  797. uploader.on("uploadAccept", function(file,data){
  798. if(!data.success){
  799. return false;
  800. }
  801. });
  802. // 文件上传成功,给item添加成功class, 用样式标记上传成功。
  803. uploader.on( 'uploadSuccess', function(file,data) {
  804. if(!opt.hideDoneImg){
  805. $( '#'+file.id ).addClass('upload-state-done');
  806. }
  807. if(typeof callback=='function'){
  808. callback(data);
  809. }
  810. });
  811. // 完成上传完了,成功或者失败,先删除进度条。
  812. uploader.on( 'uploadComplete', function(file,data) {
  813. $( '#'+file.id ).find('.progress').remove();
  814. });
  815. }
  816. $.fn.serializeObject = function() {
  817. var o = {};
  818. var a = this.serializeArray();
  819. $.each(a, function() {
  820. if (o[this.name] !== undefined) {
  821. if (!o[this.name].push) {
  822. o[this.name] = [o[this.name]];
  823. }
  824. o[this.name].push(this.value || '');
  825. } else {
  826. o[this.name] = this.value || '';
  827. }
  828. });
  829. return o;
  830. };
  831. web.num = function (obj){
  832. obj.value = obj.value.replace(/[^\d.]/g,""); //清除"数字"和"."以外的字符
  833. console.info(obj.value);
  834. obj.value = obj.value.replace(/^\./g,""); //验证第一个字符是数字而不是
  835. console.info(obj.value);
  836. obj.value = obj.value.replace(/\.{2,}/g,"."); //只保留第一个. 清除多余的
  837. console.info(obj.value);
  838. obj.value = obj.value.replace(".","$#$").replace(/\./g,"").replace("$#$",".");
  839. console.info(obj.value);
  840. obj.value = obj.value.replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3'); //只能输入两个小数
  841. console.info(obj.value);
  842. }