Ajax使用外部Javascript引用加载部分视图

时间:2012-11-26 02:52:41

标签: jquery ajax asp.net-mvc-3 javascript-events

我有一个基本上只是一个网页的网站,它使用ajax使用部分视图在页面之间导航。问题是网站的一部分是多页面形式(实际上是六页)。您可能已经猜到,这是一个非常大的形式,我想通过使用window.onbeforeunload事件防止用户意外地从窗口导航。 (请忽略这样一个事实,即无论如何这都不起作用,因为当前设计唯一可能发生的情况是用户点击刷新)。

现在,如果我离开页面,window.onbeforeunload处理程序仍然附加到窗口,这显然不是我想要的。

我们需要一种“拆除”在网站静态部分运行的事件的方法。我们怎么会开始这样做。

1 个答案:

答案 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方法才能使其工作,但我认为它提供了一个很好的框架处置和构建实际部分以外的事件。