События MooTools не запускаются в IE8 - PullRequest
0 голосов
/ 30 апреля 2010

У меня есть ресурс Mootools, созданный так:

// Create a new asset
var asset = new Asset.image(path, {
    title: this.language.download,
    events: {click: this.download.bind(this, link)},
});

У меня есть метод объекта MooTools, определенный следующим образом:

download: function(e) { 
    // The path to download
    console.log('download: ' + e);
},

В Firefox обнаруживается печать console.log. Однако в IE8 мне не повезло. Я что-то упустил?

Любые советы или рекомендации будут с благодарностью. ТИА!

Ответы [ 2 ]

0 голосов
/ 02 мая 2010

Я попытался реализовать это, используя два описанных метода. Ни один из них не работает в IE8 или IE8 с режимом совместимости.

var path = this.options.assetBasePath + 'disk.png';
var _this = this;
var icon = new Asset.image(path, {
                          /*onload: function() {
                    this.set({
                    title: _this.language.download,
                    events: {click: function() {
                                           alert('test');
                    }
                 }
            }).inject(el, 'top');
              }*/
       });
icon.set({title: _this.language.download,
     events: {click: function() {
                 alert('test');
                 }
         }
});
icon.inject(el, 'top');
icon.addClass('browser-icon');
icons.push(icon);

Оба эти метода нормально отображают alert () в FF, но не работают в IE.

0 голосов
/ 02 мая 2010

В связи с дальнейшим общением по электронной почте ... и тем фактом, что проблема вызвана использованием filemanager mootools plugin cpojer (из основной команды mootools), я обновляю свой ответ на совет по электронной почте.

исходный код: http://github.com/cpojer/mootools-filemanager/raw/master/Source/FileManager.js - проблема в строке 408

Причина, по которой исходный код может потерпеть неудачу (в IE8), но я бы все равно считал его небезопасным, заключается в том, что события в mootools управляются UID для каждого элемента. И.Е. - если вы внедрите элемент или передадите его через селектор и, возможно, создадите его с помощью нового класса Element () (tbc), он назначит ему UID, для которого включено хранилище элементов. Возможно, что цепочка, использованная в исходной форме, приведет к запуску addEvent до того, как элемент будет существовать, что приведет к его отказу. Проблема здесь в том, ПОЧЕМУ не удалось прикрепить события, когда все тесты, которые я провел, похоже, работают. По сути, код Asset.image выглядит так:

var image = new Image();
var element = document.id(image) || new Element('img');
element.store("foo", "bar");
alert(element.retrieve("foo") || "failed");

этот параметр назначает UID и делает его доступным для событий даже до того, как он становится членом DOM. tescase: http://fragged.org/dev/ie8-new-image-bug.php - это выводит 'bar' для вас? если это так, то нет никаких оснований подозревать нечестную игру в порядке назначения событий против вставки DOM из-за хранения, так или иначе, это может быть общей проблемой манипуляции / проблемой onclick.

В любом случае, вы можете попробовать заменить код в классе этим, хотя я не проверял его:

var _this = this;
icons.push(new Asset.image(this.options.assetBasePath + 'disk.png', {
    title: this.language.download
    "class": 'browser-icon',
    onload: function() {
        // once the src has been set and image loaded
        // inject into DOM (hence open to manilulations) and then add the event
        this.inject(el, 'top').addEvent('click', function(e) {
            _this.tips.hide();
            e.stop();
            window.open(_this.options.baseURL + _this.normalize(_this.Directory + '/' + file.name));
        });
    }
}));

также следует учитывать: в прошлом IE, как было известно, имел проблемы с загрузкой кэшированных изображений, которые не вызывали события, если назначение события было неправильным:

// wrong:
var image = new Image();
image.src = 'image.jpg';
image.onload = function() { // evil, won't work if image already cached, it won't trigger
...
};

// right:
var image = new Image();
image.onload = function() { // always fires the event.
...
};
image.src = 'image.jpg';

это просто подсказка, mootools в любом случае обеспечивает правильный порядок вставки и назначения событий, но это не означает, что IE8 не имеет других подобных проблем, связанных с событиями.

...