Расширенная поддержка скриптов в IE9: поддержка ECMAScript 5 и выше
До этого момента мы преимущественно говорили об
К слову, промышленным стандартом, определяющим язык JavaScript, является
Новые возможности ES5 в IE9 Platform Preview
В
Новые методы массива. Было добавлено девять новых методов для работы над массивами. Два из них, indexOf и lastIndexOf, поддерживают поиск определенного значения в массиве. По существу они схожи с одноименными функциями, что выполняют операции над строками. Остальные семь методов массивов позволяют управлять массивами при помощи стиля функционального программирования. Например, нижеприведенный фрагмент кода использует новый метод фильтра для сбора элементов массива, отвечающих определенному условию:
//функция, проверяющая, включен или отключен объект элемента меню
function enabled(menuItem) {return menuItem.status==="enabled"};
//Предположим, что отдельные элементы меню имеют свойство состояния (status property) и
//что объект меню имеет свойство элементов (items property), которое является массивом.
//Создаем новый массив, содержащий лишь включенные элементы меню
var enabledItems=myMenu.items.filter(enabled);
ty), которое является массивом.
//Создаем новый массив, содержащий лишь включенные элементы меню
var enabledItems=myMenu.items.filter(enabled);[/code]
Эти методы поддерживают различные виды обработки массива без необходимости явного программирования циклов. Кроме этого, все методы являются универсальными, то есть они могут быть применены к любому объекту с пронумерованными свойствами, а не просто объектам, созданным при помощи конструктора массива. Вы можете
Описание |
Производит поиск первого появления определенного значения в массиве. |
Производит поиск последнего появления определенного значения в массиве. |
Применяет функцию к каждому элементу в массиве. |
Устанавливает, является ли определенное состояние истинным для всех элементов в массиве. |
Устанавливает, является ли определенное состояние истинным хотя бы для одного элемента в массиве. |
Применяет функцию к каждому элементу в массиве и создает новый массив с соответствующими результатами |
Собирает в новый массив все элементы массива, для которых определенное состояние является истинным. |
Собирает одно значение, основанное на всех элементах в массиве. |
Собирает одно значение, основанное на всех элементах в массиве, обрабатывая их в обратном порядке. |
Расширенная объектная модель. Важнейшей возможностью в этой областью являются свойства методов доступа. Их иногда также называют свойствами "getter/setter", поскольку они позволяют программистам, использующим JavaScript, контролировать, что происходит, когда программа получает или устанавливает значение свойства. Расширенная объектная модель ES5 также позволяет программистам контролировать, могут ли отдельные свойства менять свои значения, перечисленные выражениями for…in, а также могут ли свойства быть удалены или переопределены. Также она позволяет программисту контролировать, могут ли новые свойства быть добавлены в объект. ES5 также упрощает программистам, использующим JavaScript, создание объектов, наследуемых от определенного объекта-прототипа, а также просмотр определений свойств объекта и управление ими. Все эти возможности расширенной объектной модели доступны посредством новых свойств функции конструктора объекта. Тем не менее, следует заметить, что текущий выпуск IE9 Platform Preview не поддерживает целиком использование этих методов с DOM-объектами.
Описание |
Создает или изменяет определение свойства. Свойство может быть определено либо как свойство данных, либо как свойство метода доступа, и для него могут быть установлены атрибуты записываемости (writable), перечисляемости (enumerable) и настраиваемости (configurable). |
Создает или изменяет несколько определений свойства посредством одной операции. |
Создает новый объект с определенным прототипом и, опционально, набором определенных свойств. |
Получает прототип объекта от объекта аргумента. |
Возвращает полное описание атрибутов свойства объекта. |
Возвращает массив, содержащий имена всех ненаследуемых свойств объекта. |
Возвращает массив, содержащий имена всех ненаследуемых свойств объекта, которые будут повторены выражением for…in. |
Запрещает добавление любых дополнительных свойств к объекту аргумента и запрещает удаление или переопределение любых существующих свойств. Отдельные значения свойств по-прежнему могут быть изменены, если для них установлен атрибут записываемости writable. |
Запрещает добавление любых дополнительных свойств к объекту аргумента и запрещает удаление и переопределение любых существующих свойств. Кроме этого, значения существующих свойств не могут быть изменены. |
Проверяет, был ли объект запечатан при помощи Object.seal. |
Проверяет, был ли объект зафиксирован при помощи Object.freeze. |
Запрещает добавление любых дополнительных свойств к объекту. |
Проверяет, могут ли новые свойства быть добавлены к объекту. |
Другие вычислительные методы и функции. Помимо добавления новых методов массива и объекта, ES5 добавляет или расширяет некоторые дополнительные методы, выполняющие полезные вычислительные операции.
Описание |
Удаляет пробелы из начала и конца строки. |
Преобразовывает Date в формат строки, который должны поддерживать все реализации ES5. |
Существующая функция расширена для распознавания формата, созданного с помощью toISOString. |
Возвращает числовой штамп времени. |
Надежно проверяет, является ли объект массивом. |
Задает фиксированные значения некоторым из аргументов функции. |
ES5 также содержит ряд других незначительных изменений и технических исправлений в языке. Многие из них не повлияют на большинство программистов, поскольку они просто стандартизируют возможности, всегда поддерживавшиеся в браузерах. Примером таких функций является объединение строк в строчных литералах. Другое небольшое изменение представляет больше интереса. Такие зарезервированные имена как if, super и public могут теперь использоваться в качестве имен свойств объектных литералов и для доступа к свойству, следующему за точкой. Благодаря этому изменению программистам более не придется беспокоиться о длинных и произвольных списках слов, которые они не могли легко использовать в качестве имен свойств.
"Одинаковый скрипт, одинаковая разметка"
Обновление JavaScript в IE9 не ограничивается поддержкой новых возможностей ES5. Сюда также относится стремление убедиться, что разработчики смогут использовать в IE9 ту же разметку и те же скрипты, что они используют в других браузерах. Ранее в этом году мы
Пример |
[left][code]function f() {alert("declaration")}; obj.callback=function f() {alert("expression")}; f(); // IE8 неверно оповещает "expression"[/code][/left] |
[left][code]var fact="the web is big"; Math.factorial=function fact(n) {return n<=1?1:fact(n-1)}; alert(Math.factorial(9)); // IE8 вызывает исключение[/code][/left] |
[left][code]var e = "outer"; try {throw "inner"} catch(e) {}; alert(e); // IE8 неверно оповещает "inner"[/code][/left] |
[left][code]var obj; //значение obj не определено try {alert(obj.prop)} catch (e) { if (e instanceof ReferenceError) alert("correct") else if (e instanceof TypeError) alert("IE8 wrong") }[/code][/left] |
[left][code]var len = [1,2,3,].length; alert(len); //должно быть 3, IE8 сообщает 4[/code][/left] |
[left][code]var a=[0,,2,,4]; alert(a.hasOwnProperty(1));// IE8 неверно сообщает истину[/code][/left] |
[left][code]var obj={valueOf:0, toString:1,foo:2}; var n=0; for (var p in obj) n++; alert(n); // IE8 отображает 1, а должен 3[/code][/left] |
[left][code]alert("\v"==="v");//IE8 сообщает истину, а должен ложь alert("\v"==="\u000b"); //IE8 возвращал ложь, а должен истину[/code][/left] |
[left][code]alert(hasOwnProperty===undefined); // IE8 неверно сообщает истину, а должен ложь[/code][/left] |
[left][code]var x=/((a)|(ab))((c)|(bc))/.exec("abc"); // x должен быть: // ["abc","a","a",undefined, "bc",undefined, "bc"] // IE8 производит: ["abc","a","a","","bc","","bc"][/code][/left] |
[left][code]alert((0.09).toFixed(1)); // должно отображаться 0.1 // IE8 отображает 0.0[/code][/left] |
"Использование одинаковых скриптов" касается не только того, как скрипты могут исполняться в Internet Explorer. Сюда также относится стремление убедиться, что скрипты, которые вы разрабатываете и тестируете в IE, также будут работать в любых других соответствующих стандартам браузерах, которые могут использовать ваши пользователи. Одна из проблем, которая может препятствовать достижению этой цели, заключается в возможностях, поддерживающихся исключительно в IE и отсутствующих в других браузерах. Если такая функция не является принципиально важной для функциональности браузера и не имеет уникального значения, реализована в одном единственном браузере и, по-видимому, не станет частью веб-стандарта, то она превращается в опасность для совместимости. Если вы непредусмотрительно используете такую функцию в вашем скрипте, то ваши пользователи не смогут работать с ним в каких-либо других браузерах.
В реализации JavaScript в Internet Explorer исторически имеется несколько функций, подпадающих под эту категорию, которые мы решили исключить из IE9 Standards Mode. В основном это функции, добавленные в качестве расширений возможностей на ранних стадиях разработки IE. Однако они не были добавлены в другие браузеры, и сегодня становится очевидным, что они никогда не будут включены в стандарт ECMAScript.
Первой функцией в этой категории является возможность добавления точки с запятой после любого блока кода. Например, IE разрешал заявления типа "if", составленные следующим образом:
[code]if (conditionMet) {performTrueAlternative()};
else {performFalseAlternative()};[/code]
Обратите внимание на точку с запятой в конце первой строки. Стандарт ECMAScript никогда не допускал постановки точки с запятой на такой позиции. Если вы попытаетесь загрузить скрипт, содержащий этот код, в любом браузере, отличном от IE, то в нем будет обнаружена ошибка синтаксиса, и скрипт не будет загружен. Первоначально эта функция была добавлена из-за желания быть предельно нестрогими в отношении того, что может исполнять IE - в том числе пропускать некоторые ошибки синтаксиса. К сожалению, желание быть нестрогими приводит к проблемам совместимости при запуске скрипта в других браузерах. В таких случаях лучше, что бы было выведено сообщение об ошибке, и она была исправлена разработчиком скрипта.
В IE также имеется ряд расширений к синтаксису объявления функции. Одно из расширений позволяет объявлениям функции напрямую определять свойства метода объекта. Например:
[code]function String.prototype.firstChar() {return this.substring(0,1)};[/code]
означает то же самое, что
[code]String.prototype.firstChar = function (){return this.substring(0,1)};[/code]
Другое расширение позволяло объявлению функции определять несколько имен функции. Например код:
[code]function declaration,dcl() {return processDeclaration)()};[/code]
который задает как короткое, так и длинное имя одной и той же функции. Ни одно из этих расширений не добавляет каких-либо новых возможностей, которые бы не могли быть выражены с помощью стандартных функций языка, они не стандартизированы, не поддерживаются другими браузерами, и мы исключили их из режима IE9 Standards.
Заметьте, что это не означает, что мы удалили все функции, присущие исключительно реализации JavaScript в IE. Некоторые функции жизненно необходимы в случаях, когда разработчику требуется получить доступ к уникальным возможностям Internet Explorer или Microsoft Windows. Например, сюда относятся возможности JavaScript, поддерживающие доступ к объектам ActiveX.
Тестирование прогресса
Первостепенной целью при разработке IE9 является обеспечение единой разметки, которую можно было бы использовать во всех браузерах, к чему, конечно, относится и JavaScript. Так как же мы узнаем о нашем продвижении к этой цели? В одной из
Испытайте самостоятельно
Нам нужны ваши отзывы. Дайте нам знать при обнаружении ошибки в JavaScript. В особенности нас интересуют проблемы совместимости. Если вы используете стандартизированную возможность JavaScript, и в режиме Standards в IE9 Platform Preview она работает иначе, чем в других браузерах, возможно, вы обнаружили ошибку - сообщите о ней на
Наконец, внимательно просмотрите ваш код на использование
Спасибо
Аллен Вирфс-Брок (Allen Wirfs-Brock)
Инженер-разработчик языка JavaScript в Microsoft
Источник:
Перевод: Sibiryak
Комментарии
Мне почему-то кажется, что тот светлый день, когда скрипты для оперы, хрома или файрфокса будет работать в ИЕ ещё не скоро настанет.
Например, функция addEventListener() - в ИЕ она называется attachEvent(). О какой переносимости может идти речь? Эра костылей продолжается.
в 9 ИЕ это поправили. ЭддЕвентЛистенер работает. Работает не только на всплытие событий - но и на захват.
No way!
Может они ещё и событие DOMContentLoaded имплементировали?
Не поверите, но да. И его они имплементировали. И даже предлагают это потестить тут:
О, тогда, конечно, IE9 станет серьёзным шагом! Жалко, только, что процентов этак 90 пользователей старых версий эксплорера и не подумают обновляться.
Скорее бы уже рабочую бету выпустили. Чтоб поставить основным браузером. Сайты в девятке просто летают.
Я думаю, что служба автоматического обновления сможет решить эту проблему. Кажется IE7 так распространяли.
По теме
- Еще пару слов о защите пользователей IE9 от отслеживания
- [Temp] Бенчмарк HTML5 Blizzard: проверьте аппаратное ускорение вашего браузера
- [Temp] Работаем с закрепление сайтов
- Блог IE в 2010: на связи с вами
- С новым аппаратно-ускоренным годом!
- HTML5: экспериментальный и готовый к использованию
- Доступно декабрьское накопительное обновлениие безопасности для IE
- IE9 и конфиденциальность: введение в защиту от слежения
- Более быстрый и умный список Compatibility View List в IE9
- Субпиксельные шрифты в Internet Explorer 9