由于项目中有个这样的需求,节点被编辑后。如果没有保存在离开页面时需要提示是否先保存。其实这个需求很简单,解决方案网上一搜一大堆。就是
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('save','')">[保存]</a>
刚开始看可能看不出什么问题来。不过看了链接的文章你就会清楚了。
http://w3help.org/zh-cn/causes/BX2047
如果嫌长不想看的话,最关键其实就是下面这句
“在这些触发条件中绝大多数都使页面产生了跳转,但还缺少一些常见情况说明,即页面 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 就能知道具体的原因了。