<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code-Is-Art &#187; Internet Explorer</title>
	<atom:link href="http://www.codeisart.ru/rubric/internet-explorer/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codeisart.ru</link>
	<description>Статьи по SEO, дизайну и программированию. Переводы на веб-тематику. Исследования и наработки в области интернет-технологий.</description>
	<lastBuildDate>Tue, 08 Nov 2011 13:43:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>&lt;abbr&gt; и&#160;&lt;q&gt; в&#160;Internet Explorer</title>
		<link>http://www.codeisart.ru/abbr-%d0%b8-q-%d0%b2-internet-explorer/</link>
		<comments>http://www.codeisart.ru/abbr-%d0%b8-q-%d0%b2-internet-explorer/#comments</comments>
		<pubDate>Sun, 03 Aug 2008 14:21:18 +0000</pubDate>
		<dc:creator>Octane</dc:creator>
				<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=307</guid>
		<description><![CDATA[Всем известно, что&#160;самый замечательный браузер &#171;Internet&#160;Explorer&#187; ниже&#160;7-й версии не&#160;поддерживает тег &#60;abbr&#62;&#160;&#8212; аббревиатура, а&#160;в&#160;вплоть до&#160;7-й&#160;версии включительно невозможно средствами CSS задать оформление кавычек для&#160;тега &#60;q&#62;&#160;&#8212; inline-цитата. Что&#160;же&#160;делать? В&#160;случае&#160;с&#160;&#60;abbr&#62; можно заменить этот тег на&#160;похожий &#60;acronym&#62;, который поддерживает IE, а&#160;вот&#160;с&#160;&#60;q&#62; все сложнее, потому&#160;что IE не&#160;поддерживает ни&#160;&#171;Generated&#160;Content&#187; не&#160;селекторы &#171;:before&#187; и&#160;&#171;:after&#187; в&#160;CSS. Итак,&#160;добавим поддержку &#60;abbr&#62;, а&#160;точнее его&#160;эмуляцию, для&#160;IE ниже 7-й&#160;версии. Для&#160;этого [...]]]></description>
			<content:encoded><![CDATA[<p>Всем известно, что&nbsp;<del>самый замечательный браузер</del> <strong class="normal">&laquo;Internet&nbsp;Explorer&raquo; ниже&nbsp;7-й версии не&nbsp;поддерживает тег <code>&lt;abbr&gt;</code></strong>&nbsp;&mdash; аббревиатура, а&nbsp;в&nbsp;вплоть до&nbsp;7-й&nbsp;версии включительно невозможно средствами <abbr title="Cascading Style Sheets">CSS</abbr> задать оформление кавычек для&nbsp;тега <code>&lt;q&gt;</code>&nbsp;&mdash; inline-цитата. Что&nbsp;же&nbsp;делать? В&nbsp;случае&nbsp;с&nbsp;<code>&lt;abbr&gt;</code> можно заменить этот тег на&nbsp;похожий <code>&lt;acronym&gt;</code>, который поддерживает <abbr title="Internet Explorer">IE</abbr>, а&nbsp;вот&nbsp;с&nbsp;<code>&lt;q&gt;</code> все сложнее, потому&nbsp;что <abbr title="Internet Explorer">IE</abbr> не&nbsp;поддерживает ни&nbsp;&laquo;<a href="http://www.w3.org/TR/REC-CSS2/generate.html" hreflang="en" rel="external nofollow">Generated&nbsp;Content</a>&raquo; не&nbsp;селекторы &laquo;<code>:before</code>&raquo; и&nbsp;&laquo;<code>:after</code>&raquo; в&nbsp;<abbr title="Cascading Style Sheets">CSS</abbr>.</p>
<p><span id="more-307"></span></p>
<p>Итак,&nbsp;добавим поддержку <code>&lt;abbr&gt;</code>, а&nbsp;точнее его&nbsp;эмуляцию, для&nbsp;<abbr title="Internet Explorer">IE</abbr> ниже 7-й&nbsp;версии. Для&nbsp;этого заменим <code>&lt;abbr&gt;&lt;/abbr&gt;</code> на&nbsp;<code>&lt;span&nbsp;class=&quot;abbr&quot;&gt;&lt;/span&gt;</code>:</p>
<pre><code class="javascript">function abbr() {
  var node = document.getElementsByTagName('body')[0];
  node.innerHTML = node.innerHTML
  .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
  .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
}</code></pre>
<p>Почему используется &laquo;<code>innerHTML</code>&raquo;, а&nbsp;не&nbsp;&laquo;<code>getElementsByTagName('abbr')</code>&raquo;? Потому&nbsp;что <abbr title="Internet Explorer">IE</abbr>&nbsp;не&nbsp;воспринимает <code>&lt;abbr&gt;</code> как&nbsp;тег, и&nbsp;&laquo;<code>getElementsByTagName('abbr')</code>&raquo; вернет &laquo;пустой&raquo; массив. Еще&nbsp;одна особенность <abbr title="Internet Explorer">IE</abbr>&nbsp;(и&nbsp;Opera)&nbsp;&mdash; имена тегов, в&nbsp;нашем случае, необходимо писать заглавными буквами: <code>.replace(/&lt;\/ABBR&gt;/g,&nbsp;'&lt;/SPAN&gt;')</code>, а&nbsp;не&nbsp;<code>.replace(/&lt;\/abbr>/,&nbsp;'&lt;/span>')</code>.</p>
<p>Мы&nbsp;заменили все&nbsp;<code>&lt;abbr&gt;</code> на&nbsp;<code>&lt;span&nbsp;class=&quot;abbr&quot;&gt;</code> тем&nbsp;самым добавили поддержку отображения текста, записанного в&nbsp;атрибут &laquo;<code>title</code>&raquo;, во&nbsp;&laquo;всплывающей&raquo; подсказке.</p>
<p><b>Пример:</b> <abbr title="Extensible Hypertext Markup Language">XHTML</abbr></p>
<p>Теперь оформим <code>&lt;span&nbsp;class=&quot;abbr&quot;&gt;</code> так&nbsp;же, как&nbsp;и&nbsp;<code>&lt;abbr&gt;</code> в&nbsp;<abbr title="Cascading Style Sheets">CSS</abbr>:</p>
<pre><code class="css">abbr, span.abbr {
/* стили для &lt;abbr&gt; */
} </code></pre>
<p>Добавим распознавание <abbr title="Internet Explorer">IE</abbr>&nbsp;и&nbsp;его версии, чтобы не&nbsp;выполнять замену для&nbsp;нормальных браузеров и&nbsp;<del>ненорм</del> <abbr title="Internet Explorer">IE</abbr>&nbsp;версии 7&nbsp;и&nbsp;выше:</p>
<pre><code class="javascript">var MSIE = 0/*@cc_on+@_jscript_version*10%10@*/;
function abbr() {
  if(MSIE &amp;&amp; MSIE &lt; 7) {
    var node = document.getElementsByTagName('body')[0];
    node.innerHTML = node.innerHTML
    .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
    .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
  }
}</code></pre>
<p>Переменная &laquo;<var>MSIE</var>&raquo; равна <var>0</var> если используется любой браузер, кроме <abbr title="Internet Explorer">IE</abbr>, или содержит номер версии &laquo;JScript&raquo;, поддерживаемый <abbr title="Internet Explorer">IE</abbr>:</p>
<ul>
<li><var>1</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.1&nbsp;в&nbsp;<abbr title="Internet Explorer 5.0">IE5.0</abbr></li>
<li><var>5</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.5&nbsp;в&nbsp;<abbr title="Internet Explorer 5.5">IE5.5</abbr></li>
<li><var>6</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.6&nbsp;в&nbsp;<abbr title="Internet Explorer 6.0">IE6.0</abbr></li>
<li><var>7</var>&nbsp;&mdash; &laquo;JScript&raquo; версии&nbsp;5.7&nbsp;в&nbsp;<abbr title="Internet Explorer 7">IE&nbsp;7.0</abbr>&nbsp;и&nbsp;8.0b1</li>
</ul>
<p>Таким&nbsp;образом, мы&nbsp;еще и&nbsp;отсекаем <abbr title="Internet Explorer 4">IE4</abbr>, т.&nbsp;к.&nbsp;результатом выполнения выражения &laquo;<code>0&nbsp;+&nbsp;@_jscript_version&nbsp;*&nbsp;10&nbsp;%&nbsp;10</code>&raquo; будет&nbsp;<var>0</var>.</p>
<p>Что&nbsp;же&nbsp;за&nbsp;конструкция &laquo;<code>/*@cc_on&nbsp;&hellip;&nbsp;@*/</code>&raquo; и&nbsp;переменная &laquo;<var>@_jscript_version</var>&raquo;? Первое&nbsp;&mdash; это&nbsp;&laquo;<a href="http://msdn.microsoft.com/en-us/library/ahx1z4fs%28VS.80%29.aspx" rel="external nofollow" hreflang="en">Conditional&nbsp;Compilation</a>&raquo;&nbsp;&mdash; условное выполнение в&nbsp;&laquo;JScript&raquo;. Это&nbsp;аналог &laquo;<a href="http://designformasters.info/posts/conditional-comments/" hreflang="ru">условных&nbsp;комментариев</a>&raquo; (<a href="http://msdn.microsoft.com/en-us/library/ms537512.aspx" rel="external nofollow" hreflang="en">Conditional&nbsp;Comments</a>), которые воспринимает только <abbr title="Internet Explorer">IE</abbr>, второе&nbsp;&mdash; зарезервированная переменная, в&nbsp;которой хранится номер версии &laquo;JScript&raquo;.</p>
<blockquote>
<p>Эта пляска с&nbsp;собачками называется &laquo;условное&nbsp;выполнение&raquo; (Conditional&nbsp;Compilation) и&nbsp;формально вообще не&nbsp;является JavaScript&#39;ом, это&nbsp;JScript. Если&nbsp;я&nbsp;не&nbsp;ошибаюсь, только его&nbsp;IE и&nbsp;понимает, а&nbsp;официальный JavaScript работает только благодаря довольно широкой совместимости этих&nbsp;языков.</p>
<address><cite><a href="http://pepelsbey.net/2008/05/five-stars/">Вадим Макеев</a></cite></address>
</blockquote>
<p>Браузеры, поддерживающие &laquo;JavaScript&raquo;, просто проигнорируют выражение внутри &laquo;<code>/*@cc_on&nbsp;&hellip;&nbsp;@*/</code>&raquo;, посчитав его&nbsp;за&nbsp;обычный комментарий вида &laquo;<code>/*&nbsp;&hellip;&nbsp;*/</code>&raquo;, и&nbsp;переменная &laquo;<var>MSIE</var>&raquo; останется равной&nbsp;<var>0</var>.</p>
<p>Получается, что&nbsp;выражение &laquo;<code>MSIE&nbsp;&amp;&amp;&nbsp;MSIE&nbsp;&lt;&nbsp;7</code>&raquo; будет равно &laquo;<var>true</var>&raquo; в&nbsp;случае если&nbsp;используется <abbr title="Internet Explorer 5.0">IE5.0</abbr>,&nbsp;5.5 или&nbsp;6.0, что&nbsp;собственно нам&nbsp;и&nbsp;требовалось.</p>
<p>Добавим кавычки для inline-цитат в&nbsp;<abbr title="Internet Explorer">IE</abbr> ниже 8-й&nbsp;версии:</p>
<pre><code class="javascript">function quote() {
  if(MSIE &amp;&amp; navigator.userAgent.search('MSIE 8.') == -1) {
    var i, list = document.getElementsByTagName('q'),
    length = list.length;
    for(i = 0; i &lt; length; i++)
      list[i].innerHTML = '&amp;laquo;' + list[i].innerHTML + '&amp;raquo;';
  }
}</code></pre>
<p><abbr title="Internet Explorer 8.0 beta 1">IE8b1</abbr>&nbsp;выдает такой же&nbsp;номер версии &laquo;JScript&raquo;, как&nbsp;и&nbsp;<abbr title="Internet Explorer 7">IE 7</abbr>, поэтому &laquo;отсекаем&raquo; его, используя поиск подстроки &laquo;<var>MSIE&nbsp;8.</var>&raquo; в&nbsp;строке, возвращаемой выражением &laquo;<code>navigator.userAgent</code>&raquo;.</p>
<p>Добавление кавычек выполняется заменой &laquo;<code>.innerHTML</code>&raquo; для&nbsp;каждого тега&nbsp;<code>&lt;q&gt;</code> на&nbsp;результат сложения 3-х&nbsp;строк: &laquo;<code>&amp;laquo;</code>&raquo;, &laquo;<code>list[i].innerHTML</code>&raquo; и&nbsp;&laquo;<code>&amp;raquo;</code>&raquo;, где&nbsp;&laquo;<code>list[i].innerHTML</code>&raquo;&nbsp;&mdash; <abbr title="Hypertext Markup Language">HTML</abbr>-код текущего тега <code>&lt;q&gt;</code> на&nbsp;каждом шаге цикла&nbsp;&laquo;<code>for</code>&raquo;, перебирающего по&nbsp;порядку все&nbsp;теги <code>&lt;q&gt;</code>, встречающиеся в&nbsp;документе. Вставляем именно &laquo;<code>&amp;laquo;</code>&raquo; и&nbsp;&laquo;<code>&amp;raquo;</code>&raquo;&nbsp;&mdash; &laquo;елочки&raquo;, потому&nbsp;что в&nbsp;русской типоргафике принято ставить кавычки такого вида. Можно пойти дальше и&nbsp;по правилам типографики оформить вложенные inline-цитаты, но&nbsp;такие случаи встречаются крайне редко, поэтому не&nbsp;будем усложнять код и&nbsp;остановимся на&nbsp;таком варианте.</p>
<p>Перепишем наш код более грамотно, чтобы не&nbsp;засорять глобальное пространство имен:</p>
<pre><code class="javascript">var correction = {
  MSIE: 0/*@cc_on+@_jscript_version*10%10@*/,
  abbr: function() {
    if(this.MSIE &amp;&amp; this.MSIE &lt; 7) {
      var node = document.getElementsByTagName('body')[0];
      node.innerHTML = node.innerHTML
      .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
      .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
    }
  },
  quote: function() {
    if(this.MSIE &amp;&amp; navigator.userAgent.search('MSIE 8.') == -1) {
      var i, list = document.getElementsByTagName('q'),
      length = list.length;
      for(i = 0; i &lt; length; i++)
        list[i].innerHTML = '&amp;laquo;' + list[i].innerHTML + '&amp;raquo;';
    }
  }
};</code></pre>
<p>Теперь объект &laquo;<var>correction</var>&raquo; содержит числовое значение &laquo;<var>MSIE</var>&raquo; и&nbsp;2&nbsp;функции: &laquo;<code>abbr</code>&raquo; и&nbsp;&laquo;<code>quote</code>&raquo;. Выполним эти&nbsp;функции по&nbsp;событию &laquo;<code>window.onload</code>&raquo;:</p>
<pre><code class="javascript">var correction = {
  MSIE: 0/*@cc_on+@_jscript_version*10%10@*/,
  abbr: function() {
    if(this.MSIE &amp;&amp; this.MSIE &lt; 7) {
      var node = document.getElementsByTagName('body')[0];
      node.innerHTML = node.innerHTML
      .replace(/&lt;ABBR/g, '&lt;SPAN class=&quot;abbr&quot;')
      .replace(/&lt;\/ABBR&gt;/g, '&lt;/SPAN&gt;');
    }
  },
  quote: function() {
    if(this.MSIE &amp;&amp; navigator.userAgent.search('MSIE 8.') == -1) {
      var i, list = document.getElementsByTagName('q'),
      length = list.length;
      for(i = 0; i &lt; length; i++)
        list[i].innerHTML = '&amp;laquo;' + list[i].innerHTML + '&amp;raquo;';
    }
  },
  fixIE: function(listener) {
    if(window.attachEvent) window.attachEvent('onload', function() {
      correction.abbr();
      correction.quote();
    });
  }
};

correction.fixIE();</code></pre>
<p>Мы&nbsp;добавили функцию &laquo;<code>fixIE</code>&raquo;, которая поместит в&nbsp;обработчик события &laquo;<code>window.onload</code>&raquo; запуск функций &laquo;<code>abbr</code>&raquo; и&nbsp;&laquo;<code>quote</code>&raquo;. Объект &laquo;<var>correction</var>&raquo; можно расширять, добавляя всевозможные &laquo;фиксы&raquo; для&nbsp;разных браузеров.</p>
<p>Теперь Вы&nbsp;можете использовать теги <code>&lt;abbr&gt;</code> и&nbsp;<code>&lt;q&gt;</code> на&nbsp;страницах Вашего сайта, не&nbsp;боясь, что&nbsp;для&nbsp;пользователей <abbr title="Internet Explorer">IE</abbr> они&nbsp;будут представлены в&nbsp;неправильном виде.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/abbr-%d0%b8-q-%d0%b2-internet-explorer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.codeisart.ru @ 2012-02-04 10:43:06 -->
