При работе над веб-приложениями программисту легко попасть в ловушку: разрабатывать и тестировать только понятные сценарии, в которых всё происходит правильно. К сожалению, в реальности встречаются ситуации, в которых всё идёт не так, как планировалось. Обработка ошибок — важная часть пользовательского опыта любого приложения. Если приложение реагирует на ошибки правильно, ваши пользователи будут знать, что делать дальше, даже если что-то идёт не так.
- Обработка ошибок в бэкенд- и фронтенд-приложениях: в чём разница
- Как правильно обрабатывать ошибки
- Как работать с ошибками в AJAX-запросах и что нужно знать о кодах ответа HTTP
- Как перехватывать ошибки во фронтенд-приложениях
- Главное об обработке ошибок во фронтенд-приложениях
Большинство ошибок, с которыми сталкиваются пользователи веб-приложений, можно отнести к одной из перечисленных ниже категорий.
Ошибки ввода
Они возникают, когда приложение по каким-либо причинам не может принять введённую пользователем информацию. Например, такое происходит, если пользовательские данные не проходят валидацию, человек повторно отправляет форму, вводит неуникальный юзернейм, приложение не может найти запрошенные ресурсы и так далее.
Ошибки авторизации
Такое происходит, когда пользователь пытается совершить действие, которое ему не разрешено. Например, если рядовой пользователь форума пытается удалить чужое сообщение или незарегистрированный человек хочет опубликовать пост в блоге.
Ошибки доступности
Эти ошибки возникают, когда ресурс, нужный для завершения действия пользователя, по каким-то причинам недоступен. Такие ошибки бывают запланированными (плановое обновление сайта) и незапланированными (выход из строя сервера).
Неожиданные ошибки
Это ошибки, которые обычно говорят о багах в приложении, например, о необработанных исключениях.
Практически во всех приложениях случаются ошибки из перечисленных выше категорий. Правильная обработка ошибок — ключ к тому, чтобы пользователи оставались довольными, когда во время работы с приложением случается ошибка.
Примечание — тема обработки ошибок во фронтенд-приложениях подробно рассматривается в рамках профессии «Фронтенд-программист». Базовые курсы в этой профессии, включая «Введение в программирование», «Основы командной строки», «Настройка окружения», «Системы контроля версий», доступны бесплатно после регистрации.
Обработка ошибок в бэкенд- и фронтенд-приложениях: в чём разница
Обработка ожидаемых ошибок в бэкенде веб-приложений обычно происходит так: приложение отвечает сообщением об ошибке или отображает это сообщение пользователю. Неожиданные ошибки ломают нормальный процесс ответа и приводят к отображению общей страницы ошибки.
Плохо настроенные приложения могут даже показывать конечному пользователю информацию о внутренних ошибках. В большинстве случаев бэкенд-приложения не очень хорошо помогают человеку справиться с ошибкой и вернуться к нормальному использованию приложения. Но они хорошо справляются с задачей информирования пользователя об ошибках.
У фронтенд-приложений нет встроенного механизма, позволяющего остановить работу и показать сообщение об ошибке. После возникновения ошибки в JavaScript обычно происходит одно из описанных ниже событий:
- Приложение работает, но не выполняет действий, которые ожидает пользователь. Самая распространённая реакция пользователей в такой ситуации — попробовать ещё раз в надежде, что в этот раз приложение поведёт себя ожидаемо.
- Приложение останавливается, но не сообщает об остановке пользователю. Здесь пользователь повторит действие или попробует выполнить новое действие, но у него ничего не получится.
- Если ошибка происходит достаточно рано, пользователь может увидеть белый экран из-за неудачной попытки приложения отобразить страницу.
Все эти сценарии ужасные с точки зрения пользовательского опыта. Они могут разочаровать пользователя, заставить его чувствовать беспомощность и даже злость. Фронтенд-приложения во многом более гибкие в плане обработки ошибок по сравнению с бэкенд-приложениями. Но позаботиться об обработке ошибок должны разработчики, так как встроенные в браузеры инструменты практически бесполезны для конечных пользователей.
Читайте полезную статью
Что такое магические числа в программировании и как снять это заклятие.
Как правильно обрабатывать ошибки
Есть много способов обработки ошибок в JavaScript-приложениях. Вы можете определить глобальный обработчик ошибок, который будет отображать переданные в него сообщения. Также вы можете построить приложение так, чтобы каждый его компонент самостоятельно обрабатывал ошибки, которые в нём возникают.
Один из простых способов обработки ошибок заключается в том, чтобы создать общую схему для реакции на все ошибки и использовать систему событий браузеров, чтобы перехватывать всплывающие ошибки и обрабатывать их. Например, ошибку валидации формы можно перехватить на элементе form или соответствующем инпуте и показать пользователю сообщение об этой ошибке. А нераспознанная системная ошибка может всплыть на уровень document. В этом случае пользователь увидит обобщённое сообщение об ошибке.
Взаимодействие с пользователем при возникновении ошибки играет очень важную роль. Вы должны сообщить человеку, что пошло не так, а также объяснить, что делать дальше. В целом, сообщения могут иметь такой смысл:
- Измените что-то и повторите действие. Если пользователь ввёл невалидные данные и не смог отправить форму, благодаря сообщению об ошибке он сможет исправить данные и отправить форму.
- Попробуйте позже. Пользователь не смог отправить форму из-за ошибки сети. Благодаря сообщению он вернётся через 10 минут и успешно отправит форму.
- Свяжитесь с нами. Пользователь не смог отправить форму из-за неожиданной ошибки. Благодаря сообщению об ошибке он свяжется со службой поддержки и решит свои задачи.
При обработке ошибок на стороне клиента часто возникает необходимость выбрать между остановкой и продолжением работы приложения. Если ошибка влияет только на часть системы, можно разрешить человеку пользоваться приложением дальше. Если ошибка критическая или она влияет на разные части приложения, можно показать сообщение в модальном окне, которое невозможно закрыть. Также можно заменить контент страницы сообщением об ошибке. Это защитит пользователя от бесполезных попыток выполнить желаемое действие.
Как работать с ошибками в AJAX-запросах и что нужно знать о кодах ответа HTTP
Самый простой и очень эффективный способ сообщить пользователю об ошибке — правильно использовать коды ответов HTTP. Коды статуса HTTP могут самостоятельно дать пользователю достаточно информации о том, почему возникла ошибка запроса, а также подсказать, что делать дальше.
«Ошибочные» коды ответов HTTP объединяются в две группы: ответы 4XX и ответы 5XX. Первые говорят о проблеме с запросом (клиентские ошибки), а вторые — о проблеме с сервером (серверные ошибки). Ниже перечислены самые распространённые «ошибочные» коды статусов HTTP, которые можно получить при работе с веб-приложением:
- 400 — Bad Request. Обычно этот статус связан с ошибкой ввода, например, если пользователь вводит некорректный адрес электронной почты.
- 401 — Unauthorized. Этот статус связан с ситуацией, когда пользователь пытается получить доступ к чему-либо без авторизации там, где авторизация требуется. Также этот код ошибки подходит в ситуации, когда пользователь пытается выполнить действие, на которое у него нет прав.
- 403 — Forbidden. Разница между этим статусом и статусом 400 незначительная. Обычно код 403 говорит о том, что сервер понял запрос, но не может его выполнить. Например, такой статус можно возвращать, если пользователь ввёл номер акционного купона с истекшим сроком действия.
- 404 — Not Found. Это самый известный из «ошибочных» кодов ответа. Он сообщает, что запрошенный ресурс не найден. Это может произойти из-за некорректного URL, удалённой или перемещённой страницы.
- 409 — Conflict. В большинстве случаев этот статус говорит о конфликте управления версиями. Например, такое происходит, если пользователь пробует загрузить версию файла, которая старше загруженной ранее версии этого файла. Также этот код может говорить об ограничениях уникальности, например, если пользователь пытается повторно отправить электронное письмо (второй раз нажимает кнопку «Отправить», не дождавшись завершения действия).
- 500 — Internal Server Error. Этот статус говорит об ошибке, которую можно описать так: «Что-то пошло не так, но мы не знаем, что именно».
- 503 — Unavailable. Сервер вышел из строя, ошибка может быть запланированной или незапланированной.
Если вы хорошо знаете эти коды, вам будет проще обрабатывать ошибки, которые возникают при работе с AJAX-запросами.
Примечание — Обратите внимание на сервис httpstat.us, он пригодится вам для тестирования реакций на ошибки при разработке фронтенд-приложений.
Как перехватывать ошибки во фронтенд-приложениях
Вы можете определить обработчик глобально с помощью функции window.onerror. В этом случае обработчик переопределит дефолтное поведение браузеров, благодаря чему ваше приложение будет показывать пользователям полезную информацию при возникновении ошибок.
window.onerror = (message, url, lineNumber) => {
// определяем, знаем ли мы, как обрабатывать ошибку
if (errorCanBeHandled) {
// показываем сообщение об ошибке пользователю
displayErrorMessage(message);
// возвращаем true и запускаем дефолтную
// реакцию приложения на фатальные ошибки
return true;
} else {
// запускаем дефолтную обработку ошибок браузером
return false;
}
}
Этот подход работает. Но иногда бывает сложно понять точную причину проблемы с помощью выброшенного исключения. При обработке ошибок в AJAX-запросах лучше использовать функцию обработки ошибок библиотеки, которой вы пользуетесь для выполнения запросов. Она позволит определить код ответа и корректно на него среагировать.
Изучайте фронтенд-разработку на Хекслете! Первые курсы в профессии «Фронтенд-программист» доступны бесплатно. Регистрируйтесь и стартуйте в удобное время.
Главное об обработке ошибок во фронтенд-приложениях
Главный факт об обработке ошибок заключается в том, что вы должны их обрабатывать. Любая попытка сообщить пользователю что-то полезное, когда возникает ошибка — отличный ход. Даже информирование с помощью alert() лучше, чем отсутствие информации. Помните, что при проектировании UI вашего приложения нужно учитывать все возможные ситуации, включая различные ошибки.
Адаптированный перевод статьи Front-End Error Handling by Static Apps. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.
Suppose you want the browser to do complex calculations on web page on clicking a word. This will take time. So, the web page will become unresponsive until the operation is completed. You need something which will do the required operation silently without affecting the user interface. So, how to solve this problem.
In this article, we will discuss about how to solve such issues.
The solution is Web workers. But what is a web worker? Let’s see.
What is a Web Worker?
A web worker is an object consisting of Javascript codes which runs behind the web page that is, in another global context which is different from the working window, independent of all other scripts. The worker thread does not interrupt the performance of webpage like clicking, scrolling etc.
After the creation of a web worker, it sends messages to Javascript codes of which it is consisted. Specifically, it sends the messages to the event handler assigned by that Javascript code and vice versa. The data is exchanged between the web workers and the main document through messages using postMessage() method and onmessage property.
Web worker can also use XMLHttpRequest to have communication with the web server
There are 2 types of web workers −
-
Dedicated web workers − A dedicated worker is a one which can be accessed only by one script which has called it.
-
Shared web workers − A shared worker is the one which can be accessed by multiple scripts
Working of a web worker
Let’s see how to create a simple web worker which runs Javascript codes −
<script> var worker = new Worker (‘ demo.js ‘) ; </script>
-
postMessage() is a method used for sending messages from the worker to the main document.
Syntax
worker.postMessage();
Parameter
It contains the data that is to be passed to the main document.
Example
const webWorker = new Worker (‘ demo.js’ ); webWorker.postMessage ( ‘ This is an example ‘ );
-
onMessage is a property of message event which occurs after a message is received through an event source. It can also be done using addEventListener() method
Syntax
worker.onmessage = function (event) {script}
Or
Worker.addEventListener (“message”, script);
Example
<script> const webWorker = new Worker ( ‘demo.js ‘); webWorker.onmessage = function (event) => { console.log ( ‘ this is an example’ ); }; webWorker.addEventListener ( “message”, function(e) { document.getElementById ( “ demo “).innerhtml; }; </script>
How to terminate a web worker?
If you want to stop a web worker which is executing a code, you can use terminate() method which is used to stop the worker thread. It can also be done using close() method.
terminate() method is used to stop the worker from the main document while close() method is used to stop the worker from its own scope.
Syntax
webWorker.terminate(); webWorker.close();
Example
const webWorker = new Worker (‘ demo.js’); webWorker.onmessage = function (event) => { document.getElementById ( ‘ demo’ ); }; webWorker.terminate();
Debugging the errors
In Javascript, when an error occurs during the operation of the web worker, an error event is used to debug it.
There are 3 main properties of the onerror handler. They are as follows −
-
message − it is only notified that there is an error
-
lineon − notifies the number of the line inside the worker which caused the error
-
filename − notifies the name of the file inside the worker in which there is error.
Syntax
addEventListener ( ‘error’ , (event) => {});
Or
Onerror = ( event) => {} ;
Example
<script> const webWorker = new Worker ( ‘demo’ ); webWorker.postMessage (‘ this is an example of error handling ‘); webWorker.addEventListener ( “message” , function(event){ alert ( “Completed” + event.data + “of the operation”); }; webWorker.onerror = (event) => { console.log (‘ Error identified with your worker ‘ ) ; }; </script>
Let’s understand the whole thing with another example −
Suppose you want to find the factorial of 10000 and you want to use web workers.
First create an external js file named as demo.js
const number = 10000; const fact = 1; for ( let i= 1; i<= number; i++){ fact = fact * I; } console.log(fact);
Now write the HTML code —
<html> <title> Web Workers </title> <script> const webWorker = new Worker ( ‘demo.js’ ); webWorker.onmessage = function (event) { document.getElementById( “solution” ).innerhtml = event.data; }; webWorker.onerror = event => { console.log( “ error occurred while doing the operation “); }; </script> <body> <div id = “solution” ></div> </body> </html>
Here,
event.data element consists of the messages sent by the web worker.
Note − The codes which is executed the web worker is always stored in an individual Javascript file.
Conclusion
Web worker is a recent feature of HTML5. Although it is very helpful in performing heavy calculations on the web browser, it can have errors because it is still in the developing stage. So, it is a good thing to add error handling to the web page code so that in case of such errors you’ll get notified and hence, debugging actions could be done.
��������� ������
��������� ������
������������ HTML5 �� ������ ���������, ��� ������ ������ ��������, ����� ��� ������������ ������������� ���������� ��������. ������� ����� ������� HTML ������������ ����� ���������, ���? �������� ������ ������, ����� �� ����������� ��������� ��������� ��������.
�� ��� ��� ������������� ��������� ����������� �����������, ��� ������ ���������, ������� ��������������. ������ ��� ��������, ��� ����� ���� ��������� ������-���������� �������������� �������� ��, ��� ����� ������� ������ ����� ���������� �������. �� ����� ������������ ������������� ������� ������������� ���������. ������� ����� ���� �� �� ������� ����� ����, ����� ����������� ��, ��� ��������� ������������ ��������� ��������, �������������� ������ ����� ����� �������.
����������� ����, ��� ����� ������������ ������, �HTML5�� ���������� ����������� ������. ���� ���� �� �HTML5 ���� ������ �������� ��������� ��HTML 4.01, ��� ���������� ����� �� �� �� ���� ����� ������������ ���������� ��, ��� ����� ������������ ��� ������, �2012�����,�� ��� ����� ���� �� ������������ ������.
��������, ��������� ������ �� �����-�� ������������ ���-�������������, �������� ���� �� ����� ������������� ����, ��� ����� �������� ��������������� ���������� ���������, ����� ������������� ��������� ��� ����� �����. ���� ���������� ������������ �������� �������� ��� �������, �� HTML5 ������� ���� �������, ���� ������������� ����������. ������� ��� ����, ����� ���������� ������������. ��� ���������, ������ ������������ HTML5 ��������� ������ ������� ��� �������� ������ ������� �����������, �������, �������, ������ ������� ��� ������������, ������� ������ ��������, ��������� ���� ��������� ���������� �������.
Обработка ошибок |
127 |
|
|
Свойство |
Тип |
Комментарий |
|
coords..altitude |
double или null |
Метры над поверхностью условного |
|
эллипсоида Земли |
||
|
coords..accuracy |
double |
Метры |
|
coords..altitudeAccuracy |
double или null |
Метры |
|
coords..heading |
double или null |
Градусы по часовой стрелке от направле- |
|
ния на север |
||
|
coords..speed |
double или null |
Метры в секунду |
|
timestamp |
DOMTimeStamp |
Как объект Date() |
Гарантированно определены только три координатных свойства: coords.latitude, coords.longitude и coords.accuracy. Представление остальных (null, если не опреде-
лены) зависит от возможностей клиентского компьютера и сервера позиционирования, с которым тот связывается. Свойства heading и speed могут быть вычислены лишь тогда, когда известно предыдущее положение пользователя.
Обработка ошибок
Геолокация — это непростая система, в которой того и гляди что-нибудь не заладится. Уже говорилось о проблеме запроса согласия пользователя. Если страница запрашивает координаты пользователя, а пользователь не хочет их сообщать, вебмастер будет посрамлен, потому что пользователь всегда прав. Каким же образом реализовать в коде обработку ошибок? Для нее предназначен второй аргумент функции getCurrentPosition() — это тоже функция обратного вызова:
navigator.geolocation.getCurrentPosition(show_map, handle_error)
Если что-то не в порядке, функция обработки ошибок будет применена к объекту PositionError. Его свойства перечислены в табл. 6.3.
Таблица 6.3. Свойства объекта PositionError
|
Свойство |
Тип |
Комментарий |
|
code |
short |
Код ошибки (порядковый номер) |
|
message |
DOMString |
Не для конечных пользователей |
Свойство code принимает одно из четырех значений:
PERMISSION_DENIED (1) — если пользователь нажмет кнопку Don’t Share (Не сообщать) на панели геолокации или иным способом запретит доступ к данным о своем местонахождении;
POSITION_UNAVAILABLE (2) — если не работает сеть или невозможно связаться со спутником позиционирования;
TIMEOUT (3) — когда сеть работает, но на расчет координат уходит слишком много времени (что значит «слишком много», вы узнаете в следующем разделе);
UNKNOWN_ERROR (0) — если проблема в чем-то другом.

128 Глава 6.. Вот мы вас и нашли!
Пример:
function handle_error(err) { if (err.code == 1) {
// воля пользователя — закон для меня!
}
}
Разметка в вопросах и ответах
|
Вопрос: Будет ли API геолокации работать на Между |
ская система [WGS84] с двухмерными координатами. |
|
народной космической станции, на Луне, на других пла- |
Другие системы не поддерживаются». Поскольку МКС |
|
нетах Солнечной системы? |
облетает Землю по орбите, местоположение космо- |
|
Ответ: Спецификация (http://www.w3.org/TR/geolo |
навтов на станции (http://twitter.com/Astro_TJ) описы- |
|
вается широтой, долготой и высотой. Но, будучи ори- |
|
|
cation-API/#coordinates_interface) гласит: «Эталонная |
ентированной на координатную сеть Земли, Мировая |
|
система географических координат, используемая |
геодезическая система неприменима к Луне и другим |
|
в атрибутах этого интерфейса, — Мировая геодезиче- |
планетам. |
Требую выбора!
Такие популярные мобильные устройства, как iPhone и Android, поддерживают два способа определения координат. Первый способ — триангуляция, основанная на оценке расстояний до нескольких башен-ретрансляторов вашего сотового оператора. Это быстрая процедура, для которой не нужно никакого специального GPS-оборудования, но ее точность оставляет желать лучшего. В зависимости от того, сколько ретрансляторов находится поблизости, ваше местонахождение может быть установлено с точностью до квартала (если их много) или до одного-двух километров (если их мало).
Другой способ состоит в том, что GPS-модуль вашего мобильного устройства связывается с находящимися на околоземной орбите спутниками GPS-позицио нирования. Как правило, GPS позволяет определить местонахождение с точностью до нескольких метров. Обратная сторона медали — чрезвычайно высокое энергопотребление GPS-чипов. На мобильном устройстве общего назначения такой модуль, как правило, по умолчанию выключен и включается лишь при необходимости. Вот почему инициализация связи с GPS-спутником требует некоторого времени.
Если вам когда-либо приходилось открывать Карты Google на iPhone или другом смартфоне, то оба способа вам уже знакомы. Сначала на карте появляется большой круг (окрестность ближайшей башни-ретранслятора), затем он уменьшается (триангуляция по другим башням) и наконец стягивается в точку (координаты, полученные с GPS-спутника).
Я рассказываю об этом потому, что не каждое веб-приложение нуждается в высокой точности координат. Так, например, если пользователь ищет, какой бы ему фильм посмотреть в одном из окрестных кинотеатров, хватит «приблизительных» координат, ведь даже в больших городах кинотеатров не так много и так или иначе
система должна будет вывести афиши всего нескольких из них. С другой стороны, для пошагового инструктирования в реальном времени нужна самая высокая точность. Иначе невозможно будет сказать пользователю: «Пройдя 20 метров, сверните направо» и т. п.
У функции getCurrentPosition() есть необязательный третий аргумент — объект PositionOptions. В нем можно устанавливать значения трех свойств (табл. 6.4). Свойства объекта PositionOptions тоже необязательны.
Таблица 6.4. Свойства объекта PositionOptions
|
Свойство |
Тип |
По умолчанию |
Комментарий |
|
enableHighAccuracy |
boolean |
false |
Установка true может |
|
замедлить работу |
|||
|
timeout |
long |
(не установлено) |
В миллисекундах |
|
maximumAge |
long |
0 |
В миллисекундах |
Еслифункциональностьустройствапозволяетрассчитыватьточныекоординаты, а пользователь согласен делиться ими, то их пересылку на сервер можно включить, установив для свойства enableHighAccuracy значение true. На смартфонах iPhone иAndroidдоступк«низкоточному»и«высокоточному»позиционированиюразделен,
поэтомувозможно,чтовызовgetCurrentPosition() приenableHighAccuracy:true выдаст ошибку, а при enableHighAccuracy:false пройдет успешно.
Свойство timeout определяет длительность промежутка (в миллисекундах), в течение которого ваше веб-приложение будет ждать присылки координат. Отсчет времени начинается с того момента, когда пользователь разрешает браузеру передать сведения о своем местонахождении. Таким образом, мы ограничиваем во времени не пользователя, а сеть.
Свойство maximumAge позволяет устройству сразу отсылать кэшированные данныеокоординатах.Так,например,пустьвашастраницавызвалаgetCurrentPosition() в первый раз, пользователь согласился и ваша первая (на случай успеха) функция обратного вызова применяется к координатам, вычисленным ровно в 10:00 утра. Допустим,черезминутупослеэтого,в10:01,высновавызываетеgetCurrentPosition(), на этот раз с присвоенным атрибуту maximumAge значением 75000:
navigator.geolocation.getCurrentPosition( success_callback, error_callback, {maximumAge: 75000});
Написав так, вы заявляете, что собственно нынешнее местонахождение пользователя вам знать не обязательно; достаточно узнать, где он находился 75 секунд (75 000 миллисекунд) назад. В данном случае устройство помнит, где пользователь был 60 секунд (60 000 миллисекунд) назад: координаты вычислялись при первом вызове getCurrentPosition(). Поскольку эти сведения не старше оговоренного срока давности, система не выполняет повторный расчет координат, а возвращает те же самые данные, что и в первый раз: широту, долготу, точность, метку времени
(10:00 утра).
Итак, прежде чем запрашивать пользователя о его местонахождении, задумайтесь о том, какая вам нужна точность данных, и, если это необходимо, включите enableHighAccuracy. Если местонахождение пользователя надо будет определять
|
130 |
Глава 6.. Вот мы вас и нашли! |
несколько раз, продумайте целесообразный срок давности сведений и установите соответствующий maximumAge. В том случае, если за положением пользователя надо следить непрерывно, функция getCurrentPosition() вам не подойдет. Надо приме-
нить watchPosition().
У watchPosition() та же структура, что и у getCurrentPosition(). В качестве аргументов она принимает две функции обратного вызова: одну обязательную (на случай успешного вызова) и одну необязательную (на случай ошибки), а необязательный третий аргумент — объект PositionOptions, со свойствами которого вы познакомились ранее. Разница в том, что ваша функция обратного вызова будет выполняться каждый раз, когда местонахождение пользователя изменит-
ся. Активным образом «опрашивать» аппарат пользователя нет необходимости: он сам определит удобный интервал «опроса» и будет запускать первую из двух функций обратного вызова каждый раз после того, как координаты пользователя изменятся. Можно применять watchPosition() для отображения движущегося маркера на карте, построения маршрута в реальном времени и т. д. по вашему усмотрению.
Функция watchPosition() возвращает число, которое вы, вероятно, посчитаете нужным где-то хранить. Чтобы прекратить слежение за координатами пользователя, достаточно вызвать метод clearWatch() и передать ему это число. В результате аппарат пользователя прекратит запускать функцию обратного вызова. Если вам когда-либо приходилось применять функции setInterval() и clearInterval()
вJavaScript, знайте, что здесь механизм точно такой же.
Ачто в IE?
API геолокации, стандартизованный W3C (см. раздел «API геолокации» этой главы), не поддерживается в Internet Explorer. Но не спешите отчаиваться! Gears (http://tools..google..com/gears/) — разработанное Google браузерное расширение с открытым исходным кодом, функционирующее на платформах Windows, Mac OS X, Linux, Windows Mobile и Android. Оно эмулирует в старых браузерах некоторые из новых функций, в частности API геолокации. Этот интерфейс отличается от стандартизованного W3C, но служит тем же целям.
Раз уж мы заговорили о наследуемой функциональности платформ, отмечу, что мобильные аппараты, построенные на платформах BlackBerry, Nokia, Palm и OMTP BONDI, имеют собственные API геолокации. Разумеется, все эти прикладные интерфейсы отличаются от интерфейса Gears, который, в свою очередь, отличается от W3C API геолокации. Как же быть?..
На помощь спешит geo.js
Сценарий geo.js (http://code..google..com/p/geo-location-javascript/) — это JavaScript-
библиотека, распространяемая под лицензией MIT с открытым исходным кодом. Она позволяет сглаживать различия между W3C API геолокации, API приложения Gears и разнообразными API мобильных платформ. Чтобы воспользоваться geo.js,
|
На помощь спешит geo..js |
131 |
надо поместить в нижнюю часть страницы два сценария (строго говоря, их можно поместить в любую часть страницы, но если внедрить их в контейнер <head>, страница будет загружаться медленнее, так что не делайте этого).
Первый из этих сценариев — gears_init.js (http://code..google..com/apis/gears/ gears_init..js),инициализирующийGears,еслиэторасширениеустановлено.Второй — geo.js (http://geo-location-javascript..googlecode..com/svn/trunk/js/geo..js). Код страницы должен выглядеть приблизительно так:
<!DOCTYPE html> <html>
<head>
<meta charset=»utf-8″>
<title>Название моей страницы</title>
</head>
<body>
…
<script src=”gears_init.js”></script> <script src=”geo.js”></script>
</body>
</html>
Теперь вы готовы к использованию любого из доступных API геолокации:
if (geo_position_js.init()) { geo_position_js.getCurrentPosition(geo_success, geo_error);
}
Разберем этот код по порядку. Сначала надо явным образом вызвать функцию init(). Если поддерживается и доступен хотя бы один API геолокации, функция возвратит true:
if (geo_position_js.init()) {
Вызвав функцию init(), мы не устанавливаем местонахождение пользователя, а только удостоверяемся, что это возможно сделать. Чтобы перейти кделу, вызовем функцию getCurrentPosition():
geo_position_js.getCurrentPosition(geo_success, geo_error);
При вызове getCurrentPosition() браузер спросит пользователя, можно ли рассчитать и передать на сайт его координаты. В частности, при геолокации с помощью Gears появится окно с вопросом, разрешает ли пользователь сайту прибегнуть к функциональности Gears. При встроенной поддержке API геолокации в браузере окно будет выглядеть иначе (например, в Firefox 3.5, как вы уже видели, появляется информационная панель в верхней части страницы).
Функция getCurrentPosition() принимает в качестве аргументов две функции обратного вызова. Если с помощью getCurrentPosition() местонахождение пользователя было успешно найдено (то есть пользователь согласился на передачу данных и API геолокации благополучно исполнил запрос), то выполняется первая из переданных функций. В данном примере она называется geo_success:
geo_position_js.getCurrentPosition(geo_success, geo_error);
Соседние файлы в папке web — tec
- #
12.06.201520.77 Mб12(Профессиональное_программирование)Кузнецов_М.В.,_Симдянов_И.В.-PHP._Практика_создания_Web-сайтов_+_CD-ROM(2009).djvu
- #
- #
- #
- #
- #
- Главная»
- Уроки»
- PHP»
- Создаем единую страницу для обработки ошибок
- Метки урока:
- php
- кодинг
- разное
Создаем единую страницу для обработки ошибок
В данном уроке представлено очень простое решение для обработки различных ошибок HTTP, таких как 404, 500 и так далее, в одном файле PHP. Нужно создать массив кодов ошибок и установить правила перенаправления на наш PHP файл. То есть, можно использовать одну страницу для обработки нескольких ошибок.
Перенаправление
В файле .htaccess вашего сервера нужно установить правила для обработки ошибок. В нашем случае мы будем перенаправлять все ошибки в наш файл errors.php, который будет формировать страницу HTML для посетителя. Добавляем в файл .htaccess следующие правила:
ErrorDocument 400 /errors.php ErrorDocument 403 /errors.php ErrorDocument 404 /errors.php ErrorDocument 405 /errors.php ErrorDocument 408 /errors.php ErrorDocument 500 /errors.php ErrorDocument 502 /errors.php ErrorDocument 504 /errors.php
PHP
Теперь создаем файл errors.php, который должен располагаться в корневом каталоге вашего сервера (так как такое его местоположение установлено в заданных нами выше правилах в файле .htaccess).
$status = $_SERVER['REDIRECT_STATUS'];
$codes = array(
400 => array('400 Плохой запрос', 'Запрос не может быть обработан из-за синтаксической ошибки.'),
403 => array('403 Запрещено', 'Сервер отказывает в выполнении вашего запроса.'),
404 => array('404 Не найдено', 'Запрашиваемая страница не найдена на сервере.'),
405 => array('405 Метод не допускается', 'Указанный в запросе метод не допускается для заданного ресурса.'),
408 => array('408 Время ожидания истекло', 'Ваш браузер не отправил информацию на сервер за отведенное время.'),
500 => array('500 Внутренняя ошибка сервера', 'Запрос не может быть обработан из-за внутренней ошибки сервера.'),
502 => array('502 Плохой шлюз', 'Сервер получил неправильный ответ при попытке передачи запроса.'),
504 => array('504 Истекло время ожидания шлюза', 'Вышестоящий сервер не ответил за установленное время.'),
);
$title = $codes[$status][0];
$message = $codes[$status][1];
if ($title == false || strlen($status) != 3) {
$message = 'Код ошибки HTTP не правильный.';
}
echo '<h1>Внимание! Обнаружена ошибка '.$title.'!</h1>
<p>'.$message.'</p>';
Готово!
Конечно, код PHP может формировать и более информативную страницу для пользователя. При формировании разметки стоит учесть рекомендации для страниц, выводящих информацию об ошибках.
5 последних уроков рубрики «PHP»
-
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
-
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
-
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
-
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
-
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
