Ошибка JavaScript при работе со ссылками исправление проблем с a href


Содержание материала:

Google PageSpeed Insights: «Удалите код JavaScript и CSS, блокирующий отображение верхней части страницы»

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

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

Хочу обратить внимание – каждый сайт индивидуален. И если для одного сайта некоторые решения будут полезны, то для другого могут оказать негативное влияние.

Суть проблемы

Данное предупреждение срабатывает, когда в коде документа между тегами … обнаружены ссылки на внешние файлы javascript и css. И пока они не будут загружены, дальнейший рендеринг страницы не будет выполняться. Таким образом они блокируют вывод контента на странице.

Как удалить JavaScript, препятствующий отображению верхней части страницы

Большинство рекомендаций в Интернете сводятся к тому, чтобы перенести все скрипты в подвал сайта. Однако не стоит слепо выполнять эту рекомендацию — есть большая вероятность того, что функционал сайта будет нарушен:

    Для начала мы должны убедиться, что JavaScript не участвует в процессе отображения страницы. Скрипты небольшого размера размещаем в самом содержимом HTML страницы. Например: Проверяем скрипты на зависимости и очередность загрузки. Если ни того, ни другого не имеется, то добавляем к ним атрибут «async»:
  • Благодаря этому атрибуту такие скрипты будут загружаться асинхронно.

Данную инструкцию нельзя применять к библиотеке JQuery, которая используется в подавляющем большинстве сайтов. Далее рассмотрим правильное решение для JQuery.

Нужно ли использовать ‘#’ или ‘javascript:vo >

  • Сайтостроение
  • Статьи
  • Верстка сайта

Стоит ли применять JavaScript void 0 ? Если использовать # , и тем самым препятствуя привычной работе ссылок, ( например, для прокрутки к верху страницы ), то приходится указывать и значение return false для функции в событии onclick :

Если вместо этого использовать javascript:void , то использовать return false не нужно, так как void(0) – самый миниатюрный скрипт, который расценивается как undefined . То есть:

Тот же эффект, что и при использовании href=»#» , только код с JavaScript void меньше и чище.

JavaScript: void(0)

Когда мы используем JavaScript в навигации, значение return в исполняемом скрипте становится содержимым нового документа, который отображается в браузере. Оператор void превращает значение return value в следующем за ним выражении в return undefined , что и предотвращает исполнение данного события.

Ссылка перенаправляет браузер на текстовую версию результатов, которые расценены как JavaScript . Однако если результатом будет undefined , то браузер останется на той же странице. JavaScript void 0 — что значит? Это миниатюрный скрипт, который определяется как undefined .

Однако javascript:void(0) ; нарушает Content Security Policy ( CSP, политика защиты контента ) у протокола HTTPS эта защита включена. Это помогает выявлять и нивелировать определенные типы атак, включая Cross-Site Scripting ( XSS ), инъекции вредоносных данных.

Следовательно, если вы суеверный разработчик, то пользуйтесь href=»#» вместо javascript:void и не беспокойтесь о нарушении политики защиты.

Хэш безопаснее в тех случаях, когда у пользователей отключена поддержка JavaScript .

Хотя эту проблему можно легко обойти за счет jQuery :

Можно даже вернуть false в атрибут элемента onclick , и получить тот же эффект:

Несколько рекомендаций напоследок

В href javascript void 0 используется, если нужен четкий и быстрый результат.

href=»#» и предотвращение исполнения события используется тогда, когда не хочется нарушать стандарты JavaScript.

Ошибка JavaScript при работе со ссылками: исправление проблем с a href

Как известно в различных системах управления сайтов используют wysiwyg редакторы и одним из самых популярных является редактор CKEditor. Написано он на Javascript и используется, например, в CMS Drupal или Opencart версий до второй. Полностью скачать его можно с официального сайта CKEditor, как не удивительно с названием http://ckeditor.com/ ).

Итак расскажу какие проблемы могут возникнуть при работе с ним. Первое и что самое раздражающее CKeditor последних версий режет теги, которые мы используем при редактировании записи. За такое непотребное поведение отвечает AdvancedContentFilter (AСF). Зачастую AdvancedContentFilter (AСF), нововведение появившееся в CKEditor начиная с версии 4.1, вызывает именно такую реакцию. Создатели CKEditor им очень гордятся и настаивают на его необходимости. По умолчанию он настроен таким образом, чтобы в результирующий HTML не попадало ничего кроме того, что ЯВНО РАЗРЕШЕНО.

Чтобы отключить его полностью, нужно в конфигурационном файле / ckeditor /config.js добавить строчку:

config.allowedContent = true;

либо можно явно задать в нем допустимые тэги и атрибуты.

Не работает якорь в ссылке #

02.09.2010, 21:48

Не работает переход по ссылке
Есть форма с кнопкой , у которой по событию onclick выполняется код javascript: .

Не работает переход по ссылке
Не понимаю, почему не работает переход по ссылке. ССылка есть — перехода нет. Вот часть кода .

Не работает переход по ссылке option в Jquery Combo Box Plugin
Здравствуйте. Помогите пожалуйста решить проблему. Взял к себе плагин Jquery Combo Box Plugin.

Как сделать якорь на статью по внешней ссылке?
У меня на сайте http://inn.org.ua/ идет вверху ссылка «Шифр коду номера» при ее нажатии внизу.

Как сделать переход по якорной ссылке на 100 px выше, чем расположен якорь?
Есть якорная ссылка. Как сделать преход по ней не к самому якорю, а выше на фиксированное.

Как найти ошибку в JavaScript

Мне частенько присылают 50-100 строк кода JavaScript (или даже больше) и задают 1 вопрос: «Где здесь ошибка?» или «Почему не работает?«. Когда мне то же самое присылают по PHP, то у меня есть статья: основной инструмент при поиске ошибок в коде, и он подходит для всех языков, но у JavaScript есть одна маленькая особенность при поиске ошибок. Вот о том, как найти ошибку в JavaScript, я и расскажу.

Вы должны знать, что есть синтаксические ошибки, а есть алгоритмические. Вот второй тип ошибок при помощи статьи, ссылку на которую я указал, без проблем решается. Только вместо echo надо использовать alert(). Но вот с синтаксическими ошибками возникают проблемы. Если другие языки сразу же показывают текст ошибок, то JavaScript не делает вообще ничего, как будто никакого скрипта и в помине нет.

В Firebug есть возможность поиска ошибок в JavaScript, есть всякие расширения и для других браузеров. И их можно использовать, однако, не всегда они под рукой, поэтому я предлагаю следующий универсальный метод поиска синтаксических ошибок в JavaScript:

  1. Комментируется весь код, оставляя лишь 1 верхнюю строчку.
  2. Вызывается alert() с любой строкой.
  3. Если alert() не появляется, значит, ошибка в верхней строчке.
  4. Если alert() появляется, надо расскоментировать ещё одну строчку и далее к пункту 2.
  5. И так до тех пор, пока не будет найдена ошибка.

Давайте разберём его на практике, допустим, надо найти ошибку в этом коде, который вообще никак не запускается:

var a = 15;
var b == 18;
alert(a + b);

Мы хотим увидеть 33, однако, не видим вообще ничего. Значит, где-то имеется синтаксическая ошибка. Следуем по моей инструкции, комментируя все строчки, кроме самой первой. И сразу после неё вызываем alert():

var a = 15;
alert(«ABC»);
/*var b == 18;
alert(a + b);*/

Запустив код, у нас сработает alert(), значит, в 1-й строчке ошибок нет. Двигаемся дальше, расскоментировав ещё одну строку, после которой вызываем alert():

var a = 15;
var b == 18;
alert(«ABC»);
/*alert(a + b);*/

После запуска обнаруживаем, что никакого alert() не сработало, значит, ошибка во 2-й строке. Приглядевшись, мы видим, что зачем-то использовали знак сравнения вместо знака присваивания. Исправив ошибку и расскоментировав весь код:

var a = 15;
var b = 18;
alert(a + b);

Мы получаем долгожданные 33. Надеюсь, Вы поняли методику. Безусловно, я долго описывал, на практике же это делается в течение максимум минуты в коде строк на 50.

Вот таким образом можно достаточно легко найти ошибку в коде JavaScript.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 13 ):

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

    Как использовать консоль браузера Chrome для поиска и исправления ошибок JavaScript

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

    Причины ошибок JavaScript

    JavaScript замечательный, и у него есть много преимуществ, которые улучшают ваш сайт. На самом деле плагины на основе CMS, которые управляют многими магазинами электронной коммерции, используют JavaScript для интеграции всех видов функциональных возможностей, которые улучшают пользовательский опыт.

    В ТЕМУСТАТЬИ

    Диагностика и технический анализ сайта на WordPress: главное что надо сделать и знать

    Как оптимизировать ваш сайт WordPress для конверсий в целевые действия и улучшить связь с клиентом

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

    Конечно, это означает, что посещения вашего сайта могут резко упасть, что может привести к снижению рейтинга в поисковых системах. Мы хотим помочь вам избежать этого. Поэтому воспользуйтесь приведенным ниже советом, чтобы найти и исправить распространенные ошибки JavaScript в браузере Chrome.

    Консоль браузера и проверка ошибок JavaScript?

    Если вы считаете, что проблема на вашем сайте вызвана ошибкой JavaScript, ваш браузер Chrome может легко это проверить. Вот как.

    Шаг 1. Откройте консоль либо в виде отдельной панели, либо в виде ящика рядом с другой панелью.

    У вас есть два варианта открытия панели консоли:

    • Windows / Linux – Нажмите Ctrl + Shift + J.
    • Mac – Нажмите Cmd + Opt + J.

    У вас также есть два варианта открытия консоли в виде ящика рядом с другой панелью:

    • Нажмите Esc при просмотре DevTools.
    • Нажмите кнопку для настройки и управления DevTools, а затем нажмите Показать консоль.

    Шаг 2: Теперь вы увидите данные, отображаемые в консоли. Вот пример на скриншоте.

    Поиск ошибок JavaScript

    Поиск распространенных ошибок JavaScript

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

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

    Если есть какие-либо ошибки JavaScript, вы увидите красную строку текста, указывающую на ошибку. Вы можете нажать на черную стрелку, чтобы развернуть ошибку и увидеть ее полную информацию в консоли. Если в JavaScript нет ошибок, вы не увидите красных линий или сообщений об ошибках.

    Топ 10 самых распространенных ошибок JavaScript

    Теперь давайте углубимся и обсудим некоторые наиболее распространенные ошибки JavaScript, с которыми вы можете столкнуться в Chrome, Safari и Internet Explorer.

    1. Uncaught TypeError: Cannot read property. Невозможно прочитать свойство.

    Эта ошибка возникает в Chrome при вызове метода или при чтении свойства для неопределенного объекта.

    2. TypeError: ‘undefined’ is not an object (evaluating). ‘undefined’ не является объектом (оценка).

    Эта ошибка возникает в Safari при вызове метода или при чтении свойства для неопределенного объекта.

    3. TypeError: null is not an object (evaluating). null не является объектом (оценка).

    Это еще одна ошибка Safari, возникающая при вызове метода или при чтении свойства для нулевого объекта.

    4. (unknown): Script error. Ошибка скрипта.

    Вы увидите эту ошибку, когда ошибка JavaScript, которая не была обнаружена, нарушает политику перекрестного происхождения и пересекает границы домена.

    5. TypeError: Object doesn’t support property. Объект не поддерживает свойство.

    Это ошибка Internet Explorer, возникающая при вызове неопределенного метода.

    6. TypeError: ‘undefined’ is not a function. «undefined» не является функцией.

    Эта ошибка возникает в Chrome, когда вызывается неопределенная функция.

    7. Uncaught RangeError: Maximum call stack. Максимальный стек вызовов.

    Это еще одна ошибка Chrome, которая может быть вызвана рядом сценариев.

    8. TypeError: Cannot read property ‘length’. Невозможно прочитать свойство ‘length’.

    Эта ошибка Chrome срабатывает, когда свойство длины чтения неопределенной переменной.

    9. Uncaught TypeError: Cannot set property. Невозможно установить свойство.

    Эта ошибка возникает, когда скрипт пытается получить доступ к неопределенной переменной. Без сбоев он вернется как «неопределенный», потому что невозможно установить или получить свойство неопределенной переменной.

    10. ReferenceError: event is not defined. Событие не определено.

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

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

    Однако не всем нам так повезло, так как некоторые обновления и поддержка скриптов полностью прекращаются разработчиками по разным причинам. Они могут обанкротиться или перестать быть заинтересованными в поддержке проекта. Такое случается. Поэтому всегда полезно иметь кого-то в режиме ожидания, чтобы помочь, если вам неудобно самостоятельно устранять ошибки JavaScript.

    Как решить проблему с javaScript

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

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

    То есть по сути перед вами выбор: изучить и сделать самому или нанимать специалиста, который сделает исправление ошибок и решит вашу проблему.

    Если вам критически нужна помощь в поиске и исправлении ошибок JavaScript или поддержке вашего сайта, свяжитесь с нами и я постараюсь помочь вам решить проблему.

    Что пошло не так? Устранение ошибок JavaScript

    Когда вы создали игру «Угадай номер» в предыдущей статье, вы, возможно, обнаружили, что она не работает. Не бойтесь — эта статья призвана избавить вас от разрыва волос над такими проблемами, предоставив вам несколько простых советов о том, как найти и исправить ошибки в программах JavaScript.

    базовая компьютерная грамотность, базовое понимание HTML и CSS, понимание того, что такое JavaScript. Цель получить способность и уверенность в том, чтобы приступить к исправлению простых проблем в вашем собственном коде.

    Топ-пост этого месяца:  Как выбрать доменное имя (название) для интернет-магазина и получить преимущество перед конкурентами

    Типы ошибок

    Когда вы делаете что-то не так в коде, есть два основных типа ошибок, с которыми вы столкнетесь:

    Синтаксические ошибки: Это орфографические ошибки в коде, которые фактически заставляют программу вообще не запускаться, или перестать работать на полпути — вам также будут предоставлены некоторые сообщения об ошибках. Обычно они подходят для исправления, если вы знакомы с правильными инструментами и знаете, что означают сообщения об ошибках!

  • Логические ошибки: Это ошибки, когда синтаксис действительно правильный, но код не тот, каким вы его предполагали, что означает, что программа работает успешно, но дает неверные результаты. Их часто сложнее находить, чем синтаксические ошибки, так как обычно не возникает сообщение об ошибке, которое направляет вас к источнику ошибки.
  • Ладно, все не так просто — есть и другие отличия, которые вы поймете, пока будете изучать язык JavaScript глубже. Однако вышеуказанной классификации достаточно на раннем этапе вашей карьеры. Мы рассмотрим оба эти типа в дальнейшем.

    Ошибочный пример

    Чтобы начать работу, давайте вернемся к нашей игре с угадыванием чисел — за исключением того, что мы будем изучать версию с некоторыми преднамеренными ошибками. Перейдите в Github и сделайте себе локальную копию number-game-errors.html (см. здесь как это работает).

    1. Чтобы начать работу, откройте локальную копию внутри вашего любимого текстового редактора и вашего браузера.
    2. Попробуйте сыграть в игру — вы заметите, что когда вы нажимаете кнопку «Submit guess», она не работает!

    Примечание: Возможно, у вас может быть собственная версия игрового примера, которая не работает, которую вы можете исправить! Мы по-прежнему хотели бы, чтобы вы работали над статьей с нашей версией, чтобы вы могли изучать методы, которые мы здесь преподаем. Затем вы можете вернуться и попытаться исправить ваш пример.

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

    Исправление синтаксических ошибок

    Раньше в курсе мы заставили вас набрать некоторые простые команды JavaScript в консоль разработчика JavaScript (если вы не можете вспомнить, как открыть это в своем браузере, следуйте предыдущей ссылке, чтобы узнать, как это сделать). Что еще более полезно, так это то, что консоль предоставляет вам сообщения об ошибках всякий раз, когда существует синтаксическая ошибка внутри JavaScript, которая подается в механизм JavaScript браузера. Теперь пойдем на охоту.

    1. Перейдите на вкладку, в которой у вас есть number-game-errors.html, и откройте консоль JavaScript. Вы должны увидеть сообщение об ошибке в следующих строках:
    2. Это довольно простая ошибка для отслеживания, и браузер дает вам несколько полезных бит информации, которые помогут вам (скриншот выше от Firefox, но другие браузеры предоставляют аналогичную информацию). Слева направо, у нас есть:
      • Красный «x» означает, что это ошибка.
      • Сообщение об ошибке, указывающее, что пошло не так: «TypeError: guessSubmit.addeventListener не является функцией»
      • Ссылка «Узнать больше», которая ссылается на страницу MDN, которая объясняет, что эта ошибка означает в огромных количествах деталей.
      • Имя файла JavaScript, который ссылается на вкладку «Отладчик» консоли разработчика. Если вы перейдете по этой ссылке, вы увидите точную строку, где подсвечивается ошибка.
      • Номер строки, в которой находится ошибка, и номер символа в этой строке, где первая ошибка. В этом случае у нас есть строка 86, символ номер 3.
    3. Если мы посмотрим на строку 86 в нашем редакторе кода, мы найдем эту строку:
    4. В сообщении об ошибке говорится, что «guessSubmit.addeventListener не является функцией», поэтому мы, вероятно, где-то ошиблись. Если вы не уверены в правильности написания синтаксиса, часто бывает полезно найти функцию на MDN. Лучший способ сделать это в настоящее время — поиск «mdn имя-функции» в вашей любимой поисковой системе. Вот ссылка, которая поможет сократить вам некоторое время в данном случае: addEventListener() .
    5. Итак, глядя на эту страницу, кажется, что ошибка в том, что мы неправильно назвали имя функции! Помните, что JavaScript чувствителен к регистру, поэтому любые незначительные отличия в орфографии или регистре текста могут вызвать ошибку. Изменение этого параметра в addEventListener должно быть исправлено. Сделайте это сейчас.

    Примечание: См. наш TypeError: «x» не является справочной страницей функций для получения дополнительной информации об этой ошибке.

    Синтаксические ошибки: второй раунд

    Примечание: console.log() это часто используемая функция отладки, которая выводит значение в консоль. Поэтому она будет выводить значение lowOrHi в консоли, как только мы попытаемся установить его в строке 48.

    1. Сохраните и обновите страницу, и вы увидите, что ошибка исчезла.
    2. Теперь, если вы попробуете ввести значение и нажать кнопку «Submit guess», вы увидите . другую ошибку!
    3. На этот раз сообщается об ошибке: «TypeError: lowOrHi is null», в строке 78.

    :

  • Поэтому нам нужен селектор классов, который начинается с точки (.), но селектор, передаваемый в метод querySelector() в строке 48, не имеет точки. Возможно, это и есть проблема! Попробуйте изменить lowOrHi на .lowOrHi в строке 48.
  • Повторите попытку сохранения и обновления, и ваш вызов console.log() должен вернуть элемент

    , который мы хотим. Уф! Еще одна ошибка исправлена! Вы можете удалить строку с console.log() сейчас, или оставить для дальнейшего применения — выбирайте сами.

    Примечание: Загляните на справочную страницу TypeError: «x» is (not) «y», чтобы узнать больше об этой ошибке.

    Синтаксические ошибки: третий раунд

    1. Теперь, если вы снова попробуете сыграть в игру, вы должны добиться большего успеха — игра должна играть абсолютно нормально, пока вы не закончите игру, либо угадав нужное число, либо потеряв жизни.
    2. На данном этапе игра снова слетает, и выводится такая же ошибка, как и в начале — «TypeError: resetButton.addeventListener is not a function»! Однако, теперь она происходит из-за строки 94.

    3. Посмотрев на строку 94, легко видеть, что здесь сделана такая же ошибка. Нам просто нужно изменить addeventListener на addEventListener .

    Логическая ошибка

    На этом этапе игра должна проходить отлично, однако, поиграв несколько раз, вы, несомненно заметите, что случайное число, которое вы должны угадать, всегда 0 или 1. Определенно не совсем так, как мы хотим, чтобы игра была разыграна!

    Безусловно, где-то в игре есть логическая ошибка — игра не возвращает ошибку, она просто работает неправильно.

    1. Найдем переменную randomNumber , и строку где в первый раз устанавливали случайное число. Пример, в котором мы храним случайное число, которое должны угадать, на строке 44: И на строке 113, где мы генерируем случайное число, каждый раз после окончания игры:
    2. Чтобы проверить, действительно ли проблема в этом, давайте обратимся к нашему другу console.log() снова — вставьте ее ниже строк с ошибками:
    3. Сохраните и обновите, а дальше попробуйте пару раз сыграть — в консоли вы увидите что randomNumber равна 1 в каждой точке, где вы ее записали после строк с ошибками.

    Работаем через логику

    Чтобы исправить это, давайте рассмотрим как работает строка. Первое, мы вызываем Math.random() , котрый генерирует случайное десятичное число, между 0 и 1, например 0.5675493843.

    Дальше, мы передаем результат вызова Math.random() через Math.floor() , который округляет число вниз, до ближайшего целого числа. Затем мы добавляем 1 к данному результату:

    Округление случайного десятичного числа к меньшему, всегда будет возвращать 0, так что добавление к нему единицы будет возвращать всегда 1. Нам нужно умножить случайное число на 100, прежде чем мы округлим его к меньшему. Следующая строка вернет нам случайное число между 0 и 99:

    поэтому нам нужно добавить 1, чтоб нам возвращалось случайное число между 1 и 100:

    А теперь, исправьте обе строки с ошибками, затем сохраните и обновите, игра должна работать так, как мы и планировали!

    Другие распространенные ошибки

    Существуют и другие распространенные ошибки, которые вы обнаружите в своем коде. В этом разделе показано большинство из них.

    SyntaxError: отсутствует ; перед постановкой

    Эта ошибка обычно означает что вы упустили точку с запятой в конце одной из ваших строк кода, но иногда ошибка может быть более загадочной. Например, если мы изменим эту строку внутри функции checkGuess() :

    Это вызовет данную ошибку, потому что браузер подумает, что вы пытались сделать что-то другое. Вы должны быть уверены, что вы не перепутали оператор присваивания ( = ), который присваивает значение переменной — с оператором сравнения ( === ), который строго сравнивает операнды, и возвращает true / false .

    Примечание: Загляните на справочную страницу Синтаксическая ошибка: пропущен символ ; до объявления инструкции для получения дополнительной информации об этой ошибке.

    В программе всегда говорится, что вы выиграли, независимо от того, что вы ввели

    Причиной этому является все то же перепутывание оператора присваивания ( = ) со строгим сравнением ( === ). Например, если мы изменим внутри checkGuess() эту строку кода:

    мы всегда будем получать true , заставляя программу сообщать, что игра была выиграна. Будьте осторожны!

    SyntaxError: отсутствует ) после списка аргументов

    Эта ошибка проста — обычно она означает, что вы пропустили закрывающую скобку с конца вызова функции / метода.

    Примечание: Загляните на справочную страницу SyntaxError: missing ) after argument list для получения дополнительной информации об этой ошибке.

    SyntaxError: missing : after property >Эта ошибка обычно связана с неправильно сформированным объектом JavaScript, но в этом случае нам удалось получить ее, изменив

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

    SyntaxError: missing > after function body

    Это легко — обычно это означает, что вы пропустили одну из ваших фигурных скобок из функции или условной структуры. Мы получили эту ошибку, удалив одну из закрывающих фигурных скобок возле нижней части функции checkGuess() .

    SyntaxError: expected expression, got ‘string‘ or SyntaxError: unterminated string literal

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

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

    Примечание : Смотрите наш SyntaxError: Неожиданный токен и SyntaxError: незавершенная строка эталонных страниц для получения более подробной информации об этих ошибках.

    Резюме

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

    Самая полная шпаргалка для IE6 или как исправить 25+ ошибок Internet Explorer

    Лучшая практика по «утрясанию дел» с Internet Explorer 6 — отказаться от его поддержки.

    Стоп. Хорошо, я чувствую Ваше огорчение. Вы веб разработчик и Вы готовы рвать на голове волосы, потому что вынуждены поддерживать Internet Explorer 6, или скажем более корректно — IE6 не хочет «дружить» с Вами. Вы тратите на это часы, но Вы не можете выправить макет своей верстки. Сочувствую. Я могу Вам помочь.

    Это не то разглагольствование или компания по поводу «отстрела» IE6. Таких вещей полно в Интернете, но они Вам не помогут если Вам необходима поддержка IE6, этот браузер продолжает занимать значительное место на рынке браузеров и Вы не можете просто так игнорировать его. Нет, этот ресурс Ваша реальная надежда.

    Я «перевернул» кучу ресурсов в Интернет и включил некоторые из моих собственных исправлений для IE6 и теперь я собрал все это вместе в одной шпаргалке/описательном руководстве, как единый источник для того, кто хочет «подружиться» с Internet Explorer 6. Где было возможно, я улучшил решение предлагая более понятный и корректный вариант вместо «кривого» хака. Также я постарался корректно ссылаться на первоисточники, но иногда решения были настолько растиражираваны в Интернет, что найти их начальные источники было очень затруднительно. Если Вам попадется отсутствующая ссылка на первоисточник или если я пропустил какой-либо баг или исправление, пожалуйста свяжитесь со мной и дайте знать, я буду постоянно обновлять эту страницу.

    Сбор материала в этом массивном руководстве для IE6 занял много времени, ссылайтесь на него в своих закладках, распространяйте, оставляйте твитты и конечно-же используйте его, сохраняя свое время и время своих коллег, всместо того, что-бы кричать в свой монитор и биться головой о стол или другие подходящие предметы. Однако, не обманывайте себя, эта шпаргалка важна для меня, как и для Вас.

    Содержание

    Раздел Баг/Фикс/Лучшее решение
    Стратегии
    • Удельный вес IE6
    • Планируйте свой дизайн и делайте все просто
    • Используйте правильный doctype
    • Проверяйте ваш код
    • Сперва разрабатывайте для браузеров совместимых со стандартами
    • Использование прогрессирующих улучшений
    • Используйте правило обнуления CSS
    • Используйте JavaScript фреймворк
    • Используйте JavaScript IE Fix
    • Как делать отладку в IE
    Как отделить IE6
    • Использование условного комментирования для Internet Explorer
    • Как отделить IE6 с помощью селекторов CSS
    • Как использовать JavaScript для определения IE6
    Изображения
    • Альфа прозрачность PNG в IE6
    • Закругленные углы в IE6
    • Как разрешить проблему с мерцанием фоновых изображений
    Макет
    • Понимание hasLayout
    • Бокс модель IE6
    • Минимальная высота
    • Максимальная высота
    • 100% высота
    • Минимальная ширина
    • Максимальная ширина
    • Двойной Margin для Float элементов
    • Как очистить плавающие элементы
    • Падение плавающих элементов
    • Баг гильотины
    • Баг с 1px интервалом для абсолютно спозиционированных элементов
    • Баг 3px интервала для плавающих элементов
    • IE и свойство z-index
    • Баг с overflow
    Списки
    • Проблема с шириной элементов горизонтальных списков
    • Лестничный баг
    • Баг вертикальной разбивки или баг пробельных символов
    Поведение
    • В IE6 нет Hover состояния
    • Реализация тега Canvas в IE
    • IE6 баг рисайзинга
    JavaScript
    • Ошибка: Ожидался Identifier, String или Number
    • Утечки памяти IE JavaScript
    Разное
    • Баг с задвоенными символами
    • Favicons в IE
    • GZip в IE6
    Бонус ресурсы

    Стратегии

    Прежде чем ссылаться на специфичные для IE6 баги и фиксы важно посмотреть на некоторые стратегии, которые помогут минимизировать возникающие проблемы. Небольшие предварительные меры намного более эффективны чем возня с многочисленными ошибками, которые могли быть устранены с помощью использования общепринятых практик.

    Удельный вес IE6

    В соответствии с удельным весом, текущий процент (Август 2009) пользователей IE6 составляет 25.25% (прим. hb: Октябрь 2010 — 15,55%), но по другим источникам этот процент намного меньше 18.1%. Как говорит статистика, мы наблюдаем тренд на снижение. Однако, действительно значимой статистикой будет статистика Вашего собственного сайта. Если у Вас уже есть аналитика по трафику для Вашего сайта, служит ли она оправданием тому, что стоит делать поддержку IE6? Оперируя терминами бизнеса: каково соотношение цена/польза для времени и денег потраченных на разработку под IE6 против того, что-бы вовсе бросить его поддержку? Можете ли Вы сделать бизнес план по поддержке постепенно уходящего IE6?

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

    Планируйте свой дизайн и делайте все просто

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

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

    Используйте правильный doctype

    Отказ от использования правильного (или какого-либо) doctype вызовет включение режима совместимости и будет препятствовать правильному отображению вашей страницы во всех браузерах. Используйте один из следующих doctype: HTML 4.01 Strict, HTML 4.01 Frameset, HTML 4.01 Transitional, XHTML 1.0 Strict, XHTML 1.0 Frameset, XHTML 1.0 Transitional или XHTML 1.1

    HTML 4.01 Strict

    HTML 4.01 Frameset

    HTML 4.01 Transitional

    XHTML 1.0 Strict

    XHTML 1.0 Frameset

    XHTML 1.0 Transitional

    XHTML 1.1

    Проверяйте ваш код

    Я слышал утверждение от нескольких людей, что у проверки кода на ошибки нет никаких отношений с работающим продуктом, но я не покупаю такие продукты. Валидация действительно не настолько важна во многих случаях и занимает всего несколько минут на выполнение. Несколько потраченных минут на валидацию вашего XHTML и CSS может принести пользу для всех браузеров, не только для IE6. Валидация позволяет быть уверенным в устранении проблем с последующей совместимостью и снижает цену на поддержку в будущем. Минимальное и достаточное требование — проверяйте Ваш XHTML. Единственная причина по которой можно проигнорировать этот пункт — использование преимуществ некоторых свойств CSS3 в браузерах, которые могут их поддерживать.

    Сперва разрабатывайте для браузеров совместимых со стандартами

    Так-же как и с проверкой вашего кода, вы избавитесь от головной боли, если первым делом будете производить верстку для браузеров поддерживающих стандарты, таких как Firefox, Opera, Safari и Chrome и затем подстраивать ее для несовместимых браузеров, таких как IE6 и IE7. В следствии того, что совместимые браузеры отображают информацию в той или иной мере одинаково, вы сможете сосредоточиться на «особенностях» Internet Explorer’а. Используя такой подход к процессу верстки, он сможет помочь в будущем улучшать ваш код, так как дает надежную основу и если вы отмечаете ваши поправки, вы сможете безболезненно удалить их, когда поддержка таких браузеров более не потребуется.

    Использование прогрессирующих улучшений

    Прогрессирующие улучшения означают то, что базовая функциональность всегда доступна для всех пользователей до добавления в проект глянца. В общем, термин прогрессирующие улучшения указывает на то, что веб приложения должны работать без JavaScript и с использованием JavaScript добавляться: анимация, Ajax эффекты и т.п., но когда это говорится по отношению к Internet Explorer 6, принцип прогрессирующих улучшений может так-же применяться касательно CSS3 (или даже ко многим частям CSS2), HTML5 и другим веб протоколам, которые IE6 не поддерживает.

    В некоторых случаях, это просто может стать невозможным, когда вы пытатесь донести все свои умения до всех пользователей всех браузеров, в особенности тех, кто использует Internet Explorer 6. Используя стратегию прогрессирующих улучшений будьте уверены, что такие пользователи получают хотя-бы минимальные возможности при работе с вашим сайтом или веб приложением.

    Еще о прогрессирующих улучшениях

    Используйте правило обнуления CSS

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

    Простое обнуление

    Популярные CSS «обнуляторы»

    Используйте JavaScript фреймворк

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

    Список некоторых, самых популярных фреймворков:

    Конечно существует множество других фреймворков и еще большее количество появляется, но их список не для сегодняшнего дня. Из тех, что в списке я люблю, использую и искренне рекомендую MooTools, если вы знакомы с JavaScript. Если Вы новичек, моей рекомендацией стал бы jQuery.

    Используйте JavaScript IE Fix

    В Интернет «мелькают» несколько JavaScript решений, которые заставляют Internet Explorer работать как браузер поддерживающий стандарты. Если Ваша целевая аудитория имеет достаточно высокий процент пользователей IE с включенным JavaScript, Вы можете попробовать использовать скрипт Dean Edwards’ IE7 или другие аналогичные скрипты.

    Как делать отладку в IE

    Internet Explorer «славится» своей нелюбовью к отладке, но существует несколько инструментов позволяющих облегчить жизнь разработчиков. Как говорилось ранее, перво-наперво начинайте работать с браузерами поддерживающими стандарты. Firebug и Web Developer Toolbar прекрасные дополнения для Firefox, которые косвенно помогут содействовать или предугадать в исправлении многих ошибок для IE. Если Вы хотите получить всю мощь Firebug в других браузерах, Firebug Lite будет доступен Вам как апплет для браузера.

    Для тестирования различных версий Internet Explorer, существует пара хороших вариантов если мы не рассматриваем вариант с виртуальной машиной, IE Collection и IETester, оба из которых бесплатны (но все еще имеют недоделки). Производители IETester так-же предлагают DebugBar, плагин для IE, который бесплатен для персонального использования, но требует коммерческую лицензию после 60-ти дневного использования.

    Как отделить IE6

    Первый шаг в деле «уживания» с Internet Explorer 6 возможность отделить его так, что-бы какие-либо изменения в коде отражались только на IE6 и ни на каких других браузерах. Для этого есть несколько путей для IE6: условное комментирование, селекторы CSS, и JavaScript. Мы рассмотрим каждый из этих методов.

    Использование условного комментирования для Internet Explorer

    Microsoft поддерживает условное комментирование, как путь включения кода для определенной версии Internet Explorer. В блоке условного комментирования может быть размещенно что угодно, включая разметку, JavaScript, файлы JavaScript, CSS и внешние таблицы стилей. Условные комментарии работают так, что Вы можете поставить условием срабатывания для них конкретную версию Internet Explorer или любую версию ниже или выше определенной.

    Синтаксис такого комментирования следующий:

    Использование условных таблиц стилей имеет некоторые преимущества для других методов. Стилевая таблица отделяется от других таблиц и абсолютно не мешает работать другим браузерам. Также, когда IE6 вовсе потеряет свою значимость на рынке браузеров, таблица стилей может быть легко удалена без надобности ковыряться в каждом CSS определении.

    К единственному недостатку использования условного комментирования относится необходимость в дополнительном HTTP запросе для требуемого браузера. Хотя такая методика часто применима к таблицам стилей, я бы не рекомендовал применять ее для условных внешних JavaScript файлов, потому что JavaScript файлы работают в блокирующем режиме и не дают загрузится другим файлам пока полностью не загрузятся сами. Если Вам необходим условный JavaScript во внешнем файле, используйте возможности самого JavaScript для определения того, с какой версией он работает.

    Как отделить IE6 с помощью селекторов CSS

    Если Вы не хотите использовать условные таблицы стилей, селекторы CSS это еще один способ отделения IE6. Internet Explorer 6 не поддерживает селекторы потомков. Сперва Вы делаете CSS определения для IE6 и затем используете селекторы потомков для «скармливания» CSS определений браузерам IE7+ и всем современным браузерам.

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

    Еще немного для чтения

    Как использовать JavaScript для определения IE6

    Если Вы хотите определять IE6 используя JavaScript, но не хотите использовать условные комментарии, делайте так:

    Еще немного для чтения

    Изображения

    Internet Explorer 6 имеет несколько спорных вопросов касательно изображений, которые могут застопорить процесс разработки или внести коррективы в Вашу верстку и дизайн. Этот раздел призван помочь Вам избавиться от головной боли.

    Альфа прозрачность PNG в IE6

    Один из самых печальных аспектов Internet Explorer 6, это невозможность поддержки прозрачности для высококачественных изображений и трудности в реализации эффектов связанных со слоями. Существует несколько JavaScript решений, которые я предлагаю ниже, но ни одно из них не предлагает использование CSS спрайтов, за исключением Alpha версия Twin Helix’s IE6 PNG Fix.

    Наипростейшее решение, это сохранение изображений как PNG8 файлов с включенным Альфа каналом прозрачности. Если Вы используете Adobe Fireworks, Вы можете сделать это выбрав Save As > Save as type > Flattened PNG > Options > Alpha Transparency. Если Вы испольуете какой-либо тип заливки, Вы можете выбрать Dither для получения градиента максимально возможного качества. Сохранение как PNG8 с Альфа каналом прозрачности будет отображать полупрозрачность областей изображений как 100% прозрачность, так как здесь нет различных уровней полупрозрачности.

    Другой способ, это добавить специфичный для IE фильтр в таблице стилей CSS предназначенный только для IE6. Aaron Baxter объясняет эту технику в учебнике на своем блоге.

    PNG корректировки через JavaScript

    Закругленные углы в IE6

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

    Как разрешить проблему с мерцанием фоновых изображений

    Если Вы используете CSS спрайты как фоновые изображения к ссылкам или кнопкам, Вы заметите, что изредка изображения мерцают в Internet Explorer 6. Причина — IE6 неправильно кеширует фоновые изображения и перезагружает их все время. Вы можете устранить это с помощью одной единственной строки JavaScript которая заставляет IE6 кешировать изображения.

    Другие решения

    Макет

    Ошибки разметки IE6 это его самая печальная сторона, в особенности если Вы имеете дело с однопиксельным дизайном и он работает во всех браузерах, но не в Internet Explorer 6. Эта секция посвящена этим ошибкам и тому как с ними бороться.

    Понимание hasLayout

    Число багов IE6 и ошибок рендеринга могут быть приписаны к проприетарному концепту от Microsoft hasLayout. Коротко объясняется, что hasLayout переключает какой-либо элемент в заданные размеры, задаваемые через height или width. Отсутствие этих определений приводит к множеству багов, которые Вы несомненно будете иметь при работе с IE6.

    Вместо того, что-бы вдаваться в длинное описание hasLayout, я просто отшлю Вас к превосходному учебнику от John Gallant и Holly Bergevin, который детально опишет когда и как нужно задумываться о hasLayout.

    Еще немного для чтения

    Бокс модель IE6

    Если в Internet Explorer 6 включен режим совместимости, IE6 будет использовать старую реализацию боксовой модели от Microsoft, которая исключает границы и отступы из общей ширины элемента. Общая стратегия в деле с багами заключается в устранении переключения в режим совместимости используя корректный doctype или отказ от применения свойства width к элементам которые уже имеют border или padding. Здесь может быть применено и условное комментирование, но это уже на крайний случай.

    Еще немного для чтения

    Минимальная высота

    IE6 игнорирует свойство min-height и вместо него использует height как минимальную высоту. Спасибо Dustin Diaz, раскопавшей фикс через использование !important, который IE6 переопределяет, а другие браузеры нет. Это-же решение работает и для min-width.

    Другое решение, использование CSS селекторов для достижения такого-же эффекта, но другим путем.

    Максимальная высота

    К сожалению, один единственный путь для достижения max-height эффекта в IE6 это использование специфичного для IE CSS выражения, которое эквивалентно запуску JavaScript в таблице стилей, или использование собственно JavaScript. Из этих двух я рекомендую использовать решение с JavaScript, так как запуск JavaScript через CSS отъедает много ресурсов и может привести к «падению «браузера. Оба решения не будут работать при выключенном JavaScript. Заметим, что это решение годится только для IE6, все остальные браузеры поддерживают max-height.

    JavaScript

    100% высота

    Что-бы элемент достиг 100% высоты в IE6, Вам необходимо определить фиксированную величину высоты его родительского элемента. Если Вам необходимо развернуть на всю высоту размер страницы, примените height:100%; к элементу html и body.

    Минимальная высота

    Аналогично max-height и max-width, min-width не поддерживается IE6. Есть два решения, применить экстра разметку, что-бы достичь желаемого или использовать JavaScript.

    Максимальная ширина

    Есть только один путь реализовать max-width в IE6, и он идет через использование JavaScript.

    JavaScript

    Двойной Margin для Float элементов

    Internet Explorer 6 некорректно удваивает поля для плавающих элементов добавляя такое-же поле к той стороне, в которую данный элемент уплывает. Steve Clason победил этот баг, с помощью простого добавления display:inline; к плавающим элементам.

    Как очистить плавающие элементы

    Если Вы пытаетесь обернуть плавающий элемент в контейнер, но контейнер не желает делать это правильно, обязательно установите height или width свойства контейнера в значения отличные от auto и также добавьте свойство overflow с одним из трех следующих значений: auto, hidden, или scroll. Alex Walker впервые написал об этой технике и отдал должное Paul O’Brien за идею.

    Пример HTML

    Пример CSS

    Еще немного для чтения

    Падение плавающих элементов

    Падение плавающих элементов случается в том случае, когда содержимое плавающего контейнера превысит его заданную ширину. В Firefox, IE7 и других браузерах, содержимое будет просто обрезано, но в Internet Explorer 6, контейнер будет игнорировать заданную ширину и раздвинет ее до размеров содержимого. Если какие-нибудь другие элементы будут выплывать далее за контейнером, они опустятся ниже него.

    Баг с падением плавающих элементов относится к той ошибке IE6 у которой нет правильного решения, по крайней мере из тех, что я смог найти. Ее можно обойти через overflow:hidden; или overflow:scroll;, но скрытое содержимое будет все-равно доступно и скроллируемое значение может поломать верстку. Даже решение с JavaScript не выглядит сподручным из-за проблем с миграцией. Лучшее решение, которое я могу посоветовать, что-бы вовсе устраниться от таких проблем, либо использовать фиксированную верстку, либо сознательно контролировать размер содержимого.

    Еще немного для чтения

    Баг гильотины

    Баг гильотины определенно очень неприятная ошибка IE6 (и IE7). Он обрезает содержимое в плавающем и «неочищенном» элементе, который больше элемента своего контейнера со ссылками имеющими разные hover стили и с неплавающим содержимым идущим после плавающего, при наведении на ссылку мыши. Звучит непонятно? Не беспокойтесь, этот баг и его решение хорошо задокументированы народом на Position Is Everything.

    Несмотря на трудности вызываемые багом, решения довольно просты. Первое касается добавления дополнительного элемента в конец контейнера и установки для него свойства clear:both;. Вторая корректировка вызывается через hasLayout в элементе содержащем ссылки которые вызывают эффект гильотины. Это может быть сделано простым добавлением определения height:1%;.

    Еще немного для чтения

    Баг с 1px интервалом для абсолютно спозиционированных элементов

    Этот баг встречается в IE6 (в IE7 его исправили) из-за ошибки округления. IE6 будет добавлять 1-пиксельный интервал к правой или к нижней границе между абсолютно спозиционированным элементом и относительно спозиционированным родителем, если размер родителя определяется нечетным числом. Единственное реальное решение для этого бага, определение четной высоты и ширины для родительского элемента. Прискорбно, но для резиновой верстки нет реально работающего решения. Paul O’Brien довольно детально объясняет эту проблемы здесь.

    Баг 3px интервала для плавающих элементов

    Так-же называемый 3-х пиксельный баг текстового подталкивания, этот баг появляется в IE6 когда текст граничит с плавающим элементом. IE6 добавляет 3 пиксельное поле между элементом и текстом, даже если в элементе ничего не определено. У Stu Nichols есть определенно элегантное решение этой проблемы.

    IE и свойство z-index

    Если Вы используете свойство z-index на спозиционированном элементе в Internet Explorer 6 или 7, стековый индекс будет обнулен в ноль, вызывая ошибку отрисовки. Решение, указывается некоей персоной под ником baker, и заключается в добавлении наибольшего z-index к родительскому элементу. В некоторых случаях, родительскому элементу также необходимо назначить свойство position:relative.

    Еще немного для чтения

    Баг с Overflow

    Jonathan Snook документирует и решает баг с overflow, который случается, когда свойство overflow установлено на содержащий элемент и у относительно спозиционированного потомка высота больше высоты родителя. В обоих IE6 и IE7, вместо следования согласно объявленного overflow, больший элемент потомок будет всплывать поверх своего родителя. Где выход? Добавить position:relative к контейнеру.


    Списки

    Очевидно, что существует несколько специфичных для IE багов связанных со списками. Здесь перечислены некоторые из них с соответствующими решениями.

    Проблема с шириной элементов горизонтальных списков

    Если Вы пытаетесь построить список элементов ввиде горизонтального меню и применяете свойство float к элементу

  • , Вы увидите, что каждый элемент меню неприятно вытянется до 100% ширины элемента его содержащего, делая меню элементов ввиде вертикального стека, а вовсе не горизонтального. И снова, эта проблема приключается только в IE6. Решение? Спасибо Rofikul Islam Shahin, оно простое. Просто добавьте float:left; к тегу , так-же как добавляли его к
  • и Ваше меню отбразится так, как Вы задумывали.

    Лестничный баг

    Лестничный баг встречается когда содержимое элементов
    плавает и Вы пытаетесь создать горизонтальный список (часто используется для навигации). Каждый элемент будет стремиться встать ввиде вертикального стека или будет всплывать в лестничном виде.

    Каково-же решение? Их два: применить свойство float к

  • или применить display:inline; к элементу
  • .

    Баг вертикальной разбивки или баг пробельных символов

    При создании вертикального списка состоящего из элементов
    с блоковым потомком, Internet Explorer 6 (и возможно в некоторых случаях IE7) будет ошибочно добавлять вертикальные пробелы между элементами списка. Существует несколько решений этой проблемы, но давайте сперва быстренько взглянем на пример.

    Пример HTML

    Пример CSS

    Корректировки
    Jon Hicks получил благодарности за устранение этой проблемы с помощью установки свойств float и clear для якоря в списке

    Другое решение — использовать hasLayout с определением height или width на якорных тегах (или каком-нибудь блоковом потомке).

    Элементу
    также может быть назначено определение display:inline;.

    Другой интересный фикс заключается в размещении пробела между последним символом текста в блоковом потомке и закрывающимся тегом.

    Еще корректировки и объяснения

    Поведение

    Как и во множестве других действий, IE6 имеет проблемы с тем, как они себя ведут. Оказии с поведением случаются из-за того, что IE6 слишком устарел, потому что он не полностью поддерживает CSS2, потому что он совсем не поддерживает CSS3 или потому что Microsoft просто решила следовать своим собственным стандартам.

    Давайте посмотрим на некоторые из множества поведенческих проблем с Internet Explorer 6.

    В IE6 нет Hover состояния

    Для IE6 не существует поддержки hover состояния для каких-либо элементов кроме тэга якоря с атрибутом href или элементов для которых такой тег взаимодействует с контейнером. Это утверждение жестко ограничивает использование эффектов mouseover в IE6, но все-таки для этого есть несколько лазеек.

    Лучшая из них, не полагаться на свойство hover в критических местах функционала сайта. Вместо этого, используйте его только для акцентирования или расширения уже реализованной функциональности и доступности.

    Большинство фиксов hover ограничения для IE6 используют либо проприетарное свойство поведения Microsoft CSS или решение с JavaScript, обычно через фреймворк JavaScript или через скрипт IE6 fix.

    Реализация тега Canvas в IE

    Ни одна из версий Internet Explorer (включая IE7 и IE8) не поддерживает тег HTML5 canvas потому что Microsoft предпочитает пропихивать вместо него свой VML. Однако, есть несколько JavaScript решений эмулирующих тег canvas для IE.

    Canvas решения и ресурсы

    IE6 баг рисайзинга

    Emil Stenstr?m раскопал решение для бага с рисайзингом IE6. В общем, где отцентрирован элемент body и реализована фиксированная верстка, любой относительно спозиционированный элемент внутри него станет фиксированным если страница изменит размеры и не обновится. Решение Emil’я простое и элегантное: добавить position:relative; к body элементу.

    JavaScript

    Internet Explorer 6 также страдает от несметного числа ошибок в деле интерпретирования JavaScript. У меня нет никакой возможности описывать все баги JavaScript в IE6, но я расскажу о нескольких, наиболее часто встречаемых из них и о том, как их исправить.

    Ошибка: Ожидался Identifier, String или Number

    Internet Explorer не терпит недостаточно оформленный JavaScript код и часто выдает ошибку, «Expected Identifier, String, Or Number» если в конце массива элементов присутствует замыкающая запятая, другие браузеры более снисходительны к этому. Удалив запятую, Вы обычно избавляетесь от этой ошибки.

    Утечки памяти IE JavaScript

    Из-за того, что Internet Explorer использует собственный менеджер памяти, он может быть подвластен проблеме с утечкой памяти, так как неправильно ее освобождает во время работы с JavaScript. Douglas Crockford написал подробный отчет о предотвращении утечек памяти для JavaScript в Internet Explorer. Еще одна страница для этого раздела, написана Hedger Wang и ее так-же стоит прочитать.

    Разное

    Этот раздел специально выделен для нескольких багов Internet Explorer 6 и их решений, которые не вошли в предыдущие.

    Баг с задвоенными символами

    Когда IE6 натыкается на любой тип спрятанных элементов, таких как комментарии или элементы со свойством display:none; внутри плавающих элементов, он может задваивать символы. Проблема замечательно описана на Position Is Everything, и решение видится довольно простым: применить display:inline; к плавающему элементу, который предшествует скрытому элементу.

    Favicons в IE

    Favicon сокращение от Favorites Icon ссылающееся на изображение из 16×16 пикселей, которое появляется на какой-либо странице, которую Вы сохранили в своих закладках. Существует два способа заставить его появиться. Первый — просто сохранить изображение как файл favicon.ico в корне Вашего сайта. Internet Explorer и другие браузеры будут автоматически искать его и отображать. Второй метод разместить следующий HTML код в head секции Вашего документа (после загрузки изображения):

    Стоит заметить, что изображение favicon будет закешировано и не будет меняться пока Вы не очистите кеш Вашего браузера и не обновите его один или несколько раз. Если Вы хотите обновлять его автоматически для всех Ваших пользователей, установите «expire параметры» в заголовке ответа этого изображения.

    Еще к прочтению

    GZip In IE6

    Некоторые версии IE6, в особенности после обновления XP SP2, могут иметь проблемы с файлами пропущенными через GZip сжатие. К счастью, Seb Duggan нашел решение бага IE6 GZip используя ISAPI_Rewrite для Apache.

    Решение Seb’а — поместить следующий код в httpd.conf файл расположенный в директории с установленным ISAPI_Rewrite:

    Бонус ресурсы

    Хотя это и достаточно длинный список багов и исправлений для Internet Explorer 6, он совсем не исчерпывающий. Если Вы не смогли найти в нем что-то, посмотрите на эти дополнительные ресурсы.

    JavaScript-ссылки и всё, что с ними связано

    Передача ссылочного веса, индексация, краулинговый бюджет

    Автор: Максим Ковкрак, руководитель SEO-отдела ADINDEX — украинского агентства комплексного интернет-маркетинга

    Созданию статьи послужил пост Игоря Шулежко в своём фейсбуке. Он попросил своих “френдов” и “SEO-титанов” прокомментировать заявление Рэнда Фишкина о бесполезном скульптурировании PageRank (PR) старыми методами (rel=nofollow и JS).

    В комментариях много дискуссий и открытых вопросов, а значит, тема актуальна.

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

    1. Сразу к сути: распознаёт ли Google JS-код?

    Ответ — да.

    Об этом официально говорит Google в своём блоге. Об этом говорят все топовые эксперты отрасли. Также есть множество подтверждающих тестов, один из масштабных провели специалисты из Merkle|RKG, своё заключение они изложили в статье на Search Engine Land.

    Что показали результаты проведенных тестов?

    1. Редиректы JavaScript

    Использовался метод — функция window.location. Было проведено два теста: тест А включал абсолютный URL, тест Б — относительный.

    Результат:
    Google быстро распознал их по схеме переадресации 301 — конечные URL заменили в индексе URL, с которых шли редиректы.

    1. JavaScript-ссылки

    Протестированы стандартные JavaScript-ссылки. Это наиболее распространенные типы ссылок, которые используются SEO-специалистами:

    • Функции за пределами href AVP, но в рамках тега (“onClick”)
    • Функции внутри href AVP (“javascript:window.location”)
    • Функции за пределами тега a, но вызываемые в пределах href AVP (“javascript:openlink()”)
    • и т. п.

    Ссылки полностью краулились и отслеживались.

    1. Динамическая подгрузка контента

    Проверялись две ситуации:

    • Возможность поисковика сканировать динамический текст, если текст находится на HTML-странице. Что-то вроде кнопки “Читать полностью”, при нажатии на которую раскрывается остальная часть контента.
    • Способность поисковика принимать во внимание динамический текст, если он расположен во внешнем JavaScript-файле.

    Результат:

    В обоих случаях текст краулился, индексировался и влиял на ранжирование страниц.

    1. Динамическая загрузка метаданных и элементов страницы

    Динамически внедрили в DOM различные теги, важные для SEO:

    • Элементы title
    • Метаописания
    • Метатеги robots
    • Теги canonical

    Результат:

    Во всех случаях теги краулились — точно так же, как HTML-элементы в исходном коде.

    Итого: Google давно научился распознавать JS-код как простой, так и сложный. Он не просто выполняет различные типы событий JavaScript, но и индексирует динамически генерируемый контент, читая DOM.

    Другой вопрос, если запретить боту доступ к файлу *.js, в котором хранится исполняемый код и скрываемый контент, вдобавок закодированный стандартом Base64. Причём в html-коде вы также не увидите URL-адреса, будет что-то вроде этого:

    В таком случае браузеры смогут исполнять код, а Google — нет.

    Да, это рабочий метод, технология называется SEOhide, но вы же понимаете разницу между “распознаёт” и “закрытый доступ”?

    2. Сокрытие ссылок

    Зачем возникает необходимость скрытия ссылок от поисковых систем?

    1. Для управления PR (простыми словами ссылочным весом).
    2. Экономии краулингового бюджета.

    2.1. Управление ссылочным весом

    История начинается с создания поисковой системы Google, особенностью которой и являлся алгоритм PageRank. Идея заключалась в том, что страница считается тем “важнее”, чем больше на неё ссылается других страниц. При этом также учитывается “важность” ссылающихся страниц. Попросту говоря, ноу-хау заключалось в учёте внутренней и внешней ссылочной массы.

    С тех пор алгоритм PageRank неоднократно подвергался изменениям, он улучшился и изменился во многих аспектах (например, учитывается тематичность ссылки, её расположение на странице), но основной принцип остаётся прежним.

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

    Скульптурирование PR заключается в предотвращении передачи ссылочного веса бесполезным страницам сайта (или не приоритетным) и аккумулировании ссылочного веса на важных страницах.

    Бесполезные — страницы не генерирующие трафик: корзина, контакты, «О нас», пользовательское соглашение и пр. Обычно ссылки на такие страницы расположены в шапке и подвале сайта, а значит собирают ссылочный вес с абсолютно всех страниц сайта.

    Важные — это приоритетные страницы, находящиеся в продвижении.

    1) Предотвращение передачи ссылочного веса

    До 2009 г. скульптурирование ссылочного веса заключалось в использовании атрибута rel=»nofollow». Значение nofollow ставилось на уровне ссылки или страницы и запрещало поисковой системе сканировать и передавать PageRank.

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

    Когда Google понял, что все за счет nofollow просто перераспределяют PR внутри своего сайта, он обновил механизм работы тега. О новой логике работы атрибута рассказал Мэтт Каттс во время конференции SMX. Позднее на его блоге вышла статья “PageRank Sculpting”.

    Теперь через ссылки nofollow ссылочный вес исчезает в никуда: он не остаётся на текущей странице и не передается странице акцептору.

    Итак, атрибут rel=»nofollow» не ограничивает передачу ссылочного веса, наоборот, нужно помнить, что через такие ссылки вы будете терять PR вашего сайта.

    Как мы выяснили раньше, JS не скроет ссылки сайта от Google. Остаётся рабочий метод SEOHide. Но есть один минус, который ставит под сомнение использование данной технологии и о котором стоит упомянуть — возможные санкции со стороны Google.

    В июле 2015 г. Google массово разослал вебмастерам сайтов в Search Console уведомление об ошибке: “Googlebot не может получить доступ к файлам CSS и JS на сайте” и предупреждение о возможной потере позиций в поисковой выдаче в случае, если проблема не будет устранена.

    То есть, если для поисковой системы закрыт доступ к CSS и JS-файлам, есть вероятность понижения сайта в поисковой выдаче.

    Принято считать, что это влияет на позиции в мобильной выдаче, проверить адаптивность сайта без анализа CSS и JS-файлов бот не сможет, а значит тест может быть не пройден. Если это так, то SEOhide не повлияет на прохождение теста Mobile Friendly и понижения не будет.

    2) Передача ссылочного веса важным страницам сайта (перелинковка)

    Для передачи ссылочного веса важным страницам используют различные варианты и методы перелинковки. Например, ссылки размещают в меню сайта, на фильтровой панели, на отдельных перелинковочных блоках. Логика заключается в том, чтобы накопленный ссылочный вес направить на приоритетные категории, находящиеся в продвижении.

    В последнее время мы всё чаще встречаем упоминания о слабом влиянии внутренней перелинковки, всё чаще поднимается вопрос: “А стоит ли вообще заниматься скульптурированием ссылочного веса, стоит ли тратить на это время?”. В частности об этом говорит Рэнд Фишкин в статье “Как работать с внутренними ссылками сегодня: советы и практики”. Он утверждает, что классический формат скульптурирования, о котором мы говорили выше, редко эффективен, а если эффект и есть, то он небольшой:

    “В настоящее время эффективность PR очень сильно уменьшилась. Тем не менее какой-то результат это приносит. В любом случае, наличие большого количества необоснованных ссылок на странице может оказать негативное влияние на ранжирование, в то время как небольшое число тщательно отобранных ссылок даёт положительный эффект. Однако в большинстве случаев оптимизация внутренних ссылок не добавляет большой ценности и не приносит значительных результатов.”

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

    Высказывания Рэнда подтверждаются проведёнными тестами Дмитрия Шахова, с результатами которых он выступил на онлайн-конференции “WebPromoExperts SEO Day” 2020 года, представив доклад на тему: “Внутренняя перелинковка: мифы и реальность”. Были взяты коммерческие сайты, которые давно находятся в топе, со стабильной статистикой по позициям. Активных работ по проектам давно не проводилось.

    • шершня (перелинковка уровнями)
    • линковка с релевантных страниц
    • линковка с рандомных страниц
    • влияние кол-ва ссылок

    В ходе экспериментов не удалось добиться значительного эффекта от точечной перелинковки. Результаты были настолько слабы, что передавить влияние внешних текстовых и ссылочных факторов не удаётся — эффект близок к нулю.

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

    Вывод: опять-таки, очень слабое влияние внутренней перелинковки. Эффекта можно добиться только большим количеством ссылок и только для трастового сайта.

    Но так ли всё однозначно с вопросом перелинковки?

    Было одно событие, из которого можно сделать вывод, что есть и другие факторы, влияющие на эффективность линковки.

    На вопрос: “Если на странице размещено 3 ссылки: 2 dofollow и 1 nofollow, какой PR будет передаваться через каждую dofollow ссылку: 1/3 или 1/2?” Андрей Липатцев, старший специалист по качеству поиска Google, ответил, что ни 1/2, ни 1/3:

    Какие это могут быть факторы? Точно неизвестно, но, скорее всего, речь идёт о “полезности и релевантности ссылки”. Все мы знаем, что на работу бэклинков влияет месторасположение ссылки на странице, переходят ли по ней пользователи, релевантна ли она содержанию — всё это работает и для внутренних ссылок сайта и их эффективности.

    Вот и получается, как говорил Рэнд, что в одних случаях есть небольшой эффект от внутренней перелинковки, а в других нет. Скорее всего, всё зависит от вида реализации.

    Управление ссылочным весом: общий итог

    Здесь будьте очень осторожны, ниже описано заключение, к которому пришёл автор статьи, и оно может не совпадать с вашим. Это нормально, это же SEO и у нас всегда так. Если считаете по-другому, напишите свои рассуждения в комментариях к статье.

    Со дня своего появления алгоритм PageRank значительно изменился и усложнился. Одна из его составляющих — внутренний ссылочный вес, утратила своё былое влияние.

    Обновление алгоритма требует и изменения подхода в скульптурировании ссылочного веса.

    Стоит ли скрывать ссылки?

    Раз влияние внутреннего веса незначительно, зачем использовать сложную технологию SEOhide для закрытия дырок перетекания ссылочного веса, реализация которой стоит денег? Скорее всего, это будет нерентабельно, учитывая то, что алгоритм передачи ссылочного веса не работает по схеме “делим поровну между всеми ссылками на странице”.

    Мы не рекомендуем использовать технологию SEOhide и подобные для экономии PR-веса. Атрибут nofollow вообще будет красть ссылочный вес вашего сайта.

    Что делать с перелинковкой?

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

    Классическую перелинковку можно использовать для максимизации индексирования.

    2.2. Экономия краулингового бюджета с помощью JS

    Логика какая — нет ссылки на странице, значит бот не тратит время на её индексацию.

    Желание использовать JS возникает у вебмастеров, например, для того, чтобы скрыть ссылки на панели фильтрации.

    Зачастую их очень много и большая часть из них закрыта от индексации. “Убрав” лишние ссылки со страницы, бот должен пойти по страницам пагинации, товарам, ссылкам на подкатегории.

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

    Почему увеличим? Ответ на этот вопрос полностью раскрыт в статье Барри Адамса “JavaScript и SEO: разница между сканированием и индексированием”.

    Вся суть заключается в тесной работе двух парней гугла: краулера — Googlebot и индексатора — Caffeine.

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

    Когда googlebot видит новые или изменённые URL-адреса, он отправляет их второму парню.

    Caffeine — парень, который сидит на месте и пытается понять полученные URL-адреса от краулера, анализируя их контент и релевантность. Он отвечает за рендеринг веб-страниц и выполнение JS кода.

    В опубликованной документации Google для разработчиков объясняется, как работает их служба веб-рендеринга WRS.

    Именно WRS в Caffeine выполняет JavaScript. Функция “Получить и отобразить” в Search Console позволяет посмотреть, как WRS Google видит вашу страницу.

    Теперь мы выяснили, что за ширмой механизма “сканирования страниц сайта” спрятан сложный процесс взаимодействия двух систем: сканирования и индексирования.

    На сайте, где большое количество ссылок не является частью исходного HTML-кода, при первом посещении краулер находит только ограниченный набор URL. Потом ему нужно подождать, пока индексатор обработает эти страницы и извлечёт новые URL, которые краулер затем просканирует и отправит индексатору. И так раз за разом.

    Не исключена ситуация, когда Google будет тратить много времени на сканирование и рендеринг ненужных страниц и очень мало времени на обработку важных.

    А что с SEOHide, о котором было сказано выше?

    Да он будет работать, но есть куда более простой и рекомендованный способ от гугла.

    В официальной справке указано:

    Проще говоря, если вы хотите сэкономить краулинговый бюджет для более важных страниц, для управления приоритетом сканирования, на все второстепенные ссылки нужно добавить атрибут nofollow.

    Есть один минус у этого варианта, в таком исполнении у нас получается конфликт интересов между скульптурированием PR и экономией краулингового бюджета. Если вы всё же хотите управлять ссылочным весом, помните, что через такие ссылки будет “исчезать” PR.

    Вам решать, что важнее — действуйте по ситуации. Если у вас проблемы с индексацией сайта — ставьте nofollow, не давайте роботу обращать внимание на эти “бесполезные страницы”. Если не хотите терять PR, лучше просто оставить ссылки открытыми.

    Если рассматривать наш пример со ссылками на страницы фильтров, которые не нужны в поисковой выдаче, то можно использовать еще два способа:

    1) Закрыть такие страницы в robots.txt

    Если у вас страница закрыта только тегом meta name=»robots» content=»noindex, follow» вы не будете экономить краулинговый бюджет. Данным тегом пользуется индексатор, а не краулер, поэтому страница будет просканирована и обработана, но в индекс не добавлена.

    Нужно использовать оба метода — robots.txt заблокирует доступ краулеру.

    2) Настроить в Search Console запрет на сканирование по параметрам URL

    Внутренние ссылки возвращают нулевые ошибки, и я не могу найти ошибку в своем Javascript. Внешние ссылки работают отлично

    Я создал веб-сайт и попробовал причудливую навигацию, которую я скопировал с http://codepen.io/arjancodes/pen/jErbyM и немного настроил. (Спасибо, что вдохновили меня!)

    HTML и CSS работают нормально, но внутренние ссылки (когда вы открываете навигацию в правом нижнем углу) сохраняют возвращаемые 404s. Мой webhoster сказал мне, что ошибка должна быть в JS, которая:

    Это HTML моей навигации

    Было бы здорово, если бы вы могли помочь мне исправить это .

    Топ-пост этого месяца:  Гугл вебмастер — инструменты Search Console (Google Webmaster)
  • Добавить комментарий