Как настроить таргетинг только на Internet Explorer 10 для определенных ситуаций, таких как CSS для Internet Explorer или код JavaScript для Internet Explorer?


160

Как настроить таргетинг только на Internet Explorer 10 для определенных ситуаций, таких как CSS для Internet Explorer или код JavaScript для Internet Explorer?

Я пробовал это, но это не работает:

<!--[if IE 10]>    <html class="no-js ie10" lang="en"> <![endif]-->
<!--[if !IE]><!--> <html lang="en" class="no-js"> <!--<![endif]-->

Internet Explorer 10 игнорирует условные комментарии и использует <html lang="en" class="no-js">вместо <html class="no-js ie10" lang="en">.


8
Я думаю, что лучший вопрос будет таким: как мне заставить этот CSS выглядеть одинаково в обоих браузерах?
BentOnCoding

12
IE10 PP4 все еще поддерживает @cc_onзаявление . Таким образом, для определения того , IE10 поддерживает или нет, вы можете использовать следующий код: <!--[if !IE]><!--><script>if(/*@cc_on!@*/false){document.documentElement.className+=' ie10';}</script><!--<![endif]-->. (Я разместил это в качестве комментария, поскольку IE все еще находится в разработке, поэтому неизвестно, будет ли финальная версия также поддерживать эту функцию)
Rob W

15
@RobW - Ваш пример кода будет неправильным, как только ie11 выйдет. Улучшенная версия: <script>if(Function('/*@cc_on return document.documentMode===10@*/')()){document.documentElement.className+=' ie10';}</script>Улучшения: не требует условных комментариев; работает, даже если сжатие / обработка комментариев убраны; класс не добавлен для ie11; будет работать с ie11, работающим в режиме совместимости с ie10; не нуждается в отдельном теге скрипта (может быть просто добавлен в другой javascript в голове).
Робокат

2
Пример приведенного выше фрагмента кода: jsbin.com/upofoq/2
robocat

8
Более общее решение: if(document.documentMode) document.documentElement.className+=' ie'+document.documentMode+'mode';- которое решает 90% проблем (иногда режимы совместимости выходят из строя, и в этом случае вам необходим еще один уровень исправления).
Робокат

Ответы:


65

Возможно, вы можете попробовать некоторые jQuery, как это:

if ($.browser.msie && $.browser.version === 10) {
  $("html").addClass("ie10");
}

Чтобы использовать этот метод, вы должны включить библиотеку jQuery Migrate, поскольку эта функция была удалена из основной библиотеки jQuery.

Получилось неплохо для меня. Но, конечно, нет замены для условных комментариев!


3
Я не уверен в вас, ребята, но мне нужно использовать == '10.0'его для работы
lulalala

112
Предупреждение: jQuery.browserбольше не доступно в текущей версии jQuery (1.9) без плагина. blog.jquery.com/2013/01/15/…
dave1010

2
Я бы порекомендовал: if (jQuery.browser.msie && jQuery.browser.version < 10) { // do what you will here }обратите внимание на verion <10 для обнаружения более старых версий IE. IE10 и выше отлично работает со всеми моими CSS3, HTML5, jquery и т. Д.
Дэн Мантыла

1
@dan, потому что условные комментарии работают во всех браузерах IE, менее 10 используют их вместо того, чтобы загромождать ваш JS для всех браузеров. Просто скажите <! - [if lte IE 9]> и вы можете настроить таргетинг на все версии IE менее 10. JS не требуется.
Эдхуртиг

1
@ Marc-AndréLafortune поднимает хороший вопрос. Как правило, вы всегда должны использовать оператор ===, а не ==. При написании JavaScript вы должны помнить об этом. stackoverflow.com/questions/359494/…
Стюарт

132

Я бы не стал использовать JavaScript navigator.userAgentили $ .browser (который использует navigator.userAgent), поскольку он может быть подделан.

Чтобы настроить таргетинг на Internet Explorer 9, 10 и 11 (Примечание: также последний Chrome):

@media screen and (min-width:0\0) { 
    /* Enter CSS here */
}

Для таргетинга на Internet Explorer 10:

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
    /* IE10+ CSS here */
}

Чтобы настроить таргетинг на Edge Browser:

@supports (-ms-accelerator:true) {
  .selector { property:value; } 
}

Источники:


Это очень мило. Но насколько мы должны беспокоиться при тестировании различных режимов документов в сравнении с режимами браузера в IE? В каких ситуациях мы можем ожидать, что пользователи онлайн будут использовать режим документа, отличный от текущего режима браузера?
Klewis

люди обычно не меняют режим документа. Они могут, но я не встречал ни одного сайта, который требовал бы от пользователя изменения режима документа. Если вы используете правильный DOCTYPE, это совсем не проблема.
Рони

3
Ты мой герой! Просто примечание, это также исправило некоторые вещи, запутавшиеся в IE11
locrizak

8
Это влияет и на IE11 - поэтому, если вы ищете решение для таргетинга только на IE9 / 10, это не сработает :-(
Lukasz Lenart

1
Что вы подразумеваете под «все они обнаруживают браузер через navigator.userAgent»? Условная компиляция - это встроенная функция среды выполнения JScript, которая не может быть подделана с помощью строки агента пользователя.
BoltClock

111

Я нашел решение на этом сайте, где у кого-то был ценный комментарий :

Решение:

if (Function('/*@cc_on return document.documentMode===10@*/')()){
    document.documentElement.className+=' ie10';
}

Это

  • не нуждается в условных комментариях;
  • работает, даже если сжатие / обработка комментариев убраны;
  • класс IE10 не добавлен в Internet Explorer 11;
  • с большей вероятностью будет работать, как и предполагалось, с Internet Explorer 11, работающим в режиме совместимости с Internet Explorer 10;
  • не нуждается в отдельном теге скрипта (может быть просто добавлен в другой код JavaScript в голове).
  • не нужно jQuery для тестирования

3
@ dave1010 Пользовательские агенты могут быть легко подделаны. Условные комментарии поддерживаются только движком JScript, который доступен только в IE4 + (включая 10).
Роб W

2
@ dave1010 Написание работающего парсера, который делает то, что вы описываете, сложно и крайне маловероятно. Любой, кто намеренно создает и устанавливает такое расширение, скорее всего, намеревается «вести себя как» IE (возможно, для целей автоматического тестирования в средах, отличных от Windows?). 100% доверие никогда не гарантируется в браузерах, но вы можете подойти достаточно близко. Условные комментарии - это очень надежный способ обнаружения движка JScript, который используется IE.
Роб W

3
Единственный недостаток, который я вижу, это то, что для этого требуется js, а условия
Джеймс Вестгейт,

4
Это должен быть главный ответ, и требование JS должно быть спорным для пользователей IE10 - если JS отключен, это, вероятно, будет просто дополнение NoScript. Я думаю, что нам нужно больше просвещения общественности о явной глупости NoScript (в отличие от вменяемых аддонов, таких как AdBlock или Ghostery).
Ионо

8
Я бы предложил использовать альтернативный код, предоставленный автором: if (/*@cc_on!@*/false && document.documentMode === 10) {}который обходит все предупреждения в программах linting.
ajbeaven

62

Internet Explorer 10 больше не пытается читать условные комментарии. Это означает, что он будет обрабатывать условные комментарии так же, как и любой другой браузер: как обычные комментарии HTML, которые должны полностью игнорироваться. Рассматривая разметку, приведенную в вопросе в качестве примера, все браузеры, включая IE10, будут полностью игнорировать части комментариев, выделенные серым цветом. Стандарт HTML5 не упоминает синтаксис условных комментариев, и именно поэтому они решили прекратить поддерживать его в IE10.

Однако обратите внимание, что условная компиляция в JScript по-прежнему поддерживается, как показано в комментариях, а также в более поздних ответах. Это не уйдет в финальной версии, в отличие отjQuery.browser . И, конечно, само собой разумеется, что сниффинг пользовательского агента остается таким же хрупким, как и всегда, и никогда не должен использоваться ни при каких обстоятельствах.

Если вам действительно нужно настроить таргетинг на IE10, либо используйте условную компиляцию, которая, возможно, все еще увидит поддержку в ближайшем будущем, либо - если вы можете помочь - используйте библиотеку обнаружения функций, такую ​​как Modernizr, вместо (или в сочетании с) обнаружения в браузере. Если ваш сценарий использования не требует noscript или размещения IE10 на стороне сервера, прослушивание пользовательского агента будет скорее головной болью, чем жизнеспособным вариантом.

Звучит довольно громоздко, но помните, что как современный браузер, который в высшей степени соответствует современным веб-стандартам 1 , при условии, что вы написали совместимый код, который в высшей степени соответствует стандартам, вам не нужно откладывать специальный код для IE10, если в этом нет крайней необходимости, то есть он должен напоминать другие браузеры с точки зрения поведения и рендеринга. 2 И это звучит неправдоподобно, учитывая историю IE, но сколько раз вы ожидали, что Firefox или Chrome будут вести себя одинаково, только чтобы встретить смятение?

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


1 Не только IE10, но и IE9, и даже IE8, который обрабатывает большую часть зрелого стандарта CSS2.1 гораздо лучше, чем Chrome, просто потому, что IE8 был так сосредоточен на соблюдении стандартов (в то время CSS2.1 уже был довольно стабилен с незначительными отличиями) от сегодняшней рекомендации) в то время как Chrome кажется чуть более чем полированной технологической демонстрацией передовых псевдостандартов.

2 И я могу быть предвзятым, когда говорю это, но это точно так же, как и черт. Если ваш код работает в других браузерах, но не в IE, вероятность того, что это проблема с вашим собственным кодом, а не с IE10, намного лучше, чем, скажем, 3 года назад, с предыдущими версиями IE. Опять же, я могу быть предвзятым, но давайте будем честными: не так ли? Просто посмотрите на ваши комментарии.


20
Да, IE10 все еще сильно отстает от webkit и gecko. У меня есть немного CSS, который хорошо выглядит в webkit и отвратителен в IE10. Если я не могу найти способ выборочного применения стилей, мне придется отказаться от таких стилей. :(
trusktr

2
Стоит отметить, что условные комментарии были удалены в IE10, так как теперь у него есть анализатор HTML5. Условные комментарии недопустимы в соответствии с алгоритмом синтаксического анализа HTML5. См. Раздел о старых функциях blogs.msdn.com/b/ie/archive/2011/07/06/…
Дэвид Стори

3
@trusktr, если вы хорошо его кодируете, тогда он будет хорошо смотреться во всех последних браузерах.
Клевис Михо

10
@KlevisMiho Не правда, Chrome и Firefox поддерживают функции, которых нет в IE, даже если они хорошо написаны. Если вы имеете в виду «использовать только общие функции», это не совсем то же самое, что «хорошо кодировать».
trusktr

5
@Dan Mantyla: В этом случае<!--[if !IE]><!-->stuff you don't want IE9 and below to see<!--<![endif]-->
BoltClock

36

Хорошее место для начала - документация по поддержке стандартов IE .

Вот как настроить таргетинг IE10 на JavaScript:

if ("onpropertychange" in document && !!window.matchMedia) {
...
}

Вот как настроить таргетинг IE10 в CSS:

@media all and (-ms-high-contrast: none) {
...
}

В случае, если IE11 необходимо отфильтровать или сбросить с помощью CSS, см. Другой вопрос: Как написать CSS-хак для IE 11?


5
Ваше CSS-решение также влияет на IE11: \
Лукаш Ленарт

11

Оба решения, размещенные здесь (с небольшими изменениями) работают:

<!--[if !IE]><!--><script>if(/*@cc_on!@*/false){document.documentElement.className='ie10';}</script><!--<![endif]-->

или

<script>if(Function('/*@cc_on return 10===document.documentMode@*/')()){document.documentElement.className='ie10';}</script>

Вы включаете любую из приведенных выше строк внутри тега head своей html-страницы перед ссылкой css. И затем в файле CSS вы указываете свои стили, имеющие класс ie10 в качестве родителя:

.ie10 .myclass1 { }

И вуаля! - другие браузеры остаются неизменными. И вам не нужен JQuery. Пример того, как я это реализовал, вы можете увидеть здесь: http://kardash.net .


11

Я написал небольшой ванильный плагин JavaScript под названием Layout Engine , который позволяет вам легко обнаруживать IE 10 (и любой другой браузер) простым способом, который невозможно подделать, в отличие от прослушивания пользовательского агента.

Он добавляет имя механизма рендеринга в виде класса в тег html и возвращает объект JavaScript, содержащий поставщика и версию (при необходимости).

Прочтите мой пост в блоге: http://mattstow.com/layout-engine.html и получите код на GitHub: https://github.com/stowball/Layout-Engine.


7

Я использую этот скрипт - он устарел, но эффективен для нацеливания на отдельную таблицу стилей Internet Explorer 10 или файл JavaScript, который включается только в том случае, если браузер Internet Explorer 10, так же, как при использовании условных комментариев. Никакой jQuery или другой плагин не требуется.

<script>
    /*@cc_on
      @if (@_jscript_version == 10)
          document.write(' <link type= "text/css" rel="stylesheet" href="your-ie10-styles.css" />');
      @end
    @*/
</script >

2
Прохладно. Не могли бы вы добавить немного информации о том, что эти @statements?
trusktr

6

Вы можете использовать PHP, чтобы добавить таблицу стилей для IE 10

Подобно:

if (stripos($_SERVER['HTTP_USER_AGENT'], 'MSIE 10')) {
    <link rel="stylesheet" type="text/css" href="../ie10.css" />
}

2
Верхняя строка не имеет смысла, так как стрипы не чувствительны к регистру;)
mgutt

2
Я всегда склоняюсь к этому, но потом вспоминаю, что он ломается, когда на входе есть cdn / cache / proxy.
Йохан

5

Если вы должны сделать это, вы можете проверить строку агента пользователя в JavaScript:

var isIE10 = !!navigator.userAgent.match(/MSIE 10/);

Как уже упоминали другие люди, я бы всегда рекомендовал вместо этого обнаруживать функции.



4
String.match()вернет массив для совпадения или нуля, если это не так. !(String.match())возвращает значение false для совпадения или true для отсутствия совпадения. !(!(String.match()))возвращает значение true для совпадения или false для отсутствия совпадения. !(!(something))или просто !!somethingпреобразовывает что-либо в логическое значение true / false. stackoverflow.com/questions/784929/…
dave1010

@FranciscoCorralesMorales О, сколько раз меня об этом спрашивали, когда мой код проверяли. :) В качестве дополнения к замечательному комментарию dave1010, его можно использовать для приведения истинных или ложных значений к внутренним booleanзначениям, например var name = 'me', hasName = !!name;.
WynandB

4

Если вы хотите использовать IE 10 с Vanilla JavaScript, вы можете попробовать определить свойства CSS:

if (document.body.style.msTouchAction != undefined) {
  document.body.className = 'ie10';
}

Свойства CSS

Вместо этого msTouchActionвы также можете использовать одно из этих свойств CSS, поскольку в настоящее время они доступны только в IE 10. Но это может измениться в будущем.

  • msTouchAction
  • msWrapFlow
  • msWrapMargin
  • msWrapThrough
  • msScrollLimit
  • msScrollLimitXMin
  • msScrollLimitYMin
  • msScrollLimitXMax
  • msScrollLimitYMax
  • msFlexbox
  • msFlex
  • msFlexOrder

Тестовая страница

Я собрал тестовую страницу со всеми свойствами на CodePen.


3

clipBoardData - это функция, которая доступна только в IE, поэтому, если вы хотите настроить таргетинг на все версии IE, вы можете использовать

<script type="text/javascript">
if (window.clipboardData)
            alert("You are using IE!");
</script>

-1 а как же версии? как вы можете сказать, какая версия?
Франциско Корралес Моралес

Браузер Edge также не имеет "window.clipboardData"
AFD

@AFD Этот вопрос касается IE, а не Edge.
TylerH

3

CSS для IE10 + и IE9

@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
    /* IE10+ styles */
}

@media screen\0 {
    /* IE8,9,10 styles*/
}

1

Вы можете использовать функцию обнаружения, чтобы увидеть, является ли браузер IE10 или выше, например, так:

var isIE = false;
if (window.navigator.msPointerEnabled) {
    isIE = true;
}

Верно только если> IE9



1

С помощью JavaScript:

if (/Trident/g.test(navigator.userAgent)) { // detect trident engine so IE
        document.getElementsByTagName('html')[0].className= 'no-js ie'; }

Работа для всех IE.

IE08 => 'Trident/4.0'

IE09 => 'Trident/5.0'

IE10 => 'Trident/6.0'

IE11 => 'Trident/7.0'

Так что меняйте /Trident/g, /Trident/x.0/gгде x = 4, 5, 6или 7(или, может быть, 8на будущее).


1

Я просто хотел добавить свою версию обнаружения IE. Он основан на фрагменте, найденном по адресу http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments/, и расширен также для поддержки ie10 и ie11. Он обнаруживает IE 5 до 11.

Все, что вам нужно сделать, это добавить его куда-нибудь, и тогда вы всегда можете проверить с простым условием. Глобальная переменная isIEбудет неопределенной, если это не IE, иначе это будет номер версии. Таким образом, вы можете легко добавлять такие вещи, как if (isIE && isIE < 10)или так.

var isIe = (function(){
    if (!(window.ActiveXObject) && "ActiveXObject" in window) { return 11; /* IE11 */ }
    if (Function('/*@cc_on return /^10/.test(@_jscript_version) @*/')()) { return 10; /* IE10  */ }
    var undef,
        v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i');
    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
            all[0]
        );
    return v > 4 ? v : undef;
}());

0

Для меня следующий код работает нормально, все условные комментарии работают во всех версиях IE:

<!--[if lt IE 7 ]> <html class="ie6"> <![endif]-->
<!--[if IE 7 ]>    <html class="ie7"> <![endif]-->
<!--[if IE 8 ]>    <html class="ie8"> <![endif]-->
<!--[if IE 9 ]>    <html class="ie9"> <![endif]-->
<!--[if (gt IE 11)|!(IE)]><!--> <html> <!--<![endif]-->

<script>
    if (document.documentMode===10){
        document.documentElement.className+=' ie10';
    }
    else if (document.documentMode===11){
        document.documentElement.className+=' ie11';
    }
</script>

Я на Windows 8.1, не уверен, связано ли это с обновлением ie11 ...


1
(gt IE 11)Бит совершенно ненужное. Вы можете просто сделать это <!--[if !(IE)]<!-->вместо этого.
BoltClock

BoltClock if (gt IE 11) опущен, а браузер пользователя - IE 12 (когда он выйдет), элемент html не будет определен.
Леонардо Гонсалес

0

Вот как я делаю пользовательский CSS для Internet Explorer:

В моем файле JavaScript:

function isIE () {
      var myNav = navigator.userAgent.toLowerCase();
      return (myNav.indexOf('msie') != -1) ? parseInt(myNav.split('msie')[1]) : false;
}

jQuery(document).ready(function(){
    if(var_isIE){
            if(var_isIE == 10){
                jQuery("html").addClass("ie10");
            }
            if(var_isIE == 8){
                jQuery("html").addClass("ie8");
                // you can also call here some function to disable things that 
                //are not supported in IE, or override browser default styles.
            }
        }
    });

И затем в моем файле CSS вы определяете каждый отдельный стиль:

.ie10 .some-class span{
    .......
}
.ie8 .some-class span{
    .......
}


0

используйте Babel или машинопись для преобразования этого кода JS

const browser = () => {
    // "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3576.0 Safari/537.36"
    // "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.17 Safari/537.36"
    // "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"
    // "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0"
    // "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; rv:11.0) like Gecko"
    // "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)"
    // "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)"
    // "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)"
    // "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729)"
    const _userAgent = navigator.userAgent;
    const br = {
        "Chrome": "Chrome",
        "Edge": "Edge",
        "Firefox": "Firefox",
        ".NET CLR": "Internet Explorer 11",
    };
    const nobr = {
        "MSIE 10.0": "Internet Explorer 10",
        "MSIE 9.0": "Internet Explorer 9",
        "MSIE 8.0": "Internet Explorer 8",
        "MSIE 7.0": "Internet Explorer 7"
    };
    let thisBrow = "Unknown";
    for (const keys in br) {
        if (br.hasOwnProperty(keys)) {
            if (_userAgent.includes(keys)) {

                thisBrow = br[keys];

                for (const key in nobr) {
                    if (_userAgent.includes(key)) {
                        thisBrow = nobr[key];
                    }
                }

            }
        }
    }

    return thisBrow;
};


Привет, Александр, спасибо за идею! Не уверен, почему кто-то проголосовал, но я проголосовал, потому что ответ - по крайней мере полезный совет. Кто бы ни отрицал, почему бы не помочь новому пользователю с полезными советами?
trusktr

-2

Этот ответ дал мне 90% пути туда. Я нашел остальную часть моего ответа на сайте Microsoft здесь .

Код ниже - это то, что я использую для нацеливания на всех, т.е. добавив класс .ie в <html>

Использование JQuery (который осуждается .browser в пользу агентов пользователей в 1.9+ см http://api.jquery.com/jQuery.browser/ ) , чтобы добавить класс .ie:

// ie identifier
$(document).ready(function () {
  if (navigator.appName == 'Microsoft Internet Explorer') {
    $("html").addClass("ie");
  }
});

«что устарело .browser в пользу пользовательских агентов в 1.9+». Это не говорит «в пользу пользовательских агентов» - что бы это ни значило - оно говорит в пользу обнаружения функций .
BoltClock

-2

Если вы не против таргетинга браузеров IE10 и выше и браузеров не IE, вы можете использовать этот условный комментарий:

<!--[if gt IE 9]><!--> Your code here. <!--<![endif]-->

Получено из http://www.paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither


1
Я не сделал -1 ваш ответ , но ссылка кажется несколько outd- восемь -ed. Стоит также отметить, что OP предназначался только для IE10 и IE10. В любом случае, ваш фрагмент кода не будет работать ни для IE10 и выше, ни для любых других браузеров, отличных от IE, поскольку условные комментарии поддерживаются только в IE5 до IE9.
WynandB

-2

Если вам действительно нужно, вы можете заставить условные комментарии работать, добавив следующую строку <head>:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9">

Источник


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.