我有一个基本上只是一个网页的网站,它使用ajax使用部分视图在页面之间导航。问题是网站的一部分是多页面形式(实际上是六页)。您可能已经猜到,这是一个非常大的形式,我想通过使用window.onbeforeunload事件防止用户意外地从窗口导航。 (请忽略这样一个事实,即无论如何这都不起作用,因为当前设计唯一可能发生的情况是用户点击刷新)。
现在,如果我离开页面,window.onbeforeunload处理程序仍然附加到窗口,这显然不是我想要的。
我们需要一种“拆除”在网站静态部分运行的事件的方法。我们怎么会开始这样做。
答案 0 :(得分:0)
我们想出了一个非常酷的解决方案来解决这个问题。我们的部分视图中引用的所有脚本都包含在类中:
Namespace.ClassName = function(){
function init(){
...
}
//Other Private methods go here.
init();// A call to the init function
}
在我们的layout.cshtml中,我们包含对所有脚本文件的引用,在我们的主脚本文件中,我们有一个将主题标签映射到函数指针的字典(我们使用主题标签来使用ajax在站点中导航)。
var dict = {};
dict["HashTag1"] = Namespace.ClassName;//A function pointer pointing to the script
//for this URL. Doesn't execute anything
dict["HashTag2"] = Namespace.ClassName1;
这样做的一个缺陷是,这意味着每个部分只能有一个与之关联的脚本文件。
Anywho,在我们更新部分呈现的容器内容的函数中,它跟踪当前脚本文件,并接受两个参数数据和我们想要使用的脚本的类名,如此。调用函数从字典中获取脚本名称:
var currentJSClass;
function UpdateContent(data,jsClass){
if (currentJSClass&& currentJSClass.dispose) {
currentJSClass.dispose(); //If the current class has a a dispose
//method, call it.
}
$("#partialContent").html(data);
if (jsClass) {
currentJSClass= new class();//Run the function we have
//pointed to
}
else {
currentJSClass= jsClass; //set the current class
}
}
这有一些限制,例如在部分视图中引用的所有脚本都必须是上面指定的格式,并且它们必须具有dispose方法才能使其工作,但我认为它提供了一个很好的框架处置和构建实际部分以外的事件。