我有一个使用MooTools的网站。我已经得到了以下错误,但无法弄清楚是什么导致了它。我很少有运气追踪它。有谁知道这可能是什么?我还没能在网上找到任何关于它的东西。
未捕获的TypeError:无法读取属性' call' undefined mootools-core.js:4497
条件mootools-core.js:4497
defn mootools-core.js:4511
Stackoverflow有this个问题,但据我所知,它没有关系。想法?
看了这一点之后,错误的原因仍然很神秘。我的代码中的违规行是addEvent调用:
window.addEvent('load', preloader(preload));
变量preload
是一个图像网址数组。回调preloader
是一种预加载preload
中指定的图像的方法。这是预加载器方法:
/**
* Event callback that preloads images
*/
function preloader(images) {
var img;
if ( images ) {
for (var i=0; i<images.length; i++) {
img = new Image();
img.src = images[i];
}
}
}
错误指定的mootools代码行是:
addEvent: function(type, fn){
var events = this.retrieve('events', {});
if (!events[type]) events[type] = {keys: [], values: []};
if (events[type].keys.contains(fn)) return this;
events[type].keys.push(fn);
var realType = type,
custom = Element.Events[type],
condition = fn,
self = this;
if (custom){
if (custom.onAdd) custom.onAdd.call(this, fn, type);
if (custom.condition){
condition = function(event){
//error here--> if (custom.condition.call(this, event, type)) return fn.call(this, event);
return true;
};
}
if (custom.base) realType = Function.from(custom.base).call(this, type);
}
var defn = function(){
return fn.call(self);
};
var nativeEvent = Element.NativeEvents[realType];
if (nativeEvent){
if (nativeEvent == 2){
defn = function(event){
event = new DOMEvent(event, self.getWindow());
if (condition.call(self, event) === false) event.stop();
};
}
this.addListener(realType, defn, arguments[2]);
}
events[type].values.push(defn);
return this;
},
答案 0 :(得分:1)
尔。你没有将函数作为回调传递。
这样:
window.addEvent('load', preloader(preload));
/**
* Event callback that preloads images
*/
function preloader(images) {
var img;
if ( images ) {
for (var i=0; i<images.length; i++) {
img = new Image();
img.src = images[i];
}
}
}
它基本上会立即调用preloader
函数,而不是onload
- 并且它会尝试将事件绑定到preloader
函数的结果,该函数根本不会返回任何内容
当口译员看到preloader(preload)
时,它就会立即运行。你可以返回一个函数或更好的函数,重写为:
window.addEvent('load', function(){ preloader(preload); });
// or even
window.addEvent('load', preloader.bind(this, preload));
运行示例:
var imagesArray = new Array(50).join(',').split(',');
imagesArray = imagesArray.map(function(el, i){
return 'http://dummyimage.com/600x400/000/' + (255 - i) + '?' + +new Date();
});
function preloader(images) {
var img;
if ( images ) {
for (var i=0; i<images.length; i++) {
img = new Image();
img.src = images[i];
console.log(img.src);
}
}
}
window.addEvent('load', function(){
preloader(imagesArray);
});
<script src="//cdnjs.cloudflare.com/ajax/libs/mootools/1.5.0/mootools-core-full-nocompat.js"></script>
您还可以查看我的预加载器类,它可以让您更灵活地预览图像的预加载方式以及进度等。https://github.com/DimitarChristoff/pre-loader - 它实际上会等待图像下载,允许你可以选择加载它们的方式等。
mootools-more还有Asset.images
你可以使用。
最后,不确定是否要绑定到load
事件,这将在所有资产(包括图片)都已加载时触发,您应该可以从domready
开始。
答案 1 :(得分:0)
我相信,这意味着mooTools在你的一个电话中得到一个未定义/格式错误的参数。
找出mootools-core.js第4497行定义的函数(可以是对象方法),并在脚本中查找每个调用。记录您正在使用的所有参数/对象,您将找到错误;)
修改强>
看到你的代码,我认为你的问题来自type
未在条件内声明的事实。试试:
if (custom.condition){
condition = function(event,type){
if (custom.condition.call(this, event, type)) return fn.call(this, event);
return true;
};