鉴于 websinte 的这种结构
<html>
<head>
<!-- CSS at the beginning-->
<link/>
</head>
<body>
<div id="mainContainer">
<div id="side"></div>
<div id="content">
<!-- DHTML awesomeness happens here -->
</div>
</div>
<!-- Scripts at the end -->
<script/>
<script>
/* code that attach the JS logic to the HTML items */
</script>
</body>
</html>
使用普通的网络导航,页面完全呈现在 HTML 中,并遵循渐进增强的方法,最后我寻找一些特定的 id 或类,并使用 javascript 和特别是 jQuery 为它们提供动态行为。在下载外部脚本之后,此增强代码发生在正文的最后。
在#content
中,发生了很多 jQuery AJAX 交互,其中一些从服务器获取其他部分视图并将它们插入到页面中,但是我必须再次查找这些 id 和类并将 javascript 对象附加到这些新元素。
这可能非常麻烦,因为您不想将控制器、事件处理程序或其他任何东西重新应用于已经拥有它们的对象。
到目前为止,我发现的唯一解决方案是放在我的部分视图中:
@if(Request.IsAjaxRequest())
{
<script>
/* code that attach the JS controllers to the HTML items of this view */
</script>
}
我认为类似的问题会发生,例如当你想要动态$('input.date').datepicker()
添加新<input type="text" class="date"/>
元素时,除非你重新执行 jQuery 语句,否则新元素没有日期选择器。
例如,考虑到#content
我有一个<input type="text" class="date"/>
:
为了使 jQuery datepicer 第一次工作,我必须在外部声明之后的
$('input.date').datepicker()
, 末尾调用。<body>
<script>
如果页面下载了新元素的部分视图
<input type="text" class="date"/>
,我必须将初始化调用放在 ajax 调用的视图中。
所以我以重复的代码结束,这是我不希望在 JS 中特别想要的,因为我无法像在 C# 中那样轻松地重构代码。
这是上周让我发疯的事情,想知道是否有更好的方法来实现这一点?更好的技术,还是其他整体方法?
您如何构建您的 Web 应用程序?
亲切的问候。
PS:如果有类似.live()
或.delegate()
不仅与事件相关的东西会很好,不是吗?每次将某些内容添加到 DOM 时,jQuery/浏览器是否会引发任何事件?