输入页 离开页面前弹出框

简介:

离开页面确认主要是利用了onbeforeunload事件,存 在着兼容问题 当该事件声明为 

Java代码   收藏代码
  1. <body onbeforeunload ="return pageBeforeunload(event);" >  
  2.   
  3. <script type ="text/javascript" >  
  4. function pageBeforeunload(evt){     
  5.      return ' Are you sure you want to leave this page? ' ;  
  6. }  
  7. </script>   

另外一种方式是把onbeforeunload声明为:

Java代码   收藏代码
  1. <body onbeforeunload="pageBeforeunload(event);">   

在该种方式下,将不会弹出系统默认的离开确认对话框 ,此时可以在pageBeforeunload函数内部,通过调用confirm方法进行确认,这种方式的好处是,即便在用户确认离开页面的时候,也可以进行必要的状态保存操作。此时pageBeforeunload的代码可以写成:

Java代码   收藏代码
  1. function pageBeforeunload(evt){  
  2.      var confirm = window.confirm(' Are you sure to leave this page?');  
  3.      if (confirm == true ){  
  4.          // 添加必要的处理逻辑  
  5.      }   
  6. }   

最近在开发中有这样一个需求:
如果在进行操作但 未保存的情况下 点击顶部其它页面链接,则弹出提示框,
大小: 6.06 K 尺寸: 327 x 153 浏览: 4 次 点击打开新窗口浏览全图
1、点击“确定”进入所点页面并关闭本窗口;
2、点击“取消”或“x”,取消本次跳转操作并关闭本窗口。
不知道别人怎么做,我想出来的算法是:
1、取到form内所有表单的值,
2、把表单键值对转化为hash对象,
3、把hash对像转化为数组,
4、把数组拼接成字符串,
5、然后比较两个字符串是否相等。
Java代码   收藏代码
  1. /** 
  2.  * 把表单内容转换为hash对象 
  3.  * @public 
  4.  * @param {HTMLElement} form对象 
  5.  * @return {oHash} 
  6.  * @author footya | yongsheng2@staff.sina.com.cn 
  7.  * @update 2009-8-10   修改自alz框架 
  8.  * @example 
  9.  *  formToHash(document.forms[0]); 
  10.  */  
  11. function formToHash(form) {  
  12.     var oHash = {};  
  13.     var el;  
  14.     for (var i = 0, len = form.elements.length; i < len; i++) {  
  15.         el = form.elements[i];  
  16.         if (el.name == ""continue;  
  17.         if (el.disabled) continue;  
  18.         switch (el.tagName.toLowerCase()) {  
  19.             case "fieldset":  
  20.                 break;  
  21.             case "input":  
  22.                 switch (el.type) {  
  23.                     case "radio":  
  24.                         if (el.checked)  
  25.                             oHash[el.name] = el.value;  
  26.                         break;  
  27.                     case "checkbox":  
  28.                         if (el.checked) {  
  29.                             if (!oHash[el.name])  
  30.                                 oHash[el.name] = [el.value];  
  31.                             else  
  32.                                 oHash[el.name].push(el.value);  
  33.                         }  
  34.                         break;  
  35.                     case "button":  
  36.                         break;  
  37.                     case "image":  
  38.                         break;  
  39.                     default:  
  40.                         oHash[el.name] = el.value;  
  41.                         break;  
  42.                 }  
  43.                 break;  
  44.             case "select":  
  45.                 if (el.multiple) {  
  46.                     //alert(el.name);  
  47.                     for (var j = 0, lens = el.options.length; j < lens; j++) {  
  48.                         if (el.options[j].selected) {  
  49.                             if (!oHash[el.name])  
  50.                                 oHash[el.name] = [el.options[j].value];  
  51.                             else  
  52.                                 oHash[el.name].push(el.options[j].value);  
  53.                         }  
  54.                     }  
  55.                 } else {  
  56.                     oHash[el.name] = el.value;  
  57.                 }  
  58.                 break;  
  59.             default:  
  60.                 oHash[el.name] = el.value;  
  61.                 break;  
  62.         }  
  63.     }  
  64.     el = null;  
  65.     return oHash;  
  66. }  
  67.   
  68. /** 
  69.  * 把含有表单数据的hash对象转化为数组 
  70.  * @public 
  71.  * @param {obj} hash对象 
  72.  * @return {Array} 
  73.  * @author footya | yongsheng2@staff.sina.com.cn 
  74.  * @update 2009-8-10   修改自alz框架 
  75.  * @example 
  76.  *      var aData = formHashToArray(hash); 
  77.  */  
  78. function formHashToArray(hash) {  
  79.     var a = [];  
  80.     for (var k in hash) {  
  81.         if (typeof(hash[k]) == "string") {  
  82.             a.push(k + "=" + encodeURIComponent(hash[k]));  
  83.         }  
  84.         else {  
  85.             for (var i = 0, len = hash[k].length; i < len; i++) {  
  86.                 a.push(k + "=" + encodeURIComponent(hash[k][i]));  
  87.             }  
  88.         }  
  89.     }  
  90.     return a;  
  91. }   
调用这两个方法来实现字符串对比, submit不触发onbeforeunload
Java代码   收藏代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html lang='zh-CN' xml:lang='zh-CN' xmlns='http://www.w3.org/1999/xhtml'>  
  3. <head>  
  4.   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>  
  5. </head>  
  6. <form name="test">  
  7. <input type="text" name="pic"/>  
  8. <a href="http://www.baidu.com">aa</a>  
  9. <input type="radio" name="radio" value="1"/>  
  10. <input type="submit" onclick="filter = false;" value="提交"/>  
  11. <a href="#" onclick="filter = false;document.test.submit();">链接提交</a>  
  12. </form>  
  13. <script>  
  14.    var FILTERFORM = document.test;  
  15.    var FormHashin = formToHash(FILTERFORM);//记录表单的初始状态    
  16.    var filter = true;  //临时设false不弹框  
  17.           
  18.     /***change window***/    
  19.     function outWrite(e){     
  20.         var event = window.event||e;     
  21.         event.returnValue = "您修改的设置尚未保存,确定要离开吗?";     
  22.     }     
  23.     window.onbeforeunload = function(e){//卸载页面时再获取一次表单状态,监听  
  24.         var FormHashout = formToHash(FILTERFORM);     
  25.         if(!compareHash(FormHashin, FormHashout)&&filter){     
  26.             try{outWrite(e)}catch(exp){};    
  27.         }     
  28.     };     
  29.     //比较两个hash对象是否相等。     
  30.     function compareHash(hash1,hash2){     
  31.         var h1 = formHashToArray(hash1).join("-");     
  32.         var h2 = formHashToArray(hash2).join("-");     
  33.         if(h1 == h2){     
  34.             return true;     
  35.         }else{     
  36.             return false;     
  37.         }     
  38.     }    
  39. </script>  
  40. <html>  
相关文章
|
5月前
|
PHP Windows
Ecshop打印报价单页面显示空白!
Ecshop打印报价单页面显示空白!
27 0
|
11月前
|
Android开发
【Android应用篇】防止连续点击,跳转两页
有时候在小说界面,你想点下一页,然后还没翻过去正翻一半,你又点了一次,结果就翻2页。
68 0
滚动条案例(点击跳转到指定地点,上下滑动跟随显示标题)
滚动条案例(点击跳转到指定地点,上下滑动跟随显示标题)
|
测试技术 API
软件测试面试题:在一个页面上,点击一个链接之后不会在当前页面上打开此链接而是新开一个窗口打开此页面。
软件测试面试题:在一个页面上,点击一个链接之后不会在当前页面上打开此链接而是新开一个窗口打开此页面。
104 0
|
前端开发 JavaScript
制作四个选项卡页 Tab,用户可以通过切换不同的 Tab 页查看不同类别的新闻信息,每个 Tab 有对应的内容版块,点击某个选项卡时,显示对应的内容版块,隐藏其他内容版块,并且为了突出当前的选项卡,还
制作四个选项卡页 Tab,用户可以通过切换不同的 Tab 页查看不同类别的新闻信息,每个 Tab 有对应的内容版块,点击某个选项卡时,显示对应的内容版块,隐藏其他内容版块,并且为了突出当前的选项卡,还
224 0
制作四个选项卡页 Tab,用户可以通过切换不同的 Tab 页查看不同类别的新闻信息,每个 Tab 有对应的内容版块,点击某个选项卡时,显示对应的内容版块,隐藏其他内容版块,并且为了突出当前的选项卡,还
tab栏切换制作(点击那一栏显示那一栏的内容,其他栏的内容隐藏)
tab栏切换制作(点击那一栏显示那一栏的内容,其他栏的内容隐藏)
tab栏切换制作(点击那一栏显示那一栏的内容,其他栏的内容隐藏)
电脑版敬业签记事本软件如何清除某个分类所有内容
敬业签,是一款可以备忘、记录、提醒的电脑手机云同步记事本软件。一个敬业签可以创建25项分类,每项分类500条便签,每条便签500个汉字。
1177 0