2012-03-01 37 views
0

很难在一个问题中总结,但这里有详细信息:如何在我选择JavaScript完成执行的方法后触发事件以触发事件?

我有一个ASP.NET MVC 3项目(其中许多实际上)。

我的标准做法是为每个视图创建一个Init()方法,当文档准备好时触发。这就是我把我所有的UI代码,例如渲染按钮和手风琴等

我使用的伎俩来隐藏由html标签设置为display: noneInit()完成未格式化的HTML元素,我可以取消隐藏一切。

这很有效,但我最初在布局页面中显示了内容,但在视图的Init代码完成运行之前会执行该操作。如果我用自己的Javascript使用部分视图,它会变得更加复杂。

我想将一个回调附加在一个地方,在我所有可能的Init()调用完成后触发。

我试过使用自定义事件,但后来我不得不在每个Init方法结束时触发它们,这不是非常有效。

在此先感谢您的帮助。

请求的代码:

布局页面

<script> 
    $("html").addClass('init') // init has display: none 
    $(function() { 
      InitLayout() // Basic stuff for every page like menu, buttons, etc 

      $("html").removeClass('init'); // show all content 
    }); 
</script> 

查看页面

<script> 
    $(function() { 
     ViewInit() // Init all custom ui elements on page: tabs, accordions, etc 
    }); 
</script> 

的问题是,removeClass将每一页的Init火灾发生之前。我试图找到一种方法来避免在每个Init方法的底部都有removeClass调用。有没有某种方式来以编程方式附加回调以避免重复代码。我的主要目标是实现隐藏无格式内容,直到全部内容全部完成,因此我不必在每个视图中担心它。

+0

发布至少一些伪代码,给出一些事件序列的想法...否则问题是有点抽象 – charlietfl 2012-03-01 19:21:09

+0

我注意到你用jQuery标记了这个。你使用'$(document).ready()'? – bhamlin 2012-03-01 19:30:15

+0

@charlietfl我添加了一些代码来帮助演示。 – IronicMuffin 2012-03-01 21:41:37

回答

0

您可以尝试将init过程的发生注册到全局变量(数组)中。这应该在document.ready()或JQuery等效之外完成。因此在<script>标签内。

当您的Init函数在document.ready()事件处理程序或它的JQuery等效内部完成时,取消注册发生。

注销时,检查是否有任何剩余事件,如果没有,请修改您的html样式。

在这种情况下,脚本解析和DOM实际完成加载之间的差距可能适用于您。

+0

所以现在我必须添加代码给每个方法调用检查它是否是数组中的最后一个?也许像这样的东西可以用deferreds和$ .when()来完成...... – IronicMuffin 2012-03-01 21:44:13

+0

不是真的,如果你有一个全局函数来取消订阅init,你可以在那里执行检查,只需在init中调用该函数 – 2012-03-01 21:46:02