变老的一个好处是,当我看到您的错误消息时,我的第一个想法是“嗯……该$()
功能真的是您认为的那样吗?” :-)
你看,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。这是关于该主题的出色文章:
避免与其他库的冲突
(感谢@acdcjunior提供参考!)
顺便说一句,jQuery 的多个版本与此问题无关。但是,您真的需要同时加载 1.8.2 和 1.8.3 吗?导致兼容性问题的这两者之间有什么区别?