th.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1.  // 这里是项目的公共代码
  2. // 项目根路径
  3. var prjpath='/thscm_supplier';
  4. var dhxSkin='dhx_skyblue';
  5. // ! 检查元素在数组中的位置. >=0 表示位置, 不存在返回-1.
  6. // ! 检查元素是否存在数组中, 存在返回>=0, 不存在返回-1.
  7. if( !Array.indexOf) {
  8. Array.prototype.indexOf = function (obj){
  9. for (var i = 0; i < this.length; i++) {
  10. if (this[i] == obj) {
  11. return i;
  12. }
  13. }
  14. return -1;
  15. };
  16. };
  17. // ! 判断对象是否是数组.
  18. function isArray(v){
  19. if( typeof(v) == 'object' )
  20. return Object.prototype.toString.call(v) === '[object Array]';
  21. else
  22. return false;
  23. };
  24. // ! 将一个对象转换为数组. 参数本身可能也是数组.
  25. function toArray(obj){
  26. var ar = new Array();
  27. if( typeof(obj) == 'string' )
  28. ar = obj.split(',');
  29. else if( typeof(obj) == 'object' ) {
  30. if( isArray(obj) )
  31. ar = obj;
  32. }
  33. else if( typeof(obj) == 'number' ){
  34. ar.push(obj);
  35. }
  36. else if( typeof(obj) == 'boolean' ){
  37. ar.push(obj);
  38. }
  39. return ar;
  40. };
  41. // ! 从数组中过滤掉不以 obj 开头的元素. 同时将截掉 obj
  42. // ! arr 可以是一个字符串(以','分隔)也可以是一个数组
  43. // ! 返回过滤后的数组.
  44. function filtrElement(obj,arr){
  45. if( typeof(obj) == 'undefined' ) return arr;
  46. var arDest = new Array(), arSrc = toArray(arr);
  47. var objlen = obj.length;
  48. for( var i = 0; i < arSrc.length; i++){
  49. var vidx = arSrc[i];
  50. if( vidx.substr(0,objlen)==obj)
  51. arDest.push(vidx.substr(objlen,vidx.length));
  52. }
  53. return arDest;
  54. };
  55. // ! 使用勾选的最初和最后状态确定操作. 返回的是操作数组(id|optType,id|optType). optType:0-删除;1-增加.
  56. // ! vOld-表示最初的勾选ID列表. 可以是','分隔的字符串, 也可以是数组
  57. // ! vNew-表示最后的勾选ID列表. 可以是','分隔的字符串, 也可以是数组
  58. // ! 返回的是需要提交的ID数组.
  59. function dealCheckItem(vOld, vNew){
  60. var arOpt = new Array(), arOld = toArray(vOld), arNew = toArray(vNew);
  61. // ! 第一步: 确定最后为增加的.
  62. if( 0 < arNew.length ){
  63. if( 0 >= arOld.length ){
  64. for( var i=0;i<arNew.length;i++)
  65. arOpt.push(arNew[i]+'|1');
  66. }
  67. else{
  68. var vidx = '';
  69. for( var i=0;i<arNew.length;i++){
  70. vidx = arNew[i];
  71. // ! 如果最初状态为勾选, 则不需要处理了. 仅需要处理最初未勾选的
  72. if( arOld.indexOf(vidx) < 0 )
  73. arOpt.push(vidx+'|1');
  74. }
  75. }
  76. }
  77. // ! 第二步: 确定最后为删除的.
  78. if( 0 < arOld.length ){
  79. if( 0 >= arNew.length ){
  80. for( var i=0;i<arOld.length;i++)
  81. arOpt.push(arOld[i]+'|0');
  82. }
  83. else{
  84. var vidx = '';
  85. for( var i=0;i<arOld.length;i++){
  86. vidx = arOld[i];
  87. // ! 如果最初状态为勾选, 并且最后状态为未勾选, 则表示需要删除.
  88. if( arNew.indexOf(vidx) < 0 )
  89. arOpt.push(vidx+'|0');
  90. }
  91. }
  92. }
  93. return arOpt;
  94. };
  95. // ! 取BODY对象宽度
  96. function getBodyWidth(){
  97. return document.body.clientWidth;
  98. };
  99. // ! BODY对象高度
  100. function getBodyHeight(){
  101. return document.body.clientHeight;
  102. };
  103. // ! 检查是否是数字
  104. function isNumber(s){
  105. if(typeof(s)=='undefined' || s.length<=0) return false;
  106. var strP=/^\d+(\.\d+)?$/;
  107. if(!strP.test(s)) return false;
  108. try{if(parseFloat(s)!=s) return false;}
  109. catch(ex){return false;}
  110. return true;
  111. };
  112. // ! 检查是否是整数
  113. function isInt(s){
  114. if(typeof(s)=='undefined' || s.length<=0) return false;
  115. var strP=/^\d+(\.\d+)?$/;
  116. if(!strP.test(s)) return false;
  117. try{if(parseInt(s)!=s) return false;}
  118. catch(ex){return false;}
  119. return true;
  120. };
  121. // ! 对中文的URL参数转码. 仅针对于 attachURL() 时需要. 其它的dhtmlx还不需要.
  122. function encodeZh(zh){
  123. if(typeof(zh)=='undefined') return;
  124. return encodeURIComponent(encodeURIComponent(zh));
  125. };
  126. // ! 返回经转码的 url. 仅针对于 attachURL() 时需要. 其它的dhtmlx还不需要.
  127. function encodeZhUrl(url){
  128. var num=url.indexOf("?");
  129. if( num <= 0 )
  130. return url;
  131. var newurl = url.substr(0,num+1);
  132. url=url.substr(num+1);
  133. var arrtmp=url.split("&");
  134. for(var i=0;i < arrtmp.length;i++){
  135. num=arrtmp[i].indexOf("=");
  136. if(num>0){
  137. if( i > 0 )
  138. newurl += "&";
  139. newurl += arrtmp[i].substring(0,num);
  140. newurl += "=";
  141. newurl += encodeURIComponent(encodeURIComponent(arrtmp[i].substr(num+1)));
  142. }
  143. }
  144. return newurl;
  145. };
  146. // ! 对于枚举值的字符串, 提取值. 例如: [1]-正常. 调用 splitEnumValue("[1]-正常") 返回:"1"
  147. function splitEmVal(str){
  148. var n1 = str.indexOf("[");
  149. if( n1 >= 0 ){
  150. var n2 = str.indexOf("]");
  151. if( n2 > 1 ){
  152. return str.substr(n1+1,n2-1);
  153. }
  154. }
  155. return "";
  156. };
  157. // ! art.dialog 提示消息
  158. function artAlert(vHint,vLock,vFun){
  159. var vL = vLock==false?false:true;
  160. var vOk = typeof(vFun)!='function'?true:vFun;
  161. try{
  162. art.dialog({
  163. id:'hint-msg',
  164. title: "<span style='font-size:12px;font-weight:bold;'>系统提示</span>",
  165. content: "<span style='font-size:12px;font-weight:bold;'>"+vHint+"</span>",
  166. ok: vOk,
  167. okValue:'确定',
  168. lock: vL
  169. });
  170. }catch(ex){}
  171. };
  172. // ! art.dialog 确认框
  173. function artConfirm(vHint,vFun){
  174. art.dialog({
  175. id:'cfm-msg',
  176. title: "<span style='font-size:12px;font-weight:bold;'>系统提示</span>",
  177. content: "<span style='font-size:12px;font-weight:bold;'>"+vHint+"</span>",
  178. cancel:true,
  179. cancelValue: '取消',
  180. ok: vFun,
  181. okValue:'确定',
  182. lock: true
  183. });
  184. };
  185. /**
  186. * 锁定提示框,返回提示框对象
  187. *
  188. * @param vHint
  189. * @returns 返回提示框对象
  190. */
  191. function artProgress(vHint){
  192. var artProgressObj;
  193. try{
  194. artProgressObj = art.dialog({
  195. id:'hint-msg',
  196. title: "<span style='font-size:12px;font-weight:bold;'>系统提示</span>",
  197. content: "<span style='font-size:12px;font-weight:bold;'>"+vHint+"</span>",
  198. lock: true,
  199. cancel:false
  200. });
  201. }catch(ex){}
  202. return artProgressObj;
  203. };
  204. // ! art.dialog tips
  205. function artTips(vHint){
  206. art.dialog({
  207. id:'tip-msg',
  208. title: false,
  209. content: "<span style='font-size:12px;'>"+vHint+"</span>",
  210. cancel: false,
  211. padding:10,
  212. height:30,
  213. time:2000
  214. });
  215. };
  216. // ! 返回标题. (设置了图片和字体)
  217. function getLayoutTitle(vTitle,vImg){
  218. var vret = "";
  219. if( typeof(vImg)=="string")
  220. vret = "<img src='"+prjpath+"/static/images/" + vImg + "' style='margin-left:4px;margin-right:4px;margin-bottom:-4px;'/>";
  221. // vret = "<img src='"+prjpath+"/static/images/" + vImg
  222. // +style='position:relative;left:30%;margin-left:4px;margin-right:4px;margin-bottom:-4px;'/>";
  223. vret += "<span style='position:relative;bottom:1%;font-size:12px;font-weight:bold;color:#1D417D;'>" + vTitle +"</span>";
  224. return vret;
  225. };
  226. // ! 返回标题. (设置了图片和字体)
  227. function getTabTitle(vTitle,vImg){
  228. var vret = "";
  229. if( typeof(vImg)=="string")
  230. // vret = "<img src='"+prjpath+"/static/images/" + vImg + "'
  231. // style='margin-left:-2px;margin-right:2px;margin-bottom:-3px;'/>";
  232. vret = "<img src='"+prjpath+"/static/images/" + vImg + "' style='position:relative;left:-5px;margin-right:0px;margin-bottom:-3px;'/>";
  233. // vret += "<span style='font-size:12px;font-weight:bold;color:#1D417D;'>" +
  234. // vTitle +"</span>";
  235. vret += "<span style='font-size:12px;color:#1D417D;'>" + vTitle +"</span>";
  236. return vret;
  237. };
  238. // ! ajax
  239. function post(url,param){
  240. // var loader = dhtmlxAjax.postSync(url,param);
  241. var loader = dhtmlx.ajax().sync().post(url,param);
  242. var msg = eval( '(' + loader.responseText + ')' );
  243. return msg;
  244. };
  245. // ! ajax post
  246. function postBusi(url,param,callBackOk,callBackFail){
  247. var msg = post(url,param);
  248. var vHint = "返回码: ["+msg.code+"]<p>返回消息: <p>&nbsp;&nbsp;&nbsp;&nbsp;"+msg.message;
  249. artAlert(vHint,false);
  250. if(1==msg.code){
  251. if(typeof(callBackOk)=='function') callBackOk();
  252. }else{
  253. if(typeof(callBackFail)=='function') callBackFail();
  254. }
  255. return msg;
  256. };
  257. // ! 装载 tree. 如果失败则弹出提示. 成功时不提示.
  258. function loadTree(tree,url,param){
  259. var loader = dhtmlx.ajax().sync().post(url,param);
  260. var msg = eval( '(' + loader.responseText + ')' );
  261. if( msg.code != 1 ){
  262. dhtmlx.alert("error_code:"+msg.code+";error_msg:"+msg.message);
  263. }else{
  264. // tree.setDataMode("json");
  265. // tree.loadJSONObject(eval('('+msg.body+')'));
  266. tree.parse(eval("("+msg.body+")"),"json");
  267. }
  268. return msg;
  269. };
  270. // ! 装载 grid. --lixia增加tipFlag来判定是否显示提示信息
  271. function loadGrid(vGrid,url,param,tipFlag){
  272. vGrid.clearAll();
  273. var msg = post(url,param);
  274. if( msg.code == 1 ){
  275. vGrid.parse(eval("("+msg.body+")"),"json");
  276. if(typeof(tipFlag)=='undefined' || tipFlag)
  277. artTips("提示:查询成功.");
  278. }
  279. else if( msg.code == 20001 ){
  280. if(typeof(tipFlag)=='undefined' || tipFlag)
  281. artTips("提示:不好意思,查询不到数据!");
  282. }
  283. else{
  284. var vHint = "系统出错啦!<p>&nbsp;&nbsp;&nbsp;&nbsp;error code:"+msg.code+"<p>&nbsp;&nbsp;&nbsp;error message:"+msg.message;
  285. if(typeof(tipFlag)=='undefined' || !tipFlag)
  286. artAlert(vHint);
  287. }
  288. };
  289. // ! 删除 grid. 一行记录(从服务端)
  290. function deleteGrid(vGrid,url,param){
  291. var vSelId = vGrid.getSelectedRowId();
  292. if( vSelId==null ){
  293. artAlert("删除记录时,请首先选择所需要删除的记录行!",false);
  294. return;
  295. }
  296. artConfirm("您确定要删除所选择的记录行数据吗?",function(){
  297. var msg = postBusi(url,param);
  298. if( msg.code == 1 )
  299. vGrid.deleteRow(vSelId);
  300. return msg;
  301. });
  302. };
  303. // ! dhtmlx grid--toolbar: 在四个通用按钮(add,update,delete,export),
  304. // 对应的回调函数分别为:addGT(),updateGT(),deleteGT(),exportGT()
  305. // ! vDis-表示是否显示,不显示必须设置为false
  306. function gridToolbar(vLayoutCell,vDis1,vDis2,vDis3,vDis4){
  307. var dhxGT = vLayoutCell.attachToolbar();
  308. dhxGT.setIconsPath(prjpath+"/static/images/");
  309. if( vDis1 != false ){
  310. dhxGT.addSeparator("sep0", 1);
  311. dhxGT.addButton("add", 1, "新增", "add.png");
  312. }
  313. if( vDis2 != false ){
  314. dhxGT.addSeparator("sep1", 2);
  315. dhxGT.addButton("update", 3, "修改", "edit.png");
  316. }
  317. if( vDis3 != false ){
  318. dhxGT.addSeparator("sep2", 4);
  319. dhxGT.addButton("delete", 5, "删除", "delete.png");
  320. }
  321. if( vDis4 != false ){
  322. dhxGT.addSeparator("sep3", 6);
  323. dhxGT.addButton("export", 7, "导出", "excel.png");
  324. }
  325. dhxGT.attachEvent("onClick", function(id){
  326. if( id=="add" ) addGT();
  327. else if( id == "update") updateGT();
  328. else if( id == "delete") deleteGT();
  329. else if( id == "export") exportGT();
  330. else;
  331. });
  332. };
  333. // ! 新建窗口. 该函数的调用: dhxWin = newWindos(dhxWin); //! 原因是 js 的参数没有引用的说法.
  334. // ! 必须定义 <div id="div_win"></div>
  335. var dhxWins;
  336. function createWindow(vId,vName,vX,vY,vWidth,vHeigh){
  337. if( null == dhxWins ){
  338. dhxWins = new dhtmlXWindows();
  339. // dhxWins.attachViewportTo("div_win");
  340. // dhxWins.setSkin("dhx_skyblue");
  341. // dhxWins.vp.style.border = "#a4bed4 1px solid";
  342. // dhxWins.vp.style.borderRadius = "2px";
  343. }
  344. var vWin = dhxWins.createWindow(vId, vX, vY, vWidth, vHeigh);
  345. vWin.button("minmax1").disable();
  346. vWin.button("park").hide();
  347. vWin.setText(vName);
  348. vWin.center();
  349. vWin.setModal(true);
  350. return vWin;
  351. };
  352. // ! 在子窗口(iFrame)中关闭窗口. 参数为在父页面中创建窗口时的名称
  353. function closeParentWin(vName){
  354. if( null != parent.dhxWins ){
  355. var vWin = parent.dhxWins.window(vName);
  356. if( null != vWin ){
  357. try{parent.$("body").focus();}catch(e){}
  358. vWin.close();
  359. vWin = null;
  360. }
  361. // parent.dhxWins.unload();
  362. // parent.dhxWins = null;
  363. }
  364. };
  365. // 对Date的扩展,将 Date 转化为指定格式的String
  366. // 月(M)、日(d)、小时(h)(24小时制)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
  367. // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
  368. // 例子:
  369. // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
  370. // (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
  371. Date.prototype.Format = function(fmt)
  372. {
  373. var o = {
  374. "M+" : this.getMonth()+1, // 月份
  375. "d+" : this.getDate(), // 日
  376. "h+" : this.getHours(), // 小时
  377. "m+" : this.getMinutes(), // 分
  378. "s+" : this.getSeconds(), // 秒
  379. "q+" : Math.floor((this.getMonth()+3)/3), // 季度
  380. "S" : this.getMilliseconds() // 毫秒
  381. };
  382. if(/(y+)/.test(fmt))
  383. fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  384. for(var k in o)
  385. if(new RegExp("("+ k +")").test(fmt))
  386. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
  387. return fmt;
  388. };
  389. // ! 返回当月的上一月1日的日期
  390. function getFirstDayOfPrivMonth(){
  391. var Nowdate=new Date();
  392. return new Date(Nowdate.getYear(),Nowdate.getMonth()-1,1,0,0,0);
  393. };
  394. // ! 返回当月的上一月最后一日的日期
  395. function getLastDayOfPrivMonth(){
  396. var Nowdate=new Date();
  397. var MonthNextFirstDay=new Date(Nowdate.getYear(),Nowdate.getMonth(),1,23,59,59);
  398. return new Date(MonthNextFirstDay-86400000);
  399. };
  400. /** 替换文本中的换行为</br>标签 */
  401. String.prototype.addBrTag = function(){
  402. var str = this;
  403. return str.replace(/\n/g, "</br>");
  404. };
  405. /** 替换文本中的</br>标签为换行 */
  406. String.prototype.removeBrTag = function(){
  407. var str = this;
  408. return str.replace(/<\/br\w*\/*>/g, "\n");
  409. };
  410. /** onFocus事件清除焦点 * */
  411. function clearFocus(name){
  412. document.getElementsByName(name)[0].blur();
  413. };
  414. /** 校验内容不能全为空格 */
  415. var regNotEmpty = /^\s*$/;
  416. function notEmpty(data){
  417. return !regNotEmpty.test(data);
  418. }
  419. /** url直接查询grid */
  420. /** vGrid grid对象,url数据加载url,layoutCell 可以为空 */
  421. function qryGridUtil (vGrid,url,layoutCell){
  422. if( typeof(layoutCell)!= 'undefined' )
  423. // debugger;
  424. layoutCell.progressOn();
  425. vGrid.clearAll();
  426. this.send(url,"POST",function(loader, res){
  427. var msg = eval( '(' + res + ')' );
  428. if( msg.code == 1 ){
  429. vGrid.parse(eval("("+msg.body+")"),"json");
  430. artTips("提示:查询成功.");
  431. }
  432. else if( msg.code == 20001 ){
  433. artTips("提示:不好意思,查询不到数据!");
  434. }
  435. else{
  436. var vHint = "系统出错啦!<p>&nbsp;&nbsp;&nbsp;&nbsp;error code:"+msg.code+"<p>&nbsp;&nbsp;&nbsp;error message:"+msg.message;
  437. artAlert(vHint);
  438. }
  439. if( typeof(layoutCell)!= 'undefined' )
  440. layoutCell.progressOff();
  441. });
  442. };
  443. // easy ui 数据加载,将dhtmlx的数据格式进行转换,并加载数据
  444. function loadEasyGrid(id,url,para,fs){
  445. var fields = fs.split(",");
  446. var easyData = {};
  447. var msg = post(url,para);
  448. var rows = [];
  449. if( msg.code == 1 ){
  450. var data = eval("("+msg.body+")");
  451. var datas = data.rows;
  452. for(var i=0;i<datas.length;i++){
  453. var po = {};
  454. var d = datas[i].data;
  455. for(var j=0;j<d.length;j++){
  456. po[fields[j]]=d[j];
  457. }
  458. rows.push(po);
  459. }
  460. }
  461. easyData.total=rows.length;
  462. easyData.rows=rows;
  463. $(id).datagrid('loadData', easyData);
  464. }
  465. jQuery.prototype.serializeObject=function(){  
  466.     var obj=new Object();  
  467.     $.each(this.serializeArray(),function(index,param){  
  468.         if(!(param.name in obj)){  
  469.             obj[param.name]=param.value;  
  470.         }  
  471.     });  
  472.     return obj;  
  473. }; 
  474. $.extend($.fn.validatebox.defaults.rules, {
  475. /*equals: {
  476. validator: function(value,param){
  477. return value == $(param[0]).val();
  478. },
  479. message: 'Field do not match.'
  480. }, */
  481. regValid : {
  482. validator: function(value, param) {
  483. var m_reg = new RegExp(param[0]);
  484. if (!m_reg.test(value)) {
  485. $.fn.validatebox.defaults.rules.regValid.message = param[1];
  486. return false;
  487. }
  488. else {
  489. return true;
  490. }
  491. },
  492. message : ""
  493. },
  494. //强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-20之间)
  495. strongPwd: {
  496. validator: function(value, param){
  497. var pattern = new RegExp('^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9@_]{8,20}$');
  498. if(value===null && value.trim().length==0){
  499. return true;
  500. }
  501. //console.log(pattern);
  502. //console.log(pattern.test(value.trim()));
  503. return pattern.test(value.trim());
  504. },
  505. message: '密码长度为8~20位,且必须包含大小写字母和数字的组合!'
  506. }
  507. });
  508. //处理键盘事件 禁止后退键(Backspace)密码或单行、多行文本框除外  
  509. function banBackSpace(e){     
  510.     var ev = e || window.event;//获取event对象     
  511.     var obj = ev.target || ev.srcElement;//获取事件源     
  512.       
  513.     var t = obj.type || obj.getAttribute('type');//获取事件源类型    
  514.       
  515.     //获取作为判断条件的事件类型  
  516.     var vReadOnly = obj.getAttribute('readonly');  
  517.     var vEnabled = obj.getAttribute('enabled');  
  518.     //处理null值情况  
  519.     vReadOnly = (vReadOnly == null) ? false : vReadOnly;  
  520.     vEnabled = (vEnabled == null) ? true : vEnabled;  
  521.       
  522.     //当敲Backspace键时,事件源类型为密码或单行、多行文本的,  
  523.     //并且readonly属性为true或enabled属性为false的,则退格键失效  
  524.     var flag1=(ev.keyCode == 8 && (t=="password" || t=="text" || t=="textarea")   
  525.                 && (vReadOnly==true || vEnabled!=true))?true:false;  
  526.      
  527.     //当敲Backspace键时,事件源类型非密码或单行、多行文本的,则退格键失效  
  528.     var flag2=(ev.keyCode == 8 && t != "password" && t != "text" && t != "textarea")  
  529.                 ?true:false;          
  530.       
  531.     //判断  
  532.     if(flag2){  
  533.         return false;  
  534.     }  
  535.     if(flag1){     
  536.         return false;     
  537.     }     
  538. }  
  539.   
  540. //禁止后退键 作用于Firefox、Opera  
  541. document.onkeypress=banBackSpace;  
  542. //禁止后退键  作用于IE、Chrome  
  543. document.onkeydown=banBackSpace;
  544.