我在一个较早的(非 jQuery)脚本定义的页面上遇到了这个错误Object.prototype.extend
,所以当jQuery
试图调用jQuery.extend
(在 的定义内jQuery.Deferred
,它是 的构造函数readyList
)时,它被非 jQuery 定义覆盖。这导致readyList
不继承该promise
方法,从而导致错误。
例如,以下 HTML 在错误控制台中重新创建“TypeError: readyList.promise is not a function”错误:
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8">
</head>
<body>
<script type="text/javascript">
Object.prototype.extend = function(){
console.log('Object.prototype.extend', this, arguments);
for (var i = 0; i < arguments.length; i ++) {
var object = arguments[ i ];
for ( var property in object ) {
try {
if ( !this[ property ] &&
object.hasOwnProperty( property ) )
this[ property ] = object[ property ];
} catch( e ){}
}
}
return this;
};
</script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
</body>
</html>
(覆盖很奇怪:jQuery.extend
被定义,然后调用一个对象文字来扩展 jQuery 本身。在此期间,原始jQuery.extend
找到对象文字的extend
属性(指Object.prototype.extend
),并愉快地使用它来设置jQuery
的extend
属性,覆盖自己)。
您的错误可能是由同一件事引起的。
要修复它,请在包含 jQuery 之前尝试包含一个小脚本,以删除任何现有的定义Object.prototype.extend
并查看是否可以解决问题:
<script type="text/javascript">
delete Object.prototype.extend;
</script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>