【问题标题】:Unobtrusive Ajax stopped working after update jQuery to 1.9.0Unobtrusive Ajax 在将 jQuery 更新到 1.9.0 后停止工作
【发布时间】:2013-01-18 03:14:26
【问题描述】:

我刚刚将 jQuery 和 jQuery UI 更新为: jquery-1.9.0.min.js 和 jquery-ui-1.9.2.min.js

而且...我所有不显眼的 Ajax 调用(Ajax.ActionLink、Ajax.BeginForm)都停止正常工作 - 它们在新页面中打开结果,而不是更新现有的 div。

当我的页面加载时,我在 Firebug 中收到了这个 javascript 错误:

代码当然没有改变,只是使用 Nuget 更新了 jQuery 脚本。

有人遇到过同样的问题吗??

【问题讨论】:

  • 我也遇到过同样的问题。我建议将 jquery 降级回 1.8.3,直到对 jquery 不显眼的验证进行更新。

标签: jquery asp.net-mvc-3 unobtrusive-ajax


【解决方案1】:

更新:此问题已在最新的 NuGet 包中得到修复。我已经发布了另一个答案来反映这一点。 https://stackoverflow.com/a/15539422/714309


jquery.unobtrusive-ajax.js中,找到并替换这四行:

  1. $("a[data-ajax=true]").live("click", function (evt) {

    $(document).on("click", "a[data-ajax=true]", function (evt) {

  2. $("form[data-ajax=true] input[type=image]").live("click", function (evt) {

    $(document).on("click", "form[data-ajax=true] input[type=image]", function (evt) {

  3. $("form[data-ajax=true] :submit").live("click", function (evt) {

    $(document).on("click", "form[data-ajax=true] :submit", function (evt) {

  4. $("form[data-ajax=true]").live("submit", function (evt) {

    $(document).on("submit", "form[data-ajax=true]", function (evt) {

您还可以使用 WebGrease 生成新的jquery.unobtrusive-ajax.min.js。 在命令提示符下,切换到您的解决方案文件夹并输入此命令(假设您的项目文件夹名为 Web):

packages\WebGrease.1.3.0\tools\WG.exe -m -in:Web\Scripts\jquery.unobtrusive-ajax.js -out:Web\Scripts\jquery.unobtrusive-ajax.min.js

【讨论】:

  • 第 115、124、140 和 151 行;您也可以使用在线缩小器,但答案很好。
  • 感谢您提供更详细的信息。首先,我只将 .live 更改为 .on,但仅此一项不起作用。
  • 我收到 "Unexpected token u" 错误,我按照您的建议进行操作后,您能帮忙吗?
  • 尝试其他答案自动更新文件:stackoverflow.com/a/15539422/714309
【解决方案2】:

Microsoft jQuery Unobtrusive Ajax NuGet 包更新到最新版本。

在 Visual Studio 中,从 工具 菜单中选择 Library Package Manager,然后单击 Package Manager Console。在提示符处输入:

Update-Package Microsoft.jQuery.Unobtrusive.Ajax

此问题已在 Microsoft jQuery Unobtrusive Ajax 2.0.30116.0(2013 年 2 月 18 日星期一)中得到修复,它用推荐的 .on() 替换了对 .live() 方法的调用(在 jQuery 1.7 和 removed from jQuery 1.9 中已弃用)方法。

【讨论】:

  • 这是现在最好的解决方案。另外,请确保在升级 javascript 包时清除浏览器的缓存。
【解决方案3】:

.live() 自 1.7 起已被弃用,正式名称为 removed in jQuery 1.9。请改用.on(),因为它是执行same thing 的首选方法。

【讨论】:

  • 实际上.delegate() 也已被弃用:-) 现在你想要的是.on()
  • @Pointy AH...他们将该信息隐藏在侧边栏上。我会修正我的答案。
  • @Sigourney_Weaver 我看到了你的困境。 .live() 被弃用和删除实际上是一件好事。众所周知,它已经被弃用了很长一段时间,并且有很多警告表明它将被删除。这是一种相当庞大的方法,如果涉及太多对象,可能会降低性能。它已被.live() 取代,这是一种更有效的方法,允许与动态创建的对象进行更大的交互。尽管我不推荐这个,jQuery 1.8.3 是支持.live() 的最后一个版本。最好升级你的脚本。
  • 谢谢,spryno724,是的,这是真的,jQuery 1.8.3 是最后一个支持 MVC3 jquery.unobtrusive-ajax.min.js 的版本。但是,它不是“我的”,我说的 MVC3 jquery.unobtrusive-ajax.min.js 脚本是 MVC3 框架附带的库。问题来了 - jQuery 团队正在对核心 jQuery 库进行更改,而 Microsoft MVC3 jquery.unobtrusive-ajax.min.js 仍然依赖于 alder 版本(直到 1.8.3 的任何版本):asp.net/ajaxlibrary/cdn.ashx#ASPNET_MVC_Releases_on_the_CDN_14
  • 您也可以只包含 jQuery Migrate 插件,旧代码​​应该可以正常工作。请记住在更新旧插件后将其删除。 github.com/jquery/jquery-migrate#readme
【解决方案4】:

解决 jQuery 中的重大更改问题的最简单方法(在我看来)是安装 jQuery.Migrate 包,它使您能够使用从 1.9.0 版本开始删除的不推荐使用的函数调用。至少在微软更新不显眼的 ajax 插件之前。

此外,不显眼的 ajax 插件的夜间构建似乎更新了 api 调用。我还没有测试过,但是你可以在asp.net codeplex page找到如何获取它。

更新: Unobtrusive Ajax 和 Validation Nuget 包已更新,因此不再需要 jQuery.Migrate 包。

【讨论】:

    【解决方案5】:

    还需要做这些修复:

    更新 jQuery.Validation 插件 (to fix this problem)

    https://nuget.org/packages/jQuery.Validation/1.11.0    (first available on nuget 2/4/13)
    

    同时对 jquery.unobtrusive-ajax.js 文件 (see here for Connect issue) 进行这些更改

    Line 43: replace = container.attr("data-valmsg-replace") && $.parseJSON(container.attr("data-valmsg-replace")) !== false;
    
    Line 73: replace = container.attr("data-valmsg-replace") && $.parseJSON(container.attr("data-valmsg-replace"));
    

    【讨论】:

      【解决方案6】:

      替换

      .live(function)
      

      .on(eventType, selector, function)
      

      https://stackoverflow.com/a/14354091/358906

      【讨论】:

      • 警告,这在某种程度上破坏了我的 Ajax 功能与不显眼的 ajax。
      【解决方案7】:

      这是一个适合您的实际缩小文件。反正对我有用。我只是手动编辑的。

          /*
      ** Unobtrusive Ajax support library for jQuery
      ** Copyright (C) Microsoft Corporation. All rights reserved.
      */
      (function(a){var b="unobtrusiveAjaxClick",g="unobtrusiveValidation";function c(d,b){var a=window,c=(d||"").split(".");while(a&&c.length)a=a[c.shift()];if(typeof a==="function")return a;b.push(d);return Function.constructor.apply(null,b)}function d(a){return a==="GET"||a==="POST"}function f(b,a){!d(a)&&b.setRequestHeader("X-HTTP-Method-Override",a)}function h(c,b,e){var d;if(e.indexOf("application/x-javascript")!==-1)return;d=(c.getAttribute("data-ajax-mode")||"").toUpperCase();a(c.getAttribute("data-ajax-update")).each(function(f,c){var e;switch(d){case"BEFORE":e=c.firstChild;a("<div />").html(b).contents().each(function(){c.insertBefore(this,e)});break;case"AFTER":a("<div />").html(b).contents().each(function(){c.appendChild(this)});break;default:a(c).html(b)}})}function e(b,e){var j,k,g,i;j=b.getAttribute("data-ajax-confirm");if(j&&!window.confirm(j))return;k=a(b.getAttribute("data-ajax-loading"));i=b.getAttribute("data-ajax-loading-duration")||0;a.extend(e,{type:b.getAttribute("data-ajax-method")||undefined,url:b.getAttribute("data-ajax-url")||undefined,beforeSend:function(d){var a;f(d,g);a=c(b.getAttribute("data-ajax-begin"),["xhr"]).apply(this,arguments);a!==false&&k.show(i);return a},complete:function(){k.hide(i);c(b.getAttribute("data-ajax-complete"),["xhr","status"]).apply(this,arguments)},success:function(a,e,d){h(b,a,d.getResponseHeader("Content-Type")||"text/html");c(b.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(this,arguments)},error:c(b.getAttribute("data-ajax-failure"),["xhr","status","error"])});e.data.push({name:"X-Requested-With",value:"XMLHttpRequest"});g=e.type.toUpperCase();if(!d(g)){e.type="POST";e.data.push({name:"X-HTTP-Method-Override",value:g})}a.ajax(e)}function i(c){var b=a(c).data(g);return!b||!b.validate||b.validate()}a(document).on("click", "a[data-ajax=true]", function(a){a.preventDefault();e(this,{url:this.href,type:"GET",data:[]})});a(document).on("click", "form[data-ajax=true] input[type=image]", function(c){var g=c.target.name,d=a(c.target),f=d.parents("form")[0],e=d.offset();a(f).data(b,[{name:g+".x",value:Math.round(c.pageX-e.left)},{name:g+".y",value:Math.round(c.pageY-e.top)}]);setTimeout(function(){a(f).removeData(b)},0)});a(document).on("click","form[data-ajax=true] :submit", function(c){var e=c.target.name,d=a(c.target).parents("form")[0];a(d).data(b,e?[{name:e,value:c.target.value}]:[]);setTimeout(function(){a(d).removeData(b)},0)});a(document).on("submit","form[data-ajax=true]",function(d){var c=a(this).data(b)||[];d.preventDefault();if(!i(this))return;e(this,{url:this.action,type:this.method||"GET",data:c.concat(a(this).serializeArray())})})})(jQuery);
      

      【讨论】:

        【解决方案8】:

        只需更新您的脚本

        1. 下载最新的 Jquery,(不过我用的是 jquery-1.11.0)

        2. 从微软官方下载最新的Microsoft.jQuery.Unobtrusive.Ajax

        从这里开始:

        https://github.com/aspnet/jquery-ajax-unobtrusive

        3. 硬刷新或清除浏览器缓存并再次检查您的页面。

        希望能帮助别人。

        【讨论】:

          猜你喜欢
          • 2012-09-05
          • 2014-07-10
          • 2013-03-23
          • 1970-01-01
          • 2014-08-24
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多