1

我正在尝试实现此方法: 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)

4

1 回答 1

3

变老的一个好处是,当我看到您的错误消息时,我的第一个想法是“嗯……该$()功能真的是您认为的那样吗?” :-)

你看,jQuery 的$()函数永远不会返回nullundefined. jQuery()如果您以该名称称呼它,也不会。即使你给它一个不匹配任何元素的选择器,它也会返回一个空的 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。这是关于该主题的出色文章:

避免与其他库的冲突

(感谢@acdcjunior提供参考!)

顺便说一句,jQuery 的多个版本与此问题无关。但是,您真的需要同时加载 1.8.2 和 1.8.3 吗?导致兼容性问题的这两者之间有什么区别?

于 2013-06-28T23:15:30.277 回答