Статьи

Это ошибка Safari?

На последнем этапе редактирования нашей будущей книги «Антология JavaScript» я обнаружил то, что кажется ранее незаписанной ошибкой в ​​Safari:

function preload(url) {
  var img = new Image();
  img.onload = function() {
    alert(this); // What is this?
  };
  img.src = url;
}
preload('chewbacca.jpg');

В хороших браузерах, таких как Firefox, Internet Explorer 6 и Opera 8.5, приведенный выше скрипт загружает изображение, а затем отображает некоторую вариацию «[object HTMLImageElement]», которая указывает, что thisload

Однако в Safari 1.3 и 2.0 alertthiswindow

Непослушное Сафари! Google, похоже, не знал об этой ошибке, когда я ее спросил. Кто-нибудь видел такое поведение, о котором сообщалось ранее?

Пока эта ошибка не будет исправлена, вы должны использовать замыкание для ссылки на объект изображения изнутри его onload То есть ссылаются на переменную в области действия функции-обработчика.

 function preload(url) {
  var img = new Image();
  img.onload = function() {
    alert(img);
  };
  img.src = url;
}
preload('chewbacca.jpg');