asp.net控件事件 导致onbeforunlad 重复提示的解决方案(仅针对IE)


   由于项目中有个这样的需求,节点被编辑后。如果没有保存在离开页面时需要提示是否先保存。其实这个需求很简单,解决方案网上一搜一大堆。就是
        window._edit = false;
        window.onbeforeunload = function (event) {             if (window._edit)
                return "各个节点已编辑,还未保存?";
        }
 
    可是这样就带来一个问题。当我们点击【保存】按钮时也会弹出离开提示。这样肯定是不符合需求的。因为我们的asp:button 到最后无非也是通过 __doPostBack方法来调用 submit();事件来进行服务端回发。所以我们可以在__doPostBack方法时将_edit变量设置为false,这样我们保存按钮点击时就可以不弹出该提示了。代码以下这段代码。
         window.onload =function(){
              window.___doPostBack = __doPostBack;
              __doPostBack = function () {
                  window._edit = false;
                  ___doPostBack.apply(this, arguments);
            }
         }
 
  如果您是使用 asp:linkButton 的话,恭喜你。上面那段代码可能帮不了你。为什么呢?我们先来看看asp:linkButton生成的HTML
<a id="save" href="javascript:__doPostBack(&#39;save&#39;,&#39;&#39;)">[保存]</a>
刚开始看可能看不出什么问题来。不过看了链接的文章你就会清楚了。
 如果嫌长不想看的话,最关键其实就是下面这句
 “在这些触发条件中绝大多数都使页面产生了跳转,但还缺少一些常见情况说明,即页面 URL 可能发生了变化但没有产生跳转。比如 "javascipt:" "mailto:" 等常见的浏览器内置伪协议,以及由第三方或用户自定义的为协议时,页面并不跳转,而是根据伪协议执行指定的行为。这个情况应加入到触发条件中。”
  
 很明显我们的HTML中使用伪代码协议"javascript:",所有又触发一次onbeforeunload而且最要命的就是在调用__doPostBack之前就触发onbeforunload事件,所以在执行__doPostBack就会弹出离开提示了。这里我们就不得不对a这个元素进行一个变化。代码如下:

           var save = document.getElementById("save");

            save._href = save.href;

            save.href = "javascript:void(0)";

            save.onclick = function () {

                eval(save._href);

            }

 当然如果你运气实在差。asp:button 的UseSubmitBehavior没有设置成false的话。那么还是改成false吧。至于原因,查看下生成的HTML 就能知道具体的原因了。

posted @ 2012-12-07 22:36  ksh.xy  阅读(408)  评论(0编辑  收藏  举报