ie

IE6 background flicker bug

На первой странице студии Артемия Лебедева сегодня была новость о сайте «Хэлплайна» с движущимся, при наведении мышки, изображением пластмассовой уточки. Сама новость мне не интересна, а решение, которое позволяло уточке двигаться я посмотрел. Как и ожидалось — сдвиг позиции фонового изображения. Но есть и кое-что новое для меня — вызов «document.execCommand(„BackgroundImageCache“,false,true)» явно для Internet Explorer.

Как оказалось, это решение застарелого бага IE6 с миганием фона, подложенного под ссылку. Подробное описание описание условий возникновения бага можно найти в статье «Minimize Flickering CSS Background Images in IE6». Баг заметен, если в настройках кеширования браузера выбрать «Every visit to the page» для параметра «Check for newer versions of stored pages».

Вкратце, баг чаще всего проявляется при подкладывании фоновой картинки под ссылку — фон при наведении начинает неприятно мерцать, это Internet Explorer отсылает запросы на сервер, чтобы провеить не изменилась ли картинка, которую использовали как фон. Способ, который помогает решить проблему заключается в специальном JavaScript-вызове (хотя на мой взгляд лучше бы использовать «условную компиляцию» в IE), работает начиная с IE6SP1:

try {  document.execCommand('BackgroundImageCache', false, true);} catch(e) {}

Оставить комментарий

Min-width в IE6 без JavaScript

Для меня оказалось сюрпризом, что min-width в Internet Explorer 6 и ниже можно эмулировать стилями, без обычного, в данном случае, JavaScript (в IE7 min-width работает). Оцените фокус:

CSS-файл:

/* min-width для остальных браузеров */
body {margin:0;padding:0;}
.outer {
  background-color:red;
  margin:0 auto;
  min-width:600px
}

/* стили для IE6 */
* html .outer {padding-left:600px}
* html .minwidth {height:0} /* holy hack для IE, что бы включить свойство hasLayout */
* html .container {margin-left:-600px;position:relative; height:0}

HTML:

<div class="outer">
<div class="minwidth">
<div class="container">
Блок с min-width 600 пикселей.
</div>
</div>
</div>

Первоисточником решения, по всей видимости, является статья Stu Nicholls на сайте CSSPlay.

8 комментариев

MHTML

В предыдущей статье я описывал способ для Internet Explorer, позволяющий внедрить картинки в HTML-код. К сожалению, у него нашёлся недостаток — файл, в котором содержатся ресурсы, должен иметь расширение «mht». Иначе в некоторых версиях Windows браузер ничего не покажет.

Если подумать, это не сильно меняет дело — всего-то придётся выделить «упаковку» картинок в отдельный файл и подключать по мере необходимости. Например, так:

<img src="mhtml:http://sample.com/package1.mht!image.jpg" />
<img src="mhtml:http://sample.com/package1.mht!another_image.gif" />

и так далее. Основное достоинство способа — объединение нескольких картинок в одном соединении и его удаётся сохранить.

Сегодня я расскажу как добиться мультибраузерности при помощи SSI. В других скриптовых языках такой проблемы, понятно, не возникает. Я буду рассматривать SSI веб-сервера Apache, для других серверов, думаю, адаптировать код можно будет без особых проблем. Странно, SSI, этот простой и быстрый язык, который часто отлично подходит для организации нагруженных сайтов, где хотелось бы держать информацию структурированно, почему-то считают недостаточным для программирования. Тем не менее, на нём можно делать достаточно сложные вещи (я как-то писал «песню про пиво» на этом языке, загляните в раздел «99»).

Символом «собачки» (@) я буду выделять места, где перевод строки не нужно ставить — просто мне приходится разбивать длинные места на части. Описание, если не интересно, можно и не читать, просто скопировать всё в нужный файл и положить в каталог /images/.

В настройках Apache или .htaccess должна быть включена обработка SSI в файлах .html и .mht:

AddHandler server-parsed .html .mht

Первый файл (или файлы), который понадобится — это файл самой картинки. Он должен начинаться с полного имени картинки, плюс расширение .html. Например, «1.jpg.html», внутри нужно указать MIME-тип картинки в переменной «TYPE» и после include пометить код картинки в base64:

<!--#set var="NAME" value="$QUERY_STRING" -->@
<!--#set var="TYPE" value="image/jpeg" -->@
<!--#include virtual="pict.html" -->@
4AAQSkZJRgABAgAAZABkAAD...код картинки...mJiBFoxCGkShUxyGCMYMRcSwwRiMdRZ

Следующий файл — img.html. В нём проверяется из какого браузера его вызывают — Internet Explorer или всех остальных (вторым условием убирается Opera, которая иногда притворяется IE) и, в зависимости от этого, выводит, либо ссылку на mht-файл (у меня в коде считается, что все эти файлы лежат в каталоге /images), либо data URL, который генерирует pict.html:

<!--#if expr="$HTTP_USER_AGENT=/MSIE/ && $HTTP_USER_AGENT!=/Opera/" -->@
mhtml:http://<!--#echo var="HTTP_HOST" -->/images/package1.mht!<!--#echo var="QUERY_STRING" -->@
<!--#else -->@
<!--#include virtual="$QUERY_STRING.html?$QUERY_STRING" -->@
<!--#endif -->

Внутри файла package1.mht ссылки на файлы картинок (обратите внимание на параметры вызова в include virtual), в константе BOUND задаётся boundary (разделительная строка), о которой я говорил в прошлый раз. В include надо перечислить (пример показан для двух файлов) все файлы картинок, которые будут входить в этот набор.

<!--#set var="BOUND" value="Next_Section" --><!--
MIME-Version: 1.0
Content-Type: multipart/related; boundary="<!--#echo var="BOUND" -->"

--<!--#echo var="BOUND" -->
Content-Location: index.htm
Content-Transfer-Encoding: base64
Content-Type: text/html

<!--#set var="MHT" value="1" -->
<!--#include virtual="1.jpg.html?1.jpg" -->
<!--#include virtual="2.jpg.html?2.jpg" -->

--<!--#echo var="BOUND" -->-->

Последний файл — pict.html. Вызывается он из файлов картинок. Если он вызывается из mht, то выдаёт кусок mht-кода для данной картинки, иначе — data URI.

<!--#if expr="$MHT" -->--<!--#echo var="BOUND" -->
Content-Location: <!--#echo var="NAME" -->
Content-Transfer-Encoding: base64
Content-Type: <!--#echo var="TYPE" -->

<!--#else -->data://<!--#echo var="TYPE" -->;base64,<!--#endif -->

Теперь, как применять эту груду файлов. Всё очень просто — просто вставляем в нужно место следующий тег:

<img src="<!--#include virtual="/images/img.html?2.jpg" -->" />

И смотрим на результат. В исходном коде в IE мы должны увидеть ссылку на package1.mht, в остальных браузерах — data URI, во всех браузерах — картинку.

Оставить комментарий

Колдуем с MHTML

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

В некоторых версиях Windows XP, 2000 (закономерность не выявлена, но, видимо, дело в наличии каких-то Service Pack) и, кажется, во всех 2003, способ не работает, если расширение файла не mht. Это несколько сужает сферу применения данного способа.

Обход этой проблемы читайте в следующей статье. Далее сама статья:

Сегодня немного поколдуем, ок? Тем, кому не интересна кухня, где готовят внутренности сайтов, могут перейти к просмотру чего-то более интересного, остальные оставайтесь.

Браузеры всё больше превращаются в комбайны, которые поддерживают десятки схем доступа к данным, от всем известных file, ftp, http, https, до полузабытых gopher, finger, news и так далее. Среди этого списка есть интересная схема — data, который поддерживают уже, кажется, все браузеры, кроме Internet Explorer (включая беты седьмых версий). Для тех, кто незнаком с ним, общий вид строки запроса в этой схеме выглядит так:

data://[mime-тип;][тип кодирования],данные…

смысл в том, что данные (картинки, javascript, другие ресурсы) можно помещать внутрь HTML. Эта схема является частью стандарта HTML 4.0, если я не ошибаюсь, но, в силу того, что она не поддерживается основным игроком на рынке браузеров, используется лишь эпизодически — чаще всего в интранет-приложениях и расширениях к Opera и Mozilla FireFox. Выглядит это, примерно, так:

<img src="data:image/png;base64,iVBORw0KGgoAAAAN...и так далее">

Эта схема, кроме возможности помещать различные данные в HTML, имеет и более очевидные преимущества. Обычно, браузер открывает не более 2-4 соединений с сервером, через которые и получает данные. Если на странице очень много мелких картинок, браузер не имеет возможности загрузить и показать их одновременно — приходится ограничиваться означенным количеством соединений.

Мы, в нашей студии, обычно стараемся использовать карту ссылок, вместо нескольких мелких кнопок, например, для ускорения загрузки. Я очень много разговаривал с поисковиками Google и Yandex, но они уверены, что в IE внедрение ресурсов в HTML невозможно. Так ли это?

Нет. По крайней мере мне удалось найти минимум один способ сделать это. В интернете я ничего подобного не встретил, так что будет считать, что его изобрёл я. Натолкнула меня на эту мысль одна из кошмарных домашних страниц, которую сверстали в Microsoft Word и сохранили… в формате MHTML.

Этот формат первым начали использовать в браузере от Microsoft (поэтому его иногда расшифровывают как «Microsoft HTML») для того, чтобы можно было сохранять текст со всем содержимым — стилями, изображениями в одном файле, поэтому этот формат ещё называют веб-архивом (Web Archive). Чаще же всего его название расшифровывают как MIME HTML и в этом заключается главная проблема.

MIME HTML сильно отличается от обычного HTML форматом — внутри заголовок, информация об именах и форматах файлов, кодированные файлы изображений и так далее — более всего это похоже на файлы писем с вложениями (посмотрите исходный текст письма в своём почтовом клиенте). Нам было бы интересней, если бы в остальных браузерах показывалось бы что-то более похожее на HTML.

Просматривая веб-архив в браузере, я обнаружил, что IE отображает файлы архива через специальную схему — mhtml. У него есть интересная особенность — он позволяет адресовать файлы внутри веб-архива извне, вот так:

mhtml:http://example.com/file.mht!image.jpg

Причём, оказывается, браузер довольно вольно подходит к формату файла, лишь бы внутри были необходимые секции, что позволяет легко заключить архив внутрь HTML-комментария:

<!--
Content-Type: multipart/related; boundary="=_NextPart_01C6A9B1.539AB070"

--=_NextPart_01C6A9B1.539AB070
Content-Location: index.htm
Content-Transfer-Encoding: base64
Content-Type: text/html

--=_NextPart_01C6A9B1.539AB070
Content-Location: img.jpg
Content-Transfer-Encoding: base64
Content-Type: image/jpeg

4AAQSkZJRgA....закодированная...base64...картинка...BAgAAZABkAADMdRZ

--=_NextPart_01C6A9B1.539AB070-->

<body>
<img src="mhtml:http://www.test/index.html!img.jpg">
</body>

Те, кто знает как устроено обычное электронное письмо изнутри, разберутся и сами, для остальных расскажу. Строка, которую вы видите после слова «boundary», разделяет файл на секции. Секции начинаются с двух минусов и разделяющей строки. Заканчивается веб-архив разделяющей строкой, которая начинается и заканчивается двумя минусами — у меня завершающие минусы являются частью закрывающей части HTML-коментария. У секций есть заголовок:

Content-Location — имя файла внутри архива;
Content-Tranfer-Encoding — формат кодирования файла, экономичнее всего использовать base64;
Content-Type — MIME-тип файла;

если вы не знаете, что такое base64 и MIME-тип, то лучше обратиться к поисковику — такие вещи лучше знать. Первая секция с типом «text/html» — обязательная, без неё Internet Explorer не отобразит ваши файлы, остальные могут содержать данные любых типов. Ссылка может указывать на тот же самый или любой другой файл, который содержит веб-архив.

Я не уверен насчёт четвёртой версии браузера, но 5.0 и выше должны отобразить такой HTML нормально. У этого способа есть преимущество перед схемой data — на файл можно ссылаться несколько раз. Организация вывода разного контента для двух групп браузеров — сейчас довольно простая задача. Лучше всего, конечно, использовать для этого язык на стороне сервера (для JavaScript объёмы данных слишком значительные) — например, SSI или PHP.

Кстати, Opera 9 так же поддерживает веб-архивы, но использует для этой цели другую схему — «attachment». Но Opera 9 слишком мало распространена и, кроме того, этот браузер давно поддерживает схему «data».

Ещё хотелось бы упомянуть, что Internet Explorer поддерживает ещё одну схему, через которую, вероятно, можно получить доступ к ресурсам веб-архива — «mid», но я в этом не уверен и никаких экспериментов по этому поводу не проводил.

5 комментариев

Explorer Canvas

IE не обновлялся очень давно и не поддерживает тег CANVAS, предоставляющий интересные возможности — рисование через JavaScript вектором. Интересно, что Microsoft когда-то давно предлагала к использованию свою разработку — язык VML, а ранее браузеры позволяли использовать VRML. Последний благополучно умер, а VML так и поддерживается современными версиями Internet Explorer.

Вероятно некоторая схожесть технологий VML и CANVAS вдохновила Emil A Eklund на создание Explorer Canvas — трансляцию вызовов CANVAS в теги VML. Поддержка пока ограниченная, но ведётся активная работа по расширению возможностей. На сайте есть небольшая демонстрация возможностей. Кстати, хорошо видно, что в браузерах Opera и FireFox canvas ведёт себя по-разному.

Оставить комментарий

IE и HTTPS

Следующая проблема — некорректное поведение IE при использовании протокола HTTPS. Иногда (особенно на сайтах, где используются технологии изменения содержимого страницы без её перезагрузки), в странице используется тег iframe без содержимого или с указанием about:blank. IE считает, что такой IFRAME загружает содержимое не по протоколу HTTPS (формально он прав — конечно не загружает, но по сути-то содержимое пустое) и пишет предупреждение пользователю.

От этого раздражающего предупреждения можно избавиться следующим образом: указать в качестве src для iframe конструкцию

javascript:''

Т. е.

<iframe src="javascript:''></iframe>

javascript — это протокол, который позволяет выполнять JavaScript. Когда страница грузится по HTTPS этот скрипт выполняется в текущем протоколе — HTTPS, а указание пустой строки позволяет создать фрейм именно с пустым содержимым.

Оставить комментарий

Панель на картинке

Ещё одно изобретение Microsoft — панель, которая появляется при наведении на картинку. Функция хорошая, но на элементах оформления эта панель здорово портит кровь, особенно в тех случаях, когда нужно отобразить диалог, заблокировав и затемнив остальное содержимое сайта полупрозрачной картинкой — такой метод изготовления модальных диалогов всё чаще используется в вебе.

Вот в этих случаях не нужно, чтобы при наведении на картинку пользователь видел эту панель. Есть два способа избавиться от неё. Во-первых, можно запретить её появление на всей странице при помощи мета-тега: <meta http-equiv=«imagetoolbar» content=«no» />

Во-вторых, можно указать для какой картинки её показывать не нужно, используя нестандартный атрибут galleryimg

<img src="/img/image.jpg" width="100" height="100" alt="" galleryimg="no" >

Оставить комментарий

Выполнение JS только в IE

Кстати говоря, есть два способа выполнения JavaScript-кода только в IE. Первый, который, правда, сработает и в Opera — указание в script language «JScript». JScript — это название диалекта JavaScript, реализованного в IE. Следующее:

<script language="JScript">alert('1')</script>

cработает только в Opera и Internet Explorer.

Второй способ — так называемая «условная компиляция». Был придуман Microsoft, чтобы прятать новые конструкции языка (например, try … catch) от предыдущих версий браузера. Следующий код выполнится только в Internet Explorer. Остальные браузеры посчитают его комментарием в коде JavaScript

/*@cc_on

alert(1)

@*/

В «условной компиляции» можно выполнять ещё ряд действий, например, проверять версию jscript и т.д, всё это легко найти в любом поисковике.

Оставить комментарий

Условные комментарии

Одна из проблем — как подключать какие-то части кода в зависимости от того является ли браузер Internet Explorer. Веб-мастера, обычно, пользуются CSS-хаками, а вот о том, что есть специальная конструкция, которая позволяется это сделать, мало кто знает.

Специальная конструкция

<--[if IE...] ... <![endif]-->

позволяет не только прятать какие-то части HTML от других браузеров (которые воспринимают их как обычный HTML-комментарий), но и выбирать HTML в зависимости от версии IE. Более подробно можно прочитать, например, в статье Manfred Staudinger Taming Your Multiple IE Standalones. Для тех, кто не знает английского, скажу — общий принцип легко понятен из примеров.

Кстати, от Internet Explorer так же можно прятать HTML-код — надо просто заключить его в теги

<comment> … </comment>

Этот нестандартный тег Internet Explorer считает комментарием и, соответственно, не показывает и не обрабатывает его содержимое.

Оставить комментарий

Борьба с Activating ActiveX Controls

Одно из новшевств, которое появилось в последних обновлениях Internet Explorer — это «Activating ActiveX Controls» (KB912945). После обновления Internet Explorer позволяет управлять элементами, которые находятся на ActiveX (а к ним относится и Flash) только после клика на объект, сам объект до клика выделяется рамкой, если над ним провести мышкой. Само по себе это не так уж и мешает, только если этот ActiveX (Flash, например) не находится за каким-то контентом и если на нём находятся ссылки, то кликнуть по ним получается только со второго раза — первым активизируется ActiveX и только потом срабатывает ссылка.

Оказывается есть метод борьбы с этой проблемой. Всё что нужно сделать — обойти все теги object и присвоить их outerHTML самому себе. Например, так:

// When the page loads:
window.onload = function(){
  if (document.getElementsByTagName) {
    // Get all the tags of type object in the page.
      var objs = document.getElementsByTagName("object");
      for (i=0; i<objs.length; i++) {
        // Get the HTML content of each object tag
        // and replace it with itself.
        objs[i].outerHTML = objs[i].outerHTML;
      }
   }
}
// When the page unloads:
window.onunload = function() {
  if (document.getElementsByTagName) {
    //Get all the tags of type object in the page.
    var objs = document.getElementsByTagName("object");
    for (i=0; i<objs.length; i++) {
      // Clear out the HTML content of each object tag
      // to prevent an IE memory leak issue.
      objs[i].outerHTML = "";
    }
  }
}

Оставить комментарий

XSS

Одна из известных проблем безопасности на веб-сайта — так называемый XSS (Cross Site Scripting). Вкратце суть в том, что иногда удаётся внедрить на страницу некий код (на скриптовом языке), который может выполнить некоторые вредоностные действия. Например, украсть файлы cookie для этого сайта, если таковые имеются. В cookie часто в каком-то виде хранится информация, которая позволит хакеру залогиниться на этот сайт под вашим логином.

Похоже, фирма Microsoft первая, кто озаботился поиском принципиально новых возможностей решения этой проблемы. Microsoft добавила в свой браузер поддержку так называемых «HTTP-only cookie». Смысл в том, чтобы ставить cookie специальный флаг, который будет показывать, что данную cookie браузер должен сделать недоступной для скриптовых языков. Пример:

Set-Cookie: USER=123; expires=Wednesday, 09-Nov-99 23:12:40 GMT; HttpOnly

Предельно понятно и достаточно действенно. Пока в PHP, в setcookie нет поддержки этого флага, такую cookie можно ставить через вызов header.

Оставить комментарий

Формат графики XBM

Есть такой интересный принцип дарить подарки — покупать в подарок то, что люди сами бы себе никогда не купили. У меня, похоже, одно из хобби — копать там, где ничего не растёт. В том смысле, что меня больше увлекают проекты, где практической пользы меньше, чем льда на Солнце.

Было время, меня увлёк графический формат XBM, единственное достоинство которого (впрочем, вполне достаточное, на мой взгляд) — безумная простота, позволяющая манипулировать графикой в этом формате из любого хоть чего-то стоящего языка программирования. Я даже разродился модулем ImageXBM и прочими вещами.

И вот я узнаю, что Internet Explorer 6.0SP1 и выше не поддерживает мой любимый формат! Причину цитирую:

A  change was made to Internet Explorer for Windows XP Service Pack 2 and Windows Server 2003 Service Pack 1 so that it does not render the XBM image file format. This update adds this change to all other supported versions of Internet Explorer. This change has been made to help prevent the Internet Explorer process from closing unexpectedly when users view invalidly-formed images. The XBM format is no longer supported by Internet Explorer.

Что переводится, примерно, так: «у нас что-то не работало, поэтому мы просто это отключили». Оплакал я смерть формата, которые за годы своей жизни так и не стал известен большинству разработчиков, да и сделал другой модуль.

Image_MonoBMP — модуля для работы с монохромными изображениями в формате BMP. А чтобы подтвердить, что я опять дарю вам то, что вы себе сами бы не купили, скажу, что этот формат, конечно, поддерживается Internet Explorer и Opera, но FireFox плевать на него хотел, да, в общем-то, и правильно.

Кстати, есть у меня идея сделать поддержку WBMP, но как же быть с принципом? Впрочем, я его уже нарушил, но об этом как-нибудь в другой раз.

Оставить комментарий

IE и Mozilla

Рисунок ниже отобразится в IE и Mozilla одинаково. Но вот в чём загвоздка: в IE он отобразится даже если выключены картинки, а Mozilla его загрузит прямо с HTML страницы, а не извне.

Почему так происходит? Для IE я вместо атрибута SRC применил аттрибут DYNSRC. Этот специальный атрибут, который понимает только IE, заставляет отображать браузер «динамическое» содержимое — фильмы, музыки и тд. Обрабатывается, он, похоже, так же как тег OBJECT — происходит внедрение ActiveX, который отвечает за показ содержимого. Поэтому картинка показывается и при отключенной графике — ведь IE отображает ActiveX, а уж что там показывает ActiveX браузера не касается.

Что касается Mozilla, то люди, которые устанавливают себе такой браузер вполне могут глянуть в код. Вкрадце: используется протокол data, который позволяет внедрять произвольные данные в HTML-код.

Читать дальше

Реалистичная реконструкция внешности древнего человека с темными кудрявыми волосами, бородой и серьезным выражением лица на бежевом фоне.

Дополнение:Оказывается, картика покажется не во всех IE, закономерность пока не установлена.

18 комментариев

IE colors

Оказывается, Internet Explorer воспринимает любые буквы после «#» в HTML-коде как правильный цвет. Так например «#bolk» даст красный цвет, а «#juliet» — синий. Кстати, тут он попал в точку — я люблю красный цвет, а  — синий. А вот «#spectator» получается зелёным. Дим, ты любишь зелёный цвет?

Дополнение: странно, но работает и в Mozilla и в Opera.

8 комментариев

А знаете ли вы что?..

Если у вас Microsoft Internet Explorer 5.5 и выше, то вы можете набрать в адресной строке

javascript:void(document.body.contentEditable = true)

нажать Enter и вдоволь поиздеваться над контентом текущей страницы. Попробуйте, например, выделить кусок текста и нажать Ctrl+B. Источник [ >>> ]

2 комментария

Микрософт жива. mod_cgisock, JScript и CK-22B6

Для начала, о событии, так меня заинтересовавшем в позапрошлом выпуске. Вчера на ZDNet.com я, наконец-то, смог прочитать, что же, все-таки, случилось в сетевом хозяйстве Майкрософт.

Оказывается, во всем был виноват (а я был в чем-то прав!) плохой дядя Роутер. Именно он содержал «configuration error» и оставлял запросы к внутренней сети компании «unanswered». Целый день. Вот такой бяка этот роутер. Там еще много чего написано, любопытствующих отсылаю к источнику.

Веб-мастера, имеющие отношение к Apache, знают что такое Fast CGI. Если не вдаваться в подробности — это метод, позволяющий держать CGIs сразу в памяти и выполнять их по мере необходимости.

А теперь скажите мне, что такое mod_cgisock. Так вот, это модуль Apache, который предоставляет возможность работать с CGI через обычные юниксовые сокеты. CGI в этом случае пишется на языке, способном работать с сокетами, и, насколько я понимаю, выступает в роли сервера, обслуживающего запросы Apache. Утверждается, что такой способ позволяет существенно экономить память и выполнять приложения гораздо быстрее.

Весьма любопытно, тем более, что слышу я об этом впервые, но для PHP (а он у меня скомпилирован как модуль), который мне в последнее время так полюбился, абсолютно бесполезно. :)

Есть у меня телевизор Samsung CK-22B6SR. Локализация выполнена довольно странным способом. Многие не замечают или не обращают внимания, но факт — при нажатии на кнопку «меню», это самое меню появляется сначала на английском языке, а уже потом затирается и пишется локалью (в моем случае — по-русски). Лично мне это не мешает, тем более, что все это едва заметно на глаз, но интересно — что помешало выполнить локализацию нормально, не прибегая к таким кривохитрым ходам?

Кстати, загляните на сайт Самсунг. Там, у телевизора есть забавная характеристика — кривизна экрана… Я долго смеялся. Тем, кто юмора не понял, объяснять ничего не буду. Не способен. :)

Маленькое продолжение темы недокументированных возможностей. На этот раз порадовал Microsoft Internet Explorer 5.0 и 5.5. Случайно обнаружил, что в JScript интерпретаторе этого браузера есть две, нигде не описанные, но, тем не менее, судя по всему, прекрасно работающие фичи.

Во-первых, это константа условной компиляции @_microsoft, имеющая значение true. Фича, абсолютно пока бесполезная, но интересная самим фактом своего существования. Возможно, не за горами времена, когда она примет значение false.

Во-вторых, условно-полезная функция CollectGarbage(). Очевидно она предназначена для вызова сборщика мусора. Впрочем, это может быть просто неработающая заглушка.

А на сегодня это все. :)

Оставить комментарий

Блоки try… catch… finally… в JScript 5

Заметка была впервые опубликована на сайте «Цитфорум» в 1999-м году, дата публикации примерно восстановлена из «Веб-архива»

Пояснение для людей не знакомых с данной конструкцией:

  • Конструкция try — catch — finally предназначена для перехвата ошибок (исключений). Если в блоке try каком-то операторе возникает ошибка, JScript игнорирует остальные операторы и переходит в блок catch, где находится блок обработки исключений. Последним выполняется блок finally, в котором обычно выполняют некие заключительные действия. Допускается использование неполной конструкции — без catch или finally.

Скажу сразу, что бы не было никаких недоразумений: JScript — это JavaScript в интерпретации Microsoft, а 5-я версия предполагает наличие Internet Explorer 5.0 (в 4-м IE всего лишь 3-я версия JScript).

Не знаю как вы, а я, сколько программирую на J[ava]Script мечтал, что бы в этом языке появился наконец эта конструкция из двух слов, но шли годы, а заветные слова так и оставались зарезервированными и я уж было потерял всякую надежду, как вышел пятый IE…

И вот, однажды вечером, внося очередные изменения в свой JS Unix и роясь одновременно во внутренностях 5-го «зонда» взгляд мой зацепил знакомые try, catch и незнакомое Error. Смутная надежда маленьким мерцающим огоньком загорелась в моей душе. Осторожно, не давая ей погаснуть я протянул руки к клавиатуре, набрал try… catch… и в место досадного «зарезервированные слова», получил радостное «предполагается наличие }». Надо было видеть меня в тот момент (или слышать), каюсь: я кричал, что Гейтс молодчина. Каюсь, потому что Гейтс — плохой дядя, сделал в пятой версии то, что надо было сделать еще в первой. Ну да ладно, это все замечательно, но надо было сделать так, что бы кроме пятого эксплорера, остальные браузеры не замечали этот блок. Хорошо, что в JScript есть такая замечательная вещь, как условная компиляция. Воспользовавшись ею можно скрыть все что угодно от посторонних глаз Netscape Navigator и Internet Explorer 4.01 и ниже. Таким образом, вся конструкция выглядит так (после точки с запятой — мои комментарии):

/*@cc_on @*/                  ; Включаем условную компиляцию
/*@if (@_jscript_version>4)   ; Проверяем версию JScript
try                           ; Сам блок try
{@end @*/	
Result=eval(expression);      ; Делаем что-то полезное
/*@if (@_jscript_version>4)	
} catch (err)                 ; «Ловим» ошибку
{	
alert(err.description);       ; Сообщение об ошибке
Result='';	
} finally
{
alert(Result);                ; Завершающие действия
};
@end @*/
/*@cc_off @*/                 ; Выключаем условную компиляцию

Где еrr — имя объекта Error, который будет создан при возникновении ошибки, в него будут помещены параметры ошибки. Объект Error имеет три конструктора и два свойства:

err=new Error();

err=new Error(number);

err=new Error(number, description);

Свойство (и параметр конструктора) number — числовое значение (номер ошибки), свойство description (так же параметр конструктора) — строка, описание ошибки. Некоторые числовые значения и соответствующие им описания ошибок приведены в таблице ниже:

Номер ошибки Описание ошибки
-2146823279 Определение отсутствует
-2146827282 Предполагается наличие ‘)’
-2146827273 Незавершенная строковая константа
-2146827286 Ошибка синтаксиса
-2146827280 Предполагается наличие {
-2146827850 Объект не поддерживает это свойство или метод
-2146827843 Команда не поддерживается объектом
-2146827859 Невозможно создание объекта сервером программирования объектов
-2146828235 Файл не найден

Существует способ программно возбудить исключение (создать ошибку) — достаточно вызвать оператор throw с созданным ранее объектом Error. При перехвате ошибки конструкцией try-catch созданный объект будет передан блоку catch. Примеры:

var err=new Error(-10,"Неверное число");
throw(err);

throw(new Error(-4,"Ошибка"));

Таким образом JScript пополнился еще одной полезной конструкцией, существенно упрощающей жизнь программиста.

Web-программист казанского центра Интернет Степанищев Е.В.

Оставить комментарий

← 1 2 3 4 5 →