Mootools"无法阅读财产'电话"未定义"

时间:2014-09-17 11:45:04

标签: javascript mootools

我有一个使用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;
},

2 个答案:

答案 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;
            };