jquery错误无法调用null的方法

时间:2013-06-28 21:20:29

标签: jquery

我正在尝试实现此方法: http://www.webtutorialplus.com/sticky-header-on-scroll-jquery/

我的网站上有一个粘性标题 http://storkbox.gopagoda.com/

我希望灰色菜单是粘性的,但我收到错误:

Uncaught TypeError: Cannot call method 'waypoint' of null 

$('.container').waypoint('sticky');

页面上有一个带有一类容器的div,所以它永远不应为null

我不知道为什么,我唯一的猜测是它是jquery 1.8.2和1.8.3之间的区别,但是我可以同时运行两个实例(粘性插件需要1.8.3,其余的插件要求1.8.2)

1 个答案:

答案 0 :(得分:3)

老了的一个好处是,当我看到你的错误信息时,我的第一个想法是"嗯...... $()功能真的是你认为的吗?" : - )

你知道,jQuery的$()函数永远不会返回nullundefinedjQuery()如果你以该名称称呼它也不会。即使你给它一个不匹配任何元素的选择器,它也会返回一个空的jQuery对象 - 很像[],一个空数组 - 而不是任何东西。

所以你唯一能得到这个错误的方法是:

Cannot call method 'waypoint' of null

在这行代码上:

$('.container').waypoint('sticky');

如果$ jQuery函数。因为这就是错误所说的内容:您正试图致电null.waypoint()。唯一可能发生的方法是$('.container')调用返回null

确实是这样的:您正在加载jQuery和Prototype.js,并且在您遇到错误时,您正在调用Prototype的$函数版本。

在此尝试此操作:在打开开发人员工具的情况下将您的页面加载到Chrome中。它应停在.waypoint()来电。

现在,点击Esc打开迷你控制台(或点击开发者工具顶部的控制台选项卡),然后在控制台中输入:

$

将显示:

function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (Object.isString(element))
    element = document.getElementById(element);
  return Element.extend(element);
}

现在输入:

jQuery

,它将显示:

function (e,t){return new v.fn.init(e,t,n)}

绝对不是同一个功能!

或者对于简单测试,请键入:

$ === jQuery

并打印:

false

糟糕。

要解决此问题,您可能需要使用jQuery的noConflict()功能,这样您就可以同时使用jQuery和Prototype。这是关于这个主题的优秀文章:

Avoiding Conflicts with Other Libraries

(感谢@acdcjunior提供参考!)

BTW,jQuery的多个版本与此问题无关。你真的需要加载1.8.2和1.8.3吗?这两者导致兼容性问题的区别是什么?