我正在尝试实现此方法: 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)
答案 0 :(得分:3)
老了的一个好处是,当我看到你的错误信息时,我的第一个想法是"嗯...... $()
功能真的是你认为的吗?" : - )
你知道,jQuery的$()
函数永远不会返回null
或undefined
。 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。这是关于这个主题的优秀文章:
Avoiding Conflicts with Other Libraries
(感谢@acdcjunior提供参考!)
BTW,jQuery的多个版本与此问题无关。你真的需要加载1.8.2和1.8.3吗?这两者导致兼容性问题的区别是什么?