jquery - 如何构建 Web 应用程序以使 AJAX 和 DHTML 更容易?

标签 jquery asp.net-mvc asp.net-mvc-3 dhtml progressive-enhancement

鉴于 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>

使用正常的 Web 导航,页面完全以 HTML 形式呈现,并遵循渐进增强方法,最后我会查找一些特定的 id 或类,并使用 javascript(特别是 jQuery)为它们提供动态行为。此增强代码发生在正文的最后,在下载外部脚本之后。

#content ,发生了很多 jQuery AJAX 交互,其中一些从服务器获取其他部分 View 并将它们插入到页面中,但随后我必须再次查找这些 id 和类并将 javascript 对象附加到这个新元素。

这可能非常麻烦,因为您不想将 Controller 、事件处理程序或其他任何内容重新应用到已经拥有它们的对象。

到目前为止,我找到的唯一解决方案是放在我的部分 View 中:

@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"/> :

  1. 为了使 jQuery datepicer 第一次工作,我必须 调用$('input.date').datepicker()<body> 的末尾, 外部后<script>声明。

  2. 如果页面下载了新的部分 View <input type="text" class="date"/> elements,我必须将初始化调用放在ajax View 中 来电。

所以我以重复的代码结束,这是我不想要的,特别是在 JS 中,因为我无法像在 C# 中那样轻松地重构代码。

上周这件事让我抓狂,想知道是否有更好的方法来实现这一目标?更好的技术,还是其他整体方法?

您如何构建 Web 应用程序?

亲切的问候。

PS:如果有类似 .live() 的东西就好了或.delegate()但不仅仅与事件有关,不是吗?每次向 DOM 添加内容时,jQuery/浏览器是否都会引发任何事件?

最佳答案

如果我理解正确的话,这可能只是您问题的部分答案。

关于您的示例 <input type="text" class="date" /> ,我们在使用 jQuery 非侵入性验证的部分表单 View 中遇到了类似的问题。当在浏览器中加载它们时,我们必须调用 $.validator.unobtrusive.parse('a form selector');以便在下一次提交表单时应用验证规则。

如果您的目标是避免重复的代码,您可以使用 jq 不引人注目的验证库中的模式使 js 操作不引人注目。所以你最终会得到看起来更像这样的 HTML:

<input type="text" class="date" data-datepicker="true" />

然后您可以将初始化逻辑放入不显眼的解析方法中。

parse: function(selector) {
    $(selector).find(':input[data-datepicker=true]').each(function() {
        $(this).datepicker();
    }
};

}

这解决了您在一个地方重构代码的问题。您可以使其在页面首次加载时自动启动,并且当您通过ajax加载新内容时,只需调用myAppNamespace.unobtrusive.parse('selector for the partial view content');即可将规则应用于所有匹配的元素。

更新

查看脚本文件夹中的 jquery.validate.unobtrusive.js 文件。它确实非常智能,如果您实际上没有扩展另一个 jquery 插件(例如 validate),您的代码最终会变得更精简。如果您正在寻求 HTML 和脚本的完全分离,那么在我看来,使用 HTML5 不显眼的数据属性是一个很好的解决方案。

关于jquery - 如何构建 Web 应用程序以使 AJAX 和 DHTML 更容易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8346437/

相关文章:

javascript - 初始化Datatable对象后定义选项的函数

javascript - 无效值错误: setPosition: not a LatLng or LatLngLiteral: not an Object

javascript - 图像悬停时取消 slider

c# - 如何避免两次声明数据库字段,一次在数据库中,一次在存储库/模型中?

html - 表格对齐=居中||是的,区别在于<br/>

javascript - 将 JSON 数据加载到 Bootstrap 模式中

c# - 如何使 FluentValidation 忽略一个属性

c# - Global.asax 中的 Session_OnEnd 重定向到 Controller 操作 MVC ASP.NET

参数不起作用的 AjaxOptions OnSuccess 回调

asp.net-mvc-3 - Telerik MVC 网格在运行时来自集合或字典的动态列