【问题标题】:Script on parent site not working on child site: $.Deferred is not a function父站点上的脚本在子站点上不起作用:$.Deferred 不是函数
【发布时间】:2015-08-18 17:15:04
【问题描述】:

我有一个基于父网站构建的网站,并且需要尽可能相同。我的客户有一个过程,他们通过该过程获取父站点的所有脚本和 css 文件并使用它们来创建子站点。但是,对于其中一个网站,我在主 javascript 文件中遇到了一个错误,该错误在父网站上没有发生。

这是两个网站:

parent site

child site

主要问题是页面顶部的轮播(我相信它使用的是 slickslider)没有在子站点上初始化。我不确定这是否是因为 Javascript 错误,如果您能找出它不起作用的原因,我将非常感激,因为这是手头的主要问题。也就是说,我现在假设我的问题是 main.js 中的 javascript 错误:

Uncaught TypeError: l.Deferred is not a function

同样,父站点上没有错误,但子站点上的 l.Deferred 中断。为什么它不起作用?

我尝试将 l 包装在 jQuery 中 -- $(l).Deferred -- 但是当我这样做时,它似乎会导致一个循环,页面会在超时和崩溃之前花费几分钟尝试加载。

如果您能告诉我为什么我的子网站上的滑块不起作用,或者至少为什么 l.Deferred 会损坏,那将是一个巨大的帮助。

编辑:更新以使用正确版本的 jquery:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>jq11 = jQuery.noConflict(true);</script>
<script src="/sites/all/themes/wma2/js/main.js"></script>

(function($){
    window.matchMedia || (window.matchMedia = function(){....
})(jq11);

更新:我检查了控制台,当它说 l.Deferred 不是函数时,$.fn.jQuery 正在使用 jquery 1.11.2

我还尝试将 l 包装在正确的 jquery 中:

jq11(l).Deferred

但是当我这样做时,页面会陷入循环并在尝试加载几分钟后崩溃。

【问题讨论】:

  • 看起来你在一个 JS 文件中有语法错误

标签: javascript jquery slider deferred slick.js


【解决方案1】:

我不是 100% 确定“他们通过它获取父站点的所有脚本和 css 文件并使用它们创建子站点的过程”是什么意思,但客户端页面至少在某些时候加载 jQuery 1.4 .4(检查头中最后 3 个包含脚本中的第一个)。

$.Deferred 直到 jQuery 1.5 才引入,https://api.jquery.com/jquery.deferred/ 因此尝试使用 1.4.4 运行任何东西都会引发错误,因为该函数确实不存在。

页面上的最后一个脚本加载另一个整个 jQuery 副本,而那个 1.11 确实支持 Deferreds。但它几乎是在页面上运行的最后一件事,所以几乎没有代码使用它。所以你有一个旧的 jQuery,然后是尝试在新的 jQuery 中使用方法的代码,最后是新的 jQuery。这就是为什么 jQuery 和 $ 甚至没有分配给同一事物的原因,您可以在控制台中确认:

jQuery.fn.jquery: "1.4.4"

$.fn.jquery: "1.11.2"

您的代码可能使用旧的 1.4.4 语法,因此您可能无法替换它,但如果您确实需要两个版本,最好将所有代码显式包装在 IIFE 中

(function($){ 
  /* code using $, which maps to whatever is specified at the end*/   
})(jQuery);

指定您要使用两者中的哪一个。

【讨论】:

  • 感谢您的关注!因此,我将整个 main.js 脚本包装在 (function($){})(jQuery) 中,但我认为我做得不对。我现在收到错误 $(...).on is not a function。我错过了什么?如果您想检查它,子页面上的脚本会更新。
  • 另外,你怎么知道它使用的是哪个版本?
  • 直接在控制台输入 jQuery.fn.jquery 或 $.fn.jquery 即可。您现在遇到的错误基本上是相同的问题: $.fn.on 没有在 jQuery 1.4.4 中定义,但是无论您输入 IIFE 的 jQuery 是否包含 $(...).on 的使用,仍然是 1.4 .4,而不是 1.11.2
  • 在这种情况下,您的 IIFE 低于 1.11.2 脚本可能应该使用 (function($){ })(jq11) 甚至 (function($) { })($) 听起来很奇怪。两者都映射到支持 $.Deferred 和 $.fn.on 的版本,但 noConflict 将“jQuery”本身的控制权交还给 1.4.4 版本。 $.fn.jquery "1.11.2" jQuery.fn.jquery "1.4.4" jq11.fn.jquery "1.11.3"
  • 我编辑了我的原始帖子以显示我的最新更改。我在 main.js 脚本上方添加了对 jquery 1.11 的新引用,使用了 noConflict 并在 (function($)) 包装中指定了版本,但它仍然认为 l.Deferred 不是函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多