В связи с дальнейшим общением по электронной почте ... и тем фактом, что проблема вызвана использованием 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 не имеет других подобных проблем, связанных с событиями.