extend.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943
  1. /************************************
  2. * jq插件区
  3. ************************************/
  4. (function($)
  5. {
  6. $.extend({
  7. //$().loading()的简化版
  8. loading:function (options)
  9. {
  10. $().loading(options);
  11. },
  12. //$().overlay()的简化版,现在可以$.overlay();这么用。
  13. overlay:function (options)
  14. {
  15. $().overlay(options);
  16. },
  17. //时间戳
  18. getTime:function ()
  19. {
  20. var time = new Date();
  21. return time.getTime();
  22. },
  23. //$().loadsize();的简化版
  24. loadsize : function ()
  25. {
  26. return $().loadsize();
  27. },
  28. esc : function (e)
  29. {
  30. // == 27
  31. if (e.keyCode)
  32. {
  33. $('.overlay,.msg,.box').fadeOut(300,function(){$('.overlay,.msg,.box').remove();$(document).unbind('keydown');});
  34. return false;
  35. }
  36. },
  37. //用$.tip() 代替$().tip();
  38. tip : function(str, time, url)
  39. {
  40. $().tip(str, time, url);
  41. },
  42. //定时器
  43. timing : function ()
  44. {
  45. var now = +new Date;
  46. for(k in $.que)
  47. {
  48. if(now > $.que[k])
  49. {
  50. $('.msg[serial='+k+'],.overlay[serial='+k+']').remove();
  51. }
  52. }
  53. if($('.msg').length == 0)
  54. {
  55. clearInterval(ti); //都消失时停止定时器
  56. ti = undefined;
  57. }
  58. },
  59. //ajax访问网站
  60. form : function(rel,func,pre)
  61. {
  62. var e = $(".postForm[rel="+rel+"]");
  63. var url = e.attr('action');
  64. if(!url)
  65. {
  66. $.alert('url undefined',pre);
  67. }
  68. if(e.attr('send') != 'ajax')
  69. {
  70. e.iframeSubmit({cb:$_c_e('e',func),submit:1});
  71. return;
  72. }
  73. var data = {};
  74. $(".postForm[rel="+rel+"] .post").each(function(i){if($(this).attr('id')){eval('data.'+$(this).attr('id')+'='+$_c_e('e',$(this).val()));return $(this).check({func:pre})}})
  75. if($_c_d['status'] == false)
  76. {
  77. $_c_v('status',true);
  78. return;
  79. }
  80. $.query(url,data,func);
  81. },
  82. query : function(url,data,func)
  83. {
  84. $.post(url+'.ajax',data,func);
  85. },
  86. //html代码过滤
  87. txt : function()
  88. {
  89. return $(this).html().replace(/<\/?[^>]*>/g,'').replace(/[ | ]*\n/g,'\n').replace(/\n[\s| | ]*\r/g,'\n');
  90. },
  91. serial : 0, //做为覆盖层和提示层的编号,每次+1
  92. que : {} //定时器队列,如{1:1245778952,4:1245778958}
  93. });
  94. /**
  95. * 对复选框的操作.action可以是choose,cancel,reverse三种,对应全选,全取消,反选三种.默认全选.参数写错归于reverse
  96. * 例: $('input[type=checkbox]').checkbox(); //全选
  97. * $('input[type=checkbox]').checkbox('reverse'); //反选
  98. */
  99. $.fn.checkbox = function (action)
  100. {
  101. if(!action) action = 'choose';
  102. this.each(function (i, e){
  103. if(action=='choose') {
  104. e.checked = true;
  105. }else if(action=='cancel') {
  106. e.checked = false;
  107. }else{
  108. e.checked = !e.checked;
  109. }
  110. });
  111. return this;
  112. },
  113. /**
  114. * 数据错误时进行提示
  115. * 例: $('input').status('数据错误',false); //进行验证
  116. *
  117. */
  118. $.fn.status = function (t,f)
  119. {
  120. $(this).focus();
  121. $_c_v('status',false);
  122. f ? $.alert(t,f) : $(this).tip({str:t,time:1000,place: [120,'middle']});
  123. //$(this).val('');
  124. },
  125. /**
  126. * 对iframe高度进行控制
  127. * 例:
  128. */
  129. $.fn.iframe = function ()
  130. {
  131. if(!$(this).attr('id')) return;
  132. var frame = document.getElementById($(this).attr('id'));
  133. var page = document.frames ? document.frames[$(this).attr('id')].document : frame.contentDocument;
  134. if(frame != null && page != null)
  135. {
  136. frame.height = page.body.scrollHeight;
  137. }
  138. }
  139. /**
  140. * 对数据进行监控
  141. * 例: $('input').monit();
  142. *
  143. */
  144. $.fn.monit = function (c)
  145. {
  146. if(!$(this).attr('monit')) return;
  147. },
  148. /**
  149. * 对数据进行验证
  150. * 例: $('input').check(); //进行验证 需要有以下属性 check="1,2" lang
  151. *
  152. */
  153. $.fn.check = function (c)
  154. {
  155. if(!$(this).attr('check')) return;
  156. //设置参数的默认值
  157. p = $.extend({
  158. url: false, //验证地址
  159. func: false //回调函数名称
  160. }, c || {});
  161. var d = $(this).attr('check').split(',');
  162. if(d[0])
  163. {
  164. //不能为空
  165. if($_c_e('null',$(this).val()))
  166. {
  167. $(this).status($(this).attr('lang')+'不能为空',p.func);
  168. return false;
  169. }
  170. }
  171. if(d[1])
  172. {
  173. //验证相等
  174. if($(d[1]).val() != $(this).val())
  175. {
  176. $(this).status($(this).attr('lang')+'不匹配',p.func);
  177. return false;
  178. }
  179. }
  180. if(d[2])
  181. {
  182. //验证正则
  183. var reg = '';
  184. var txt = '';
  185. switch(d[2])
  186. {
  187. case 'chi'://中文验证
  188. reg = /^[\u4e00-\u9fa5]*$/g;
  189. txt = '必须为中文';
  190. break;
  191. case 'acc'://账户验证
  192. reg = /^[a-zA-Z0-9_]{3,16}$/;
  193. txt = '只能是英文和数字,字符在3-16之间';
  194. break;
  195. case 'mail'://邮箱验证
  196. reg = /^([a-zA-Z0-9]+[_|\-|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\-|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
  197. txt = '格式不对,参考格式:XXXX@XXX.XXX';
  198. break;
  199. case 'mobile'://手机验证
  200. reg = /^1\d{10}$/;
  201. txt = '号码输入有误';
  202. break;
  203. case 'number'://手机验证
  204. reg = /^-?\\d+$/;
  205. txt = '不是一个整数';
  206. break;
  207. }
  208. if(!$(this).val().match(reg))
  209. {
  210. $(this).status($(this).attr('lang')+txt,p.func);
  211. return false;
  212. }
  213. }
  214. if(d[3])
  215. {
  216. if($_c_d['status_url'] == false && p.func)
  217. {
  218. $(this).status($(this).attr('lang')+'已存在',p.func);
  219. $_c_u('status_url');
  220. return false;
  221. }
  222. //验证数据库中是否存在.
  223. var $status = $(this);
  224. $.query(p.url,{val:$(this).val(),check:d[3]},function(t)
  225. {
  226. if(t == -1)
  227. {
  228. $status.tip({str:$status.attr('lang')+'已存在',time:1000,place: [120,'middle']});
  229. $_c_v('status_url',false);
  230. return false;
  231. }
  232. else
  233. {
  234. $_c_v('status_url',true);
  235. }
  236. });
  237. }
  238. return true;
  239. },
  240. /**
  241. * 禁止或者激活表单元素。
  242. * example:
  243. * 1.禁止或激活整个表单:$('form').disable(); $('form').disable(false);
  244. * 2.禁止或激活某些元素 $('input').disable();
  245. */
  246. $.fn.disable = function (action)
  247. {
  248. if(action == undefined) action = true;
  249. var items = this;
  250. if($(this).attr('tagName') == 'FORM')
  251. {
  252. items = this.find('input[type=text],input[type=radio],input[type=checkbox],textarea,select');
  253. }
  254. items.each(function (i,e)
  255. {
  256. e.disabled = action;
  257. });
  258. return this;
  259. },
  260. /**
  261. * 获取checkbox的值.mod可以是字符串'array'或'str',空参数或写错参数都归为str方式.
  262. * 例: var val = $('input[type=checkbox]').checkboxVal();
  263. */
  264. $.fn.checkboxVal = function (mod)
  265. {
  266. if(!mod) mod = 'str';
  267. var array = new Array(), str = '';
  268. this.each(function (i, e)
  269. {
  270. if(mod=='array')
  271. {
  272. if(e.checked) array.push(e.value);
  273. }
  274. else
  275. {
  276. if(e.checked) str += e.value+',';
  277. }
  278. });
  279. if(mod=='array') return array;
  280. if(!str) return '';
  281. return str.substring(0, str.length - 1);
  282. },
  283. /**
  284. * 生成验证数据保存的对象
  285. *
  286. */
  287. $.fn.createCheck = function ()
  288. {
  289. $(this).prepend('<input type="hidden" name="'+$(this).attr('name')+'_check" value="'+$(this).attr('check')+'" style="display:none;"/>');
  290. },
  291. /**
  292. * iframe方式提交表单,当有图片上传时.如果有回调函数,PHP需要这样返回
  293. * if($_GET['cb']) {
  294. exit("<script>top.{$_GET['cb']}('$data')</script>");
  295. }
  296. */
  297. $.fn.iframeSubmit = function (ob)
  298. {
  299. //设置参数的默认值
  300. p = $.extend({
  301. debug: 0, //设为1会显示iframe
  302. url: 'javascript:;', //上传地址
  303. cb: null, //回调函数名称,不能用匿名函数形式
  304. submit: 0 //是否显式提交,如果不是写在表单的提交事件中则需设为1
  305. }, ob || {});
  306. if(p.url == 'javascript:;') p.url = this.attr('action');
  307. if(p.cb)
  308. {
  309. var temp = p.cb.toString().match(/function[\ ]*([\w]+)/);
  310. $(this).prepend('<input type="hidden" name="function" value="'+temp[1]+'" style="display:none;"/>');
  311. }
  312. if(!p.debug)
  313. {
  314. if(!$('iframe[name=uploadIframe]').length)
  315. {
  316. $(this).prepend('<iframe name="uploadIframe" style="display:none;"></iframe>');
  317. }
  318. $(this).attr('target', 'uploadIframe');
  319. }
  320. $(this).get(0).encoding = 'multipart/form-data';
  321. $(this).attr('action', p.url + '.ajax');
  322. if(p.submit) $(this).submit();
  323. }
  324. //一.简化用法
  325. //$.tip('2秒后自动消失');
  326. //$.tip('0.5秒后消失',500);
  327. //$.tip('不自动消失',0); //按esc键消失,或者调用$.tip('close');
  328. //$.tip('2秒后自动转到百度,如果按esc键马上就跳转','http://www.baidu.com'); //时间参数和网址参数顺序可对调,因此不需要写成$.tip('内容',2000,url);
  329. //二.复杂用法.详细可设置请查看设置参数默认值部分,可任意混合设定
  330. //$.tip({str:'红色文字',color: '#F00'});
  331. //$.tip({str:'灰色背景',background: '#ccc'});
  332. //$.tip({str:'透明度设定',opacity: .5});
  333. //$.tip({str:'透明度和内间距设置',opacity: .5,padding:'6px 20px'});
  334. //$.tip({str:'不显示覆盖阴影层',overlay:false});
  335. //$.tip({str:'显示在上方的中间',place: ['center','top']});
  336. //$.tip({str:'显示在左上方',place: ['left','top']});
  337. //$.tip({str:'任意位置',place: [100,'top']});
  338. //三.以上的所有用法都是针对全局显示的,其实都可以为某个元素局部显示,并且可为多个元素显示
  339. //$('#blogDiv,#replyDiv,#photoDiv').tip('载入中,请稍候'); //其实这种效果使用loading更方便一些.
  340. //$('#blogDiv,#replyDiv').tip('close'); //只关闭日志与评论部分的提示,photo部分仍然显示
  341. //还有太多例子了,总之看着参数随意组合吧.
  342. $.fn.tip = function(options,time,url)
  343. {
  344. //简化的用法,例如$('div').tip('信息');
  345. if(typeof options != 'object' && options != 'close')
  346. {
  347. var options = {str: options};
  348. if(typeof time == 'number') options.time = time;
  349. if(typeof time == 'string') options.url = time;
  350. if(typeof url == 'number') options.time = url;
  351. if(typeof url == 'string') options.url = url;
  352. }
  353. //设置参数的默认值
  354. var p = $.extend({
  355. str:'&nbsp;', //内容
  356. time:2000, //延时自动消失,单位为毫秒,设为0不消失,按esc键时才消失
  357. url:'', //提示消失后转向的url
  358. color: '#666', //字体颜色
  359. background: '#fff', //背景
  360. border: '2px dashed #bababa', //边框
  361. fontloadsize: '12px', //字体大小
  362. overlay: false, //是否带覆盖层阴影
  363. textAlign: 'left', //对齐方式
  364. zIndex: 1500, //z轴
  365. opacity: 0.2, //背景透明度,如果overlay设为真
  366. padding: '3px 40px', //内间距
  367. place:['center','middle'] // ['left','top']或[150,400]
  368. }, options || {});
  369. var scope = this.attr('tagName') ? 1 : 0;
  370. this.each(function (i, e)
  371. {
  372. var e = scope ? $(e) : $('body');
  373. if(options=='close')
  374. {
  375. return $('.overlay[serial='+e.attr('serial')+'], .msg[serial='+e.attr('serial')+']').remove();
  376. }
  377. //取页面尺寸与偏移信息
  378. var ps = scope ? e.loadsize() : $.loadsize();
  379. //给层编号
  380. if(e.attr('serial'))
  381. {
  382. var serial = e.attr('serial');
  383. }
  384. else
  385. {
  386. var serial = ++$.serial;
  387. e.attr('serial', serial) ;
  388. }
  389. var jq = $('.msg[serial='+serial+']');
  390. //创建容器
  391. if(!jq.length)
  392. {
  393. var msg = '<div class="msg" serial="'+serial+'" style="position:absolute;display:none;"></div>';
  394. $('body').append(msg);
  395. jq = $('.msg[serial='+serial+']');
  396. }
  397. //数字转成字符串
  398. if(typeof p.str == 'number') p.str += '';
  399. var leng = p.str.replace(/[^\x00-\xff]/g, "**").length; //字符串真实长度
  400. if(leng > 40) jq.width(200);
  401. jq.html(p.str);
  402. jq.css('padding',p.padding).css('z-index',p.zIndex).css('color',p.color).css('background',p.background)
  403. .css('border',p.border).css('text-align',p.textAlign).css('font-loadsize',p.fontloadsize);
  404. //创建覆盖层
  405. if(p.overlay)
  406. {
  407. if(scope) e.overlay(p);
  408. else $().overlay(p);
  409. }
  410. //开始定位
  411. var top = 0; var left = 0; var jqw = jq.outerWidth(); var jqh = jq.outerHeight();
  412. if(p.place[0] == 'center') left = (ps.w - jqw)/2;
  413. else if(p.place[0] == 'left') left = 10;
  414. else if(p.place[0] == 'right') left = ps.w - jqw - 20;
  415. else left = p.place[0];
  416. if(p.place[1] == 'middle') top = (ps.h - jqh)/2;
  417. else if(p.place[1] == 'top') top = 5;
  418. else if(p.place[1] == 'bottom') top = ps.h - jqh;
  419. else top = p.place[1];
  420. //显示
  421. jq.css('top',top+ps.y).css('left', left+ps.x).fadeIn('fast');
  422. if(p.time != 0)
  423. {
  424. //加入定时器队列
  425. $.que[serial] = +new Date + p.time;
  426. if(typeof ti == 'undefined')
  427. { //一定要判断,不能会有多个定时器同时转动
  428. ti = setInterval($.timing, 100);
  429. }
  430. }
  431. if(p.url && p.time > 0) setTimeout("location.href='"+p.url+"'", p.time);
  432. });
  433. //按esc、回车、c键退出
  434. $(document).keydown(function (e)
  435. {
  436. if(p.url)
  437. {
  438. setTimeout("location.href='"+p.url+"'", 100);
  439. }
  440. });
  441. $(this).focus();
  442. return this;
  443. }
  444. /**
  445. * 弹出框,用于比较复杂的内容,特别是ajax载入表单,窗口
  446. * 例:$.box({url: '/blog/form/34', width: 580, show:function (){alert('载入成功'}});
  447. * 看着参数自由组合吧,不想写一大堆例子了
  448. * 这个框组合起来可以实现confirm,alert等特定应用,当然会有简化版$.confirm, $.alert出现
  449. */
  450. $.box = function (options)
  451. {
  452. if(options == 'close') return $('.overlay, .box').fadeOut(300,function(){$('.overlay, .box').remove()});//非手工关闭方式暂不支持关闭回调
  453. //参数默认值
  454. var p = $.extend({
  455. width: 600,
  456. height: 0, //设为0则自动调整高度,不出现滚动条
  457. overlay: true, //是否使用覆盖阴影
  458. border:'#eeeeee', //整体的边框颜色
  459. background: '#fff',
  460. title: '', //如果为空,不显示标题栏
  461. drag: true, //是否可拖拽,需要drag插件,如果没有也不会报错
  462. url: '', //ajax载入内容
  463. show:function(){}, //显示时执行的函数
  464. close:function(){}, //关闭时执行的函数
  465. str: '', //显示的内容,与url参数不共存
  466. closeBtn: true, //是否需要右上角关闭图标
  467. closeImg: 1, //关闭图标图片
  468. buttons: [], //按钮组,每个按钮是{text:'确定',handler:fn}形式
  469. buttonAlign: 'center', //按钮置中(或left,right)
  470. buttonClass: 'mine-right-model-button', //按钮的class
  471. style: '', //主容器的css设置
  472. titleStyle:'', //标题栏css设置
  473. titleImg:1 //标题栏背景设置
  474. }, options || {});
  475. //创建覆盖层
  476. if(p.overlay) $.overlay({opacity:0.2});
  477. //加入box
  478. if($('.box').length) $('.box').remove();
  479. $('body').append('<div class="box"></div>');
  480. var box = $('.box');
  481. //box的调整
  482. box.css({position:'absolute',visibility:'hidden',overflow:'hidden',width:p.width,zIndex:99,fontloadsize:'12px',color:'#666',
  483. background: p.background,border:'5px solid '+p.border+'',padding: '20px 6px 10px 6px',overflowY:p.overflow});
  484. if(p.height) box.height(p.height);
  485. box.find('select').css({display:'none'});
  486. if(p.style)
  487. {
  488. box.attr('style',box.attr('style') + ';' + p.style)
  489. }
  490. //加入关闭功能
  491. $(document).unbind('keydown');
  492. $(document).keydown(function (e)
  493. {
  494. if (e.keyCode == 27)
  495. {
  496. $('.overlay, .box').fadeOut(300,function(){$('.overlay, .box').remove()});
  497. p.close.call();
  498. }
  499. });
  500. if(p.closeBtn)
  501. {
  502. box.prepend('<a class="boxClose" href="javascript:;" title="点击或按esc键关闭"><img style="display:none;" src="'+$_c_i('close/'+p.closeImg)+'.gif"/></a>');
  503. $('.boxClose').css({position:'absolute',left:p.width - 5,top:5,zIndex:100,color:'#F00'}).click(function ()
  504. {
  505. $('.overlay, .box').fadeOut(300,function(){$('.overlay, .box').remove()});
  506. p.close.call();
  507. }).find('img').css('border','none');
  508. if (box[0].scrollHeight > box[0].offsetHeight)
  509. { //如果有滚动条,图标位置左移一点
  510. $('.boxClose').css('left', p.width-20);
  511. }
  512. }
  513. //加入标题栏
  514. if(p.title)
  515. {
  516. box.prepend('<div class="boxTitle">'+p.title+'</div>');
  517. var title = box.find('.boxTitle');
  518. var titlePos = {position:'absolute',left:0,top:0,height:16,width:box.innerWidth(),background:'#000',
  519. borderTop:box.css('borderTop'),fontloadsize:'14px',color:'#fff',fontWeight:'bold',padding:4};
  520. if(p.titleImg)
  521. {
  522. titlePos.backgroundImage = 'url('+$_c_i('back/title'+p.titleImg+'.jpg')+')';
  523. titlePos.backgroundRepeat = 'repeat-x';
  524. titlePos.backgroundPositionY = 'top';
  525. }
  526. title.css(titlePos);
  527. box.css({borderTop:0,paddingTop:parseInt(box.css('paddingTop')) + 15});
  528. //$('.boxClose').css('top',10 + $_c_e('int',title.css('borderTop')));
  529. if(p.titleStyle)
  530. {
  531. title.attr('style',title.attr('style') + ';' + p.titleStyle)
  532. }
  533. }
  534. //加入按钮组
  535. if(p.buttons.length)
  536. {
  537. box.append('<div class="boxBtn" style="margin-top: 16px;text-align:'+p.buttonAlign+';"></div>');
  538. }
  539. for(k in p.buttons)
  540. {
  541. box.find('.boxBtn').append('<button style="margin:0 5px;float:none;display:inline;">'+p.buttons[k].text+'</button>')
  542. .find('button:last').click(p.buttons[k].handler);
  543. }
  544. if(p.buttonClass) box.find('.boxBtn button').addClass(p.buttonClass);
  545. //执行善后工作,自动置中. 显示box,ie6下select的处理
  546. var epilogue = function ()
  547. {
  548. box.center(); //自动置中
  549. box.css('visibility','visible');//先隐藏再显示,不然在IE中定位时窗口会从左边闪到中间,用透明度来隐藏比display好,不影响定位
  550. box.find('select').show();
  551. if(!box.drag || !p.drag) return ;
  552. //拖拽效果
  553. if(p.title) {
  554. box.drag({h: '.boxTitle'});
  555. }else{
  556. box.drag();
  557. }
  558. $("#boxContent").css({'text-align':'center','margin-top':'10px'});
  559. }
  560. //显示内容
  561. if(p.str)
  562. {
  563. box.prepend('<div id="boxContent">'+p.str+'</div>');
  564. epilogue();
  565. p.show.call();
  566. }
  567. else if(p.url)
  568. {
  569. //ajax载入内容,执行回调函数
  570. $.get(p.url+'.ajax', function (data) {
  571. box.prepend('<div id="boxContent">'+data+'</div>');
  572. box.find('select').css('display','none');
  573. setTimeout(epilogue, 0);
  574. p.show.call();
  575. })
  576. }
  577. }
  578. /**
  579. * box插件的confirm版本
  580. * @param string str 提示文本
  581. * @param fn yes 按下yes的回调函数
  582. * @param fn no 按下no的回调函数,默认为关闭box
  583. * @example $.confirm('确定删除?', function (){//删除操作});
  584. */
  585. $.confirm = function (str, yes, no)
  586. {
  587. if(!yes) var yes = function (){$.box('close');};
  588. if(!no) var no = function (){
  589. $.box('close');
  590. };
  591. var options =
  592. {
  593. str:str,
  594. width: 250,
  595. closeBtn: false,
  596. show: function ()
  597. {
  598. $('.box .boxBtn button:last').focus()
  599. },
  600. buttons:
  601. [
  602. {
  603. text:'确定', handler:function ()
  604. {
  605. yes.call();
  606. }
  607. },
  608. {
  609. text:'取消', handler:no
  610. }
  611. ]
  612. };
  613. $.box(options);
  614. }
  615. /**
  616. * box插件的alert版本
  617. * @param string str 提示文本
  618. * @param fn yes 按下yes的回调函数
  619. * @example $.alert('很遗憾的说,你的智商低于10');
  620. */
  621. $.alert = function (str, yes)
  622. {
  623. if(!yes) var yes = function (){$.box('close');};
  624. var options =
  625. {
  626. str:str,
  627. width: 250,
  628. closeBtn: false,
  629. show: function ()
  630. {
  631. $('.box .boxBtn button:first').focus();
  632. },
  633. buttons:
  634. [
  635. {
  636. text:'确定', handler:function ()
  637. {
  638. yes.call();
  639. }
  640. }
  641. ]
  642. };
  643. $.box(options);
  644. }
  645. /**
  646. * box插件的msg版本
  647. * @param string str 信息文本
  648. * @param string title 信息标题
  649. * @param string text 信息按钮文本
  650. * @param string w 宽度
  651. * @param fn yes 按下yes的回调函数
  652. * @example $.msg('很遗憾的说,你的智商低于10','标题');
  653. */
  654. $.msg = function (str, title, text, yes, show, no, width, btn)
  655. {
  656. if(!yes) var yes = function (){$.box('close');};
  657. if(!no) var no = function (){
  658. $.box('close');
  659. };
  660. var options =
  661. {
  662. width:width ? width : 400,
  663. title:title ? title : '信息提示',
  664. closeBtn: btn ? btn : true,
  665. show: function ()
  666. {
  667. eval(show);
  668. $('.box .boxBtn button:last').focus();
  669. },
  670. buttons:
  671. [
  672. {
  673. text:text, handler:function ()
  674. {
  675. yes.call();
  676. }
  677. },
  678. {
  679. text:'取消', handler:no
  680. }
  681. ]
  682. };
  683. if(str.indexOf('.url') == -1)
  684. {
  685. options.str = str;
  686. }
  687. else
  688. {
  689. options.url = str.replace('.url','');
  690. }
  691. $.box(options);
  692. }
  693. $.fn.extend({
  694. /**
  695. * 显示一个覆盖层
  696. * 整个页面覆盖: $().overlay(); //可以用上面的$.overlay();代替
  697. * 某个元素覆盖: $('#main').overlay();
  698. */
  699. overlay : function (options)
  700. {
  701. //设置默认值
  702. var m = $.extend({
  703. z : 99, //zindex 覆盖高度
  704. o : 0.2, //opacity 透明度
  705. l : 1, //loading 加载的图片
  706. a : '' //action 动作close or loading
  707. }, options || {});
  708. var s = this.attr('tagName') ? 1 : 0; //范围是全局还是局部
  709. this.each(function(i,e)
  710. {
  711. if(s)
  712. {
  713. e = $(e);//局部
  714. if(e.next('.overlay').length) return;
  715. var p = e.loadsize();
  716. }
  717. else
  718. {
  719. e = $('body');//全局
  720. if($('body>.overlay[rel=0]').length) return;
  721. var p = $.loadsize();
  722. }
  723. if(options == 'close' || m.a == 'close')
  724. {
  725. return $('.overlay[serial='+e.attr('serial')+']').remove();
  726. }
  727. //给层编号
  728. if(e.attr('serial'))
  729. {
  730. if($('.overlay[serial='+e.attr('serial')+']').length) return; //不重复添加覆盖层
  731. var serial = e.attr('serial');
  732. }
  733. else
  734. {
  735. var serial = ++$.serial;
  736. e.attr('serial', serial);
  737. }
  738. var o = '<div class="overlay" serial="'+serial+'" style="left:0;top:0;display:none;z-index:'+m.z+';position:absolute;text-align:left;"></div>';
  739. $('body').append(o);
  740. o = $('.overlay[serial='+serial+']');
  741. o.css('left',p.x);o.css('top',p.y);
  742. o.width(p.W).height(p.H).css('opacity',m.o).css('background','#000').fadeIn(300);
  743. if(m.a == 'loading')
  744. {
  745. o.html('<img class="loading" src="'+$_c_i('common/loading/'+m.l)+'.gif" alt="loading..."/>');
  746. o.find('.loading').css('margin-top',p.h/2 - 8);
  747. o.find('.loading').css('margin-left',p.w/2 - 8);
  748. }
  749. });
  750. //按esc键退出
  751. $(document).keydown($.esc);
  752. return this;
  753. },
  754. loadsize : function ()
  755. {
  756. //局部元素
  757. if(this.attr('tagName'))
  758. {
  759. var pos = this.offset();
  760. pos.x = pos.left;
  761. pos.y = pos.top;
  762. pos.w = pos.W = this.outerWidth();
  763. pos.h = pos.H = this.outerHeight();
  764. return pos;
  765. }
  766. //获取浏览器可见部分的定位宽高信息
  767. var w = document.documentElement.clientWidth;
  768. var h = document.documentElement.clientHeight;
  769. var x = document.documentElement.scrollLeft;
  770. var y = document.documentElement.scrollTop;
  771. if(self.pageXOffset) //兼容chrome
  772. {
  773. x=self.pageXOffset;
  774. y=self.pageYOffset;
  775. }
  776. //整体正文宽高
  777. var W = $(document).width();
  778. var H = $(document).height();
  779. $_c_v('w',W);
  780. $_c_v('h',H);
  781. return {w:w, h:h, W:W, H:H, x:x, y:y};
  782. },
  783. //$.loading();相当于$.overlay({str:'<img class="loading" src="/res/css/images/loading.gif" alt="loading..."/>'});简化了用法
  784. loading : function (options)
  785. {
  786. if(options == 'close') options = {a:'close'};
  787. else options = {a:'loading'};
  788. this.overlay(options);
  789. return this;
  790. },
  791. //跟随滚动条滚动
  792. follow : function (options)
  793. {
  794. var m = this;
  795. $(window).load(function()
  796. {
  797. $(m).followElect(options);
  798. })
  799. .scroll(function()
  800. {
  801. $(m).followElect(options);
  802. })
  803. .resize(function()
  804. {
  805. $(m).followElect(options);
  806. });
  807. return m;
  808. },
  809. //跟随滚动条滚动 效果
  810. followElect : function(options)
  811. {
  812. //设置默认值
  813. var m = $.extend({
  814. speed : "fast",
  815. position : "bottom",
  816. func : function(){},
  817. type : 1
  818. }, options || {});
  819. if(m.type == 2)
  820. {
  821. $(this).slideUp(m.speed,function()
  822. {
  823. $(this).slideDown(m.speed);
  824. $(this).css(m.position,(-parseInt($( document ).scrollTop())+1)+"px");
  825. m.func.call();
  826. });
  827. }
  828. else
  829. {
  830. $(this).css(m.position,(-parseInt($( document ).scrollTop())+1)+"px");
  831. m.func.call();
  832. }
  833. return this;
  834. },
  835. //元素置中
  836. center : function ()
  837. {
  838. //box定位
  839. var p = $.loadsize();
  840. this.css({left:(p.w-this.outerWidth())/2 + p.x,top:(p.h-this.outerHeight())/2 + p.y});
  841. },
  842. /**
  843. * 拖拽插件,无依赖,为box提供拖拽功能,如果缺少本插件box也不出错,只是无拖拽功能
  844. * 例: $('div').drag({h:'h2'}); //将div中的h2做为拖拽句柄
  845. */
  846. drag : function (options)
  847. {
  848. var m = $.extend({
  849. h: '' //handler 可拖拽点,默认为本身
  850. },options || {});
  851. this.each(function (i, e)
  852. {
  853. e = $(e);
  854. var mx,my,x,y,left,top; //mx,my是鼠标点击位置。x,y是元素原始坐标,left,top是元素的css属性
  855. var mt = $_c_e('int',e.css('margin-top'));
  856. var ml = $_c_e('int',e.css('margin-left'));
  857. e.css({position:'absolute'});
  858. var handler = m.h ? e.find(m.h) : e;
  859. handler.css('cursor','pointer');
  860. handler.mousedown(function (ev)
  861. {
  862. ev = ev || window.event;
  863. var of = e.offset();x
  864. mx = of.left; //元素左上角x坐标
  865. my = of.top;
  866. x = ev.pageX; //鼠标x坐标
  867. y = ev.pageY;
  868. //left = $_c_e('int',e.css('left'));
  869. //top = $_c_e('int',e.css('top'));
  870. var l = $_c_d['w'] ? $_c_d['w'] : $(document).width();
  871. var t = $_c_d['h'] ? $_c_d['h'] : $(document).height();
  872. var bw = l-$(this).width()-30;
  873. var bh = t-$(this).height()-55;
  874. $(document).mousemove(function (ec)
  875. {
  876. ec = ec || window.event;
  877. var pl = mx + ec.pageX - x - ml;
  878. var pt = my + ec.pageY - y - mt;
  879. pl = pl >= bw ? bw : pl <= 0 ? 0 : pl;
  880. pt = pt >= bh ? bh : pt <= 0 ? 0 : pt;
  881. e.css({left:pl, top:pt});
  882. });
  883. });
  884. $(document).mouseup(function ()
  885. {
  886. $(document).unbind('mousemove');
  887. });
  888. });
  889. return this;
  890. }
  891. })
  892. })(jQuery);