,
Неиспользование аттрибута ALT
При работе с изображениями вы должны использовать аттрибут ALT. Это необходимо, так как пользователи смогут определить, что же должно быть на месте изображения, даже если используют очень медленное подключение. Это значение должно описывать суть используемого изображения. Никогда не используйте alt=«картинка». Если же изображение выполняет чисто декоративные функции, то используйте alt="*"
.
Ошибка
Привильно
Неправильные теги для выделения жирным или курсивом
Не смотря на то, что и в большинстве случаев отлично справляются со своими задачами, использование стилей для оформления текста позволяет получить гораздо большую гибкость оформления. Если же тег должен просто подчеркивать значение определенной части текста, то используйте тэги и .
Бесполезное использование переноса строки
Тег может использоваться один раз в строке для того, что бы следующее предложение началось на следующей строчке. Многие используют этот тэг для того, что бы создать расстояние между элементами. Это использование не соответствует стандартам.
Ошибка
Первый абзац.
Продолжение текста.
Привильно
Первый абзац.
Продолжение текста.
Теги:
HTML, ошибки
That uses CSS and JavaScript. Since every website is unique, it"s possible that you"ll encounter conflicts between our code and yours.
In this article, you"ll learn how to resolve some common issues with embedded signup forms.
My form shows no success or error messages.
To ensure JavaScript is turned on for your embedded form and to update your site, follow these steps.
Navigate to the tab.
If you have more than one audience, click the Current audience
drop-down and choose the one you want to work with.
Click the Manage Audience
drop-down and choose Signup forms
.
Select Embedded forms
.
Click the Classic
tab.
In the Enhance your form
section, make sure the Disable all Javascript
box is unchecked.
In the Copy/paste into your site
field, highlight all the code and copy it to your clipboard.
Paste it into your website to replace the current version of your form.
The embedded form code doesn"t work with ASP.NET.
ASP.NET pages and the Mailchimp embedded form code both include form tags. These form tags conflict and prevent the ability to submit new subscriber data to your audience. You"ll need to change the embedded form code for it to work on your ASP.NET page. We"ve seen the following code change help some users, but we can"t guarantee that it will work for your site.
In the Mailchimp embedded form code, find the
tag, copy the URL for the action property, and save it somewhere to use later.
Delete the
tag and
tag.
In the submit button code, add the following code. Make sure to replace actionurl
with the action URL you copied earlier.
onClick=this.form.action="actionurl";this.form.submit();
Form shows “too many subscribe attempts”
If your embedded form shows the "Too many subscribe attempts for this email address" error, you may need to turn off the autofill feature in your internet browser.
To fix the error, turn off autofill and try again in about five minutes.
Мне известен уже не один случай, когда из-за ошибок HTML кода
сайты теряли свои позиции в поиске, а в некоторых даже оказывались под АГС () и даже в бане. Конечно ошибки ошибкам рознь и некоторые из них нисколько не влияют ни на ни на сайта. В этой статье мы рассмотрим самые опасные ошибки в коде страниц, которых следует стараться избегать, во избежание поисковиков.
Самые опасные HTML ошибки в коде
Одна или несколько HTML ошибок могут затруднить индексацию и правильное ранжирование для определения содержимого страницы какому-либо запросу, а обилие их на всех страницах сайта сигнализирует поисковым системам о плохом качестве сайта.
Самым опасным является допущение грубых html ошибок, таких как:
Незакрытые HTML теги - грубая ошибка
Самая опасная ошибка. И чем выше этот не закрытый тег находится в коде страницы тем она опаснее.
Знаю случаи когда не закрытый тег LINK
или META
в секции HEAD
понижал позиции по запросам (вернее даже не понижал, а исключал ибо страницу нельзя было найти даже в пределах 100 страниц результатов поиска).
В другом случае из-за неправильно продекларированного не закрытыми оказались все теги в секции HEAD
и некоторые на странице, что в конечном результате привело к бану сайта в яндексе.
Незакрытый тег NOINDEX - менее опасная ошибка
Любителям закрывать этим тегом (кстати он не валиден) содержимое страниц нужно очень внимательно к ним относиться. Поскольку оставив хоть один из них не закрытым вы запретите к индексации все содержимое вплоть до следующего закрывающего тега noindex
, а если его не будет, то всю страницу от открывающего тега и до конца.
Для примера могу привести случай из практики, когда в результате такой невнимательности в индексе осталась лишь главная страница сайта.
А в другом случае невнимательность блогера, который скачал и установил новую тему привела к тому-же результату, поскольку автор темы жестоко пошутил, добавив в код страниц мета тег с указанием для роботов не индексировать страницы.
Неопасные HTML ошибки
Конечно страница с большим количеством ошибок это не хорошо в любом случае, они могут влиять на ее неправильное отображение в браузерах пользователей, а что касается поисковиков некоторые из них, такие как неизвестные элементы и параметры некоторых скриптов или неправильное расположение элементов, например если блочный элемент (P
) будет находиться в строчном SPAN
, не будут представлять ни какой опасности.
Как проверить ошибки в HTML коде сайта (валидность)
Для проверки HTML кода на наличие ошибок есть одно единственное и самое надежное средство: Валидатор кода . С его помощью вы можете проверить ошибки в HTML коде страниц сайта, не только введя в форму их URL но и просто вставив текстовый вариант кода исходника страницы.
Чтобы избежать появление ошибок постарайтесь чаще проверять свои страницы на их наличие, особенно после редактирования кода или добавления сторонних скриптов, которые тоже могут быть не идеальны и привести к возникновению проблем.
На проекте необходимо было сделать логин через модальные окна и «обычные» страницы для разных типов устройств. После поиска понял, что зачастую описывается не совсем то, что нужно. Так просто помещают форму в модальное окно (фактически пользуясь ), а тут (вход и регистрация) переопределяют методы в контроллерах devise так, что они постоянно отдают только json и для «немодального» поведения нужно будет писать много условий с проверкой формата запроса. Поэтому я решил поэкспериментировать в новом приложении и написать поддержку 2 форматов с минимальным количеством переопределения и грязных хаков.
Создание приложения Генерим приложение без тестов и запуска bundle install
: rails new devise_modal -B -T
Добавляем нужные гемы в Gemfile
:И устанавливаем всё: bundle install
Запускаем нужные генераторы
rails g bootstrap:install static , «static» так как ничего менять в стилях bootstrap
"а не будем
rails g devise:install; rails g devise User; rake db:migrate - устанавливаем devise
и создаём пользователя
Создаём контроллер, который будет отображать главную страницу:
rails g controller welcome index --no-helper --no-assets
В config/routes.rb
привязываем index
к главной странице:
root "welcome#index"
В конце этого этапа есть приложение, с формами входа/регистрации на стандартных ссылках для devise
: users/sign_in и users/sign_up .Модальные окна для форм
В формах нету ничего примечательного - используем стандартные devise
"овские сделав их remote
и поменяв формат на json
. Дальше делаем их модальными, обернув в соответствующие классы bootstrap
"а. В итоге получились такие partial
"ы:
<%= form_for(User.new, url: session_path(:user), html:{id: "sign_in_user", :"data-type" => "json"}, remote: true) do |f| %>
<%= f.label:email %>
<%= f.email_field:email, autofocus: true %>
<%= f.label:password %>
<%= f.password_field:password, autocomplete: "off" %>
<% if Devise.mappings[:user].rememberable? -%>
<%= f.check_box:remember_me %>
<%= f.label:remember_me %>
<% end -%>
<%= f.submit "Sign in" %>
<% end %>
<%= form_for(User.new, url: registration_path(:user), html: {id: "sign_up_user", :"data-type" => "json"}, remote: true) do |f| %>
<%= f.label:email %>
<%= f.email_field:email, autofocus: true %>
<%= f.label:password %>
<%= f.password_field:password, autocomplete: "off" %>
<%= f.label:password_confirmation %>
<%= f.password_field:password_confirmation, autocomplete: "off" %>
<%= f.submit "Sign up" %>
<% end %>
Добавим отображение этих файлов и ссылок для их вызова в layout
: <%= link_to "Sign in", "#sign_in", "data-toggle" => "modal", :class => "btn btn-small" %>
<%= link_to "Sign up", "#sign_up", "data-toggle" => "modal", :class => "btn btn-small" %>
<%= render "shared/sign_in" %>
<%= render "shared/sign_up" %>
А после этого облагородим немного, сделав проверку на наличие юзера:app/views/layouts/application.html.erb
<% if current_user %>
<%= "Hello, #{current_user.email}" %>
<%= link_to "Sign out", destroy_user_session_path, :method => :delete %>
<% else %>
<%= link_to "Sign in", "#sign_in", "data-toggle" => "modal", :class => "btn btn-small" %>
<%= link_to "Sign up", "#sign_up", "data-toggle" => "modal", :class => "btn btn-small" %>
<%= render "shared/sign_in" %>
<%= render "shared/sign_up" %>
<% end %>
Чтобы всё это работало нужно добавить несколько методов в application_helper
, которые определяют resource
и связанные с ним для данного контекста:app/helpers/application_helper.rb
def resource_name:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
Как заметили в комментариях printercu и DarthSim переопределять глобальные хелперы для resource
имеет мало смысла, лучше напрямую задать в формах вместо resource
- User.new , а вместо resource_name
- :user . Также в app/views/shared/_sign_in.html.erb
укажем Devise.mappings[:user] заместо devise_mapping
. В целом, можно вообще избавиться от этого условия: <% if devise_mapping.rememberable? -%>
основываясь на том, указуем ли мы в модели пользователя(app/models/user.rb
) :rememberable . Кроме того, в app/views/shared/_sign_up.html.erb
ещё был хелпер devise_error_messages!
, который использует resource
, но поскольку текст ошибок берётся из json
"а ответа, то просто удалим из формы <%= devise_error_messages! %> за ненадобностью.
Теперь есть модальные формы, которые доступны с любой страницы и позволяют входить и регистрироваться. Осталось только сделать, чтобы devise
на эти запросы в ответ не отправлял html страницы.JSON ответы от devise
В геме devise
за ошибки связанные со входом отвечает FailureApp . При возникновении ошибки в SessionsController
"е, который отрабатывает запросы на вход, вызывается respond , где с помощью http_auth? проверяется: нужно слать 401 статус или же переадресовывать на другую страницу. Так как по умолчанию у devise
"а:config/initializers/devise.rb
config.http_authenticatable_on_xhr = true
то и возвращается 401.
RegistrationsController же в ответ на AJAX запрос присылает html страницу, чтобы это исправить переопределим его немного - укажем явно, какие форматы нас интересуют:
rails g controller Registrations --no-helper --no-assets --no-views config/routes.rb
devise_for:users, controllers: {registrations: "registrations"}
app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
respond_to:html, :json
end
Теперь при неудачной попытке регистрации будет отдаваться 422 статус с текстами ошибок в responseJSON["errors"]
, а при удачной - 201. Аналогично для SessionsController
"а при удачном входе нужно отдавать статус, а не html-страницу, поэтому «научим» и его правильно реагировать на json
запросы:
rails g controller Sessions --no-helper --no-assets --no-views config/routes.rb
devise_for:users, controllers: {sessions: "sessions", registrations: "registrations"}
app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
respond_to:html, :json
end
Также можно написать javascript
, который будет обрабатывать ответы от модальных форм, например такой:app/assets/javascripts/welcome.js.coffee
$ ->
$("form#sign_in_user, form#sign_up_user").bind("ajax:success", (event, xhr, settings) ->
$(this).parents(".modal").modal("hide")).bind("ajax:error", (event, xhr, settings, exceptions) ->
error_messages = if xhr.responseJSON["error"]
"" + xhr.responseJSON["error"] + "
"
else if xhr.responseJSON["errors"]
$.map(xhr.responseJSON["errors"], (v, k) ->
"" + k + " " + v + "
").join ""
else
"Unknown error
"
$(this).parents(".modal").children(".modal-footer").html(error_messages))
При входе оборачиваем ошибку в alert
, а при регистрации - ошибки по каждому параметру, после чего выводим полученное сообщение в footer
"е. При успешном запросе просто убираем модальную форму (можно ещё обновлять блок в layout
"е, в котором проверяется наличие пользователя, чтобы отображать данные пользователя (они также приходят в ответе)).
Теперь контроллеры отдают ответы в правильном формате, как и для модальных форм - json
, так и для стандартных(users/sign_in
, users/sign_up
) - html
. И всё, что понадобилось для этого понадобилось - переопределить контроллеры, расширив набор форматов: respond_to:html, :json
Примечание
Приложение писалось на rails 4, но отличия для 3.2 будут минимальны: запустится bundle install при создании приложения, нужно будет удалить public/index.html а также путь на главную будет выглядеть чуть иначе:config/routes.rb
root to: "welcome#index"
Для подробного описания констант
PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации .
Краткое разъяснение конфигурационных
директив.
Задает уровень протоколирования ошибки. Параметр может быть либо числом,
представляющим битовое поле, либо именованной константой.
Соответствующие уровни и константы приведены в разделе
Предопределенные константы ,
а также в php.ini . Для установки настройки во время выполнения
используйте функцию error_reporting()
. См. также
описание директивы
display_errors .
В PHP 5.3 и новее later, значение по умолчанию равно
E_ALL
&
~ E_NOTICE
&
~ E_STRICT
&
~ E_DEPRECATED
. При этой настройке на отображаются уровни ошибок
E_NOTICE
, E_STRICT
и E_DEPRECATED
. Можно отображать их при разработке.
До версии PHP 5.3.0, значением по умолчанию было
E_ALL
&
~ E_NOTICE
&
~ E_STRICT
.
В PHP 4 значением по умолчанию было E_ALL
& ~ E_NOTICE
.
Замечание
:
Включение E_NOTICE
во время разработки имеет ряд
преимуществ. Для отладки: NOTICE сообщения могут предупреждать о
возможных ошибках в коде. Например, использование
непроинициализированных переменных вызовет подобное сообщение. Это
очень полезно при поиске опечаток и экономит время при отладке.
NOTICE сообщения также предупреждают о плохом стиле. Например,
$arr
лучше писать так:
$arr["item"]
с тех пор, как PHP начал интерпретировать
"item"
как константу. Если это не константа, PHP
принимает это выражение за строковый индекс элемента массива.
Замечание
:
В PHP 5 доступен новый уровень ошибок E_STRICT
.
Так как E_STRICT
не входит в состав
E_ALL
, необходимо явно включать этот уровень
ошибок. Включение E_STRICT
во время разработки
также имеет свои преимущества. STRICT сообщения предлагают подсказки, которые могут помочь
обеспечить лучшую функциональную и обратную совместимость вашего кода.
Эти сообщения могут включать в себя такие вещи, как вызов нестатических методов
статически, определение свойств в совместимого класса, в то время как
они уже определены в используемом трейте, и до PHP 5.3 некоторые устаревшие возможности также
будут выдавать ошибки уровня E_STRICT
, такие как присвоение
объектов по ссылке при создании экземпляра.
Замечание
:
PHP константы за пределами PHP
Использование PHP констант за пределами PHP, например в файле
httpd.conf , не имеет смысла, так как в таких
случаях требуются целочисленные значения (integer
). Более
того, с течением времени будут добавляться новые уровни ошибок, а
максимальное значение константы E_ALL
соответственно
будет расти. Поэтому в месте, где предполагается указать
E_ALL
, лучше задать большое целое число, чтобы
перекрыть все возможные битовые поля. Таким числом может быть, например,
2147483647
(оно включит все возможные ошибки, не
только E_ALL
).
display_errors
string
Эта настройка определяет, требуется ли выводить ошибки на экран вместе
с остальным выводом, либо ошибки должны быть скрыты от пользователя.
Значение "stderr"
посылает ошибки в поток
stderr
вместо stdout
. Значение
доступно в версии PHP 5.2.4. В ранних версиях эта директива имела тип
boolean
.
Замечание
:
Этот функционал предназначен только для разработки и не должен
использоваться в готовых производственных системах (например,
системах, имеющих доступ в интернет).
Замечание
:
Несмотря на то, что display_errors может быть установлена во время
выполнения (функцией ini_set()
), это ни на что
не повлияет, если в скрипте есть фатальные ошибки. Это обусловлено
тем, что ожидаемые действия программы во время выполнения не получат
управления (не будут выполняться).
display_startup_errors
boolean
Даже если display_errors включена, ошибки, возникающие во время запуска
PHP, не будут отображаться. Настойчиво рекомендуем включать
директиву display_startup_errors только для отладки.
Log_errors
boolean
Отвечает за выбор журнала, в котором будут сохраняться сообщения об
ошибках. Это может быть журнал сервера или
error_log . Применимость этой
настройки зависит от конкретного сервера.
log_errors_max_len
integer
Задание максимальной длины log_errors в байтах. В
error_log добавляется информация
об источнике. Значение по умолчанию 1024. Установка значения в 0
позволяет снять ограничение на длину log_errors. Это ограничение
распространяется на записываемые в журнал ошибки, на отображаемые ошибки,
а также на $php_errormsg .
Если используется integer
,
значение измеряется байтами. Вы также можете использовать сокращенную запись,
которая описана в этом разделе FAQ .
ignore_repeated_errors
boolean
Не заносить в журнал повторяющиеся ошибки. Ошибка признается
повторяющейся, если происходит в том же файле и в той же строке, и если
настройка
выключена.
Ignore_repeated_source
boolean
Игнорировать источник ошибок при пропуске повторяющихся сообщений. Когда
эта настройка включена, повторяющиеся сообщения об ошибках не будут
заноситься в журнал вне зависимости от того, в каких файлах и строках
они происходят.
Report_memleaks
boolean
Если настройка включена (по умолчанию), будет формироваться отчет об
утечках памяти, зафиксированных менеджером памяти Zend. На POSIX
платформах этот отчет будет направляться в поток stderr. На Windows
платформах он будет посылаться в отладчик функцией OutputDebugString(),
просмотреть отчет в этом случае можно с помощью утилит, вроде
» DbgView . Эта настройка имеет
смысл в сборках, предназначенных для отладки. При этом
E_WARNING
должна быть включена в список
error_reporting.
Track_errors
boolean
Если включена, последняя произошедшая ошибка будет первой в переменной
$php_errormsg .
Html_errors
boolean
Отключает HTML тэги в сообщениях об ошибках. Новый формат HTML сообщений
об ошибках предоставляет возможность вставлять ссылки в сообщения и
перенаправлять пользователя на страницы с описаниями ошибок. За такие
ссылки ответственны
docref_root и
docref_ext .
Xmlrpc_errors
boolean
Переключает форматирование сообщений об ошибках на формат XML-RPC
сообщений.
Xmlrpc_error_number
integer
Используется в качестве значения XML-RPC элемента faultCode.
Docref_root
string
Новый формат ошибок содержит ссылку на страницу с описанием ошибки или
функции, вызвавшей эту ошибку. Можно разместить копию
описаний ошибок и функций локально и задать ini директиве значение
URL этой копии. Если, например, локальная копия описаний доступна по
адресу "/manual/"
, достаточно прописать
docref_root=/manual/
. Дополнительно, необходимо
задать значение директиве docref_ext, отвечающей за соответствие
расширений файлов файлам описаний вашей локальной копии,
docref_ext=.html
. Также возможно использование
внешних ссылок. Например,
docref_root=http://manual/en/
или
docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon
&url=http%3A%2F%2Fwww.php.net%2F"
В большинстве случаев вам потребуется, чтобы значение docref_root оканчивалось
слешем "/"
. Тем не менее, бывают случаи, когда
это не требуется (см. выше, второй пример).
Замечание
:
Этот функционал предназначен только для разработки, так как он облегчает
поиск описаний функций и ошибок. Не используйте его в готовых
производственных системах (например, имеющих доступ в интернет).
docref_ext
string
Замечание
:
Значение docref_ext должно начинаться с точки "."
.
error_prepend_string
string
Строка, которая будет выводиться непосредственно перед сообщением об
ошибке.
Error_append_string
string
Строка, которая будет выводиться после сообщения об ошибке.
Error_log
string
Имя файла, в который будут добавляться сообщения об ошибках. Файл
должен быть открыт для записи пользователем web сервера. Если
используется специальное значение syslog
, то
сообщения будут посылаться в системный журнал. На Unix системах это
syslog(3), на Windows NT - журнал событий. Системный журнал не
поддерживается в Windows 95. См. также: syslog()
.
Если директива не задана, ошибки будут направляться в SAPI журналы.
Например, это могут быть журналы ошибок Apache или поток
stderr
командной строки CLI.
Смотрите также функцию
Loading...