renovations

This commit is contained in:
Ilya Kantor 2015-02-08 10:03:24 +03:00
parent e1d099ae97
commit 53d9080aad
50 changed files with 653 additions and 471 deletions

View file

@ -1,10 +1,10 @@
Дело в том, что обработчик из атрибута `onclick` делается браузером как функция с заданным телом.
То есть, он будет таким:
То есть, в данном случае он будет таким:
```js
function(event) {
handler()
handler() // тело взято из атрибута onclick
}
```
@ -24,7 +24,7 @@ function(event) {
<a href="http://w3.org" onclick="*!*return handler()*/!*">w3.org</a>
```
Альтернатива -- передать и использовать объект события для вызова `event.preventDefault()` (или кросс-браузерного варианта для поддержки старых IE).
Также можно использовать объект события для вызова `event.preventDefault()`, например:
```html
<!--+ run -->
@ -32,7 +32,7 @@ function(event) {
*!*
function handler(event) {
alert("...");
event.preventDefault ? event.preventDefault() : (event.returnValue=false);
event.preventDefault();
}
*/!*
</script>

View file

@ -18,4 +18,4 @@
По замыслу, переход на `w3.org` при клике должен отменяться. Однако, на самом деле он происходит.
В чём дело и как поправить, сохранив `onclick` в HTML?
В чём дело и как поправить?

View file

@ -2,30 +2,37 @@
<html>
<head>
<meta charset="utf-8">
<style>
#contents {
padding: 5px;
border: 1px green solid;
}
</style>
</head>
<body>
<div id="contents">
<fieldset id="contents">
<legend>#contents</legend>
<p>
Как насчет почитать <a href="http://wikipedia.org">Википедию</a>, или посетить <a href="http://w3.org"><i>W3.org</i></a> и узнать про современные стандарты?
</p>
</div>
</fieldset>
<script>
document.getElementById('contents').onclick = function(evt) {
var evt = evt || event
var target = evt.target || evt.srcElement
document.getElementById('contents').onclick = function(event) {
function handleLink(href) {
var isLeaving = confirm('Уйти на '+href+'?')
if (!isLeaving) return false
var isLeaving = confirm('Уйти на '+href+'?');
if (!isLeaving) return false;
}
var target = event.target;
while(target != this) {
if (target.nodeName == 'A') {
return handleLink(target.getAttribute('href'));
}
target = target.parentNode
target = target.parentNode;
}
}
</script>

View file

@ -2,14 +2,21 @@
<html>
<head>
<meta charset="utf-8">
<style>
#contents {
padding: 5px;
border: 1px green solid;
}
</style>
</head>
<body>
<div id="contents">
<fieldset id="contents">
<legend>#contents</legend>
<p>
Как насчет почитать <a href="http://wikipedia.org">Википедию</a>, или посетить <a href="http://w3.org"><i>W3.org</i></a> и узнать про современные стандарты?
</p>
</div>
</fieldset>
</body>
</html>

View file

@ -2,7 +2,7 @@
[importance 5]
Сделайте так, чтобы при клике на ссылки внутри <code>&lt;DIV id="contents"&gt;</code> пользователю выводился вопрос о том, действительно ли он хочет покинуть страницу и если он не хочет, то прерывать переход по ссылке.
Сделайте так, чтобы при клике на ссылки внутри элемента `#contents` пользователю выводился вопрос о том, действительно ли он хочет покинуть страницу и если он не хочет, то прерывать переход по ссылке.
Так это должно работать:
@ -10,7 +10,7 @@
Детали:
<ul>
<li>Содержимое блока `DIV` может быть загружено динамически и присвоено при помощи `innerHTML`. Так что найти все ссылки и поставить на них обработчики нельзя. Используйте делегирование.</li>
<li>Содержимое `#contents` может быть загружено динамически и присвоено при помощи `innerHTML`. Так что найти все ссылки и поставить на них обработчики нельзя. Используйте делегирование.</li>
<li>Содержимое может содержать вложенные теги, *в том числе внутри ссылок*, например, `<a href=".."><i>...</i></a>`.</li>
</ul>

View file

@ -2,7 +2,7 @@
<html>
<head>
<title>Галерея</title>
<link rel="stylesheet" type="text/css" href="gallery.css">
<link rel="stylesheet" href="gallery.css">
<meta charset="utf-8">
</head>
@ -25,8 +25,7 @@ var largeImg = document.getElementById('largeImg');
var thumbs = document.getElementById('thumbs');
thumbs.onclick = function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
var target = e.target;
while(target != this) {

View file

@ -2,7 +2,7 @@
<html>
<head>
<title>Галерея</title>
<link rel="stylesheet" type="text/css" href="gallery.css">
<link rel="stylesheet" href="gallery.css">
<meta charset="utf-8">
</head>

View file

@ -10,8 +10,6 @@
Для обработки событий используйте делегирование, т.е. не более одного обработчика.
P.S. Обратите внимание -- клик может быть как на маленьком изображении `IMG`, так и на `A` вне него. При этом `event.target` будет, соответственно, либо `IMG`, либо `A`.
Дополнительно:

View file

@ -1,38 +1,37 @@
# Действия браузера по умолчанию
Многие события влекут за собой действие браузера.
Многие события автоматически влекут за собой действие браузера.
Например:
<ul>
<li>Клик по ссылке инициирует переход на новый URL</li>
<li>Нажатие на кнопку "отправить" в форме -- посылку ее на сервер</li>
<li>Клик по ссылке инициирует переход на новый URL.</li>
<li>Нажатие на кнопку "отправить" в форме -- отсылку ее на сервер.</li>
<li>Двойной клик на тексте -- инициирует его выделение.</li>
</ul>
**Зачастую, мы полностью обрабатываем событие в JavaScript, и такое действие браузера нам не нужно.**
К счастью, его можно отменить.
Если мы обрабатываем событие в JavaScript, то зачастую такое действие браузера нам не нужно. К счастью, его можно отменить.
[cut]
## Отмена действия браузера
Есть два способа отменить действие браузера:
<ul>
<li>**Основной способ -- это воспользоваться объектом события. Для отмены действия браузера существует стандартный метод `event.preventDefault()`.**</li>
<li>Если же обработчик назначен через `on...` (не через `addEventListener/attachEvent`), то можно просто вернуть `false` из обработчика.</li>
<li>Если же обработчик назначен через `onсобытие` (не через `addEventListener`), то можно просто вернуть `false` из обработчика.</li>
</ul>
В следующем примере при клике по ссылке переход не произойдет:
```html
<!--+ autorun -->
<!--+ autorun height=60 -->
<a href="/" onclick="return false">Нажми здесь</a>
или
<a href="/" onclick="event.preventDefault()">здесь</a>
```
[warn header="Возвращать `true` не нужно"]
Вообще говоря, значение, которое возвращает обработчик, игнорируется.
Обычно значение, которое возвращает обработчик события, игнорируется.
Единственное исключение -- это `return false` из обработчика, назначенного через `onсобытие`.
@ -56,11 +55,11 @@
[iframe height=70 src="menu" link edit]
**Все элементы меню являются ссылками, то есть тегами `<a>`.**
HTML-разметка сделана так, что все элементы меню являются не кнопками, а ссылками, то есть тегами `<a>`.
Это потому, что некоторые посетители очень любят сочетание "правый клик - открыть в новом окне". Да, мы можем использовать и `<button>` и `<span>`, но если правый клик не работает -- это их огорчает. Кроме того, если на сайт зайдёт поисковик, то по ссылке из `<a href="...">` он перейдёт, а выполнить сложный JavaScript и получить результат -- вряд ли захочет.
**Значение `<a href="...">` -- это "запасной вариант", для правого клика и для поисковиков, а обычно клик будет обрабатываться JavaScript.**
Поэтому в разметке мы используем именно `<a>`, но обычно клик будет обрабатываться полностью в JavaScript, а стандартное действие браузера (переход по ссылке) -- отменяться.
Например, вот так:
@ -79,7 +78,7 @@ menu.onclick = function(event) {
В конце `return false`, иначе браузер перейдёт по адресу из `href`.
Так как мы применили делегирование, то меню может увеличиваться, можно добавить вложенные списки `ul/li`, стилизовать их при помощи CSS -- меню продолжит работать.
Так как мы применили делегирование, то меню может увеличиваться, можно добавить вложенные списки `ul/li`, стилизовать их при помощи CSS -- обработчик не потребует изменений.
## Другие действия браузера
@ -113,6 +112,8 @@ menu.onclick = function(event) {
<input *!*onmousedown="return false"*/!* onfocus="this.value=''" value="Кликни меня">
```
Это потому, что отменено стандартное действие при `onmousedown`.
...С другой стороны, во второй `<input>` можно перейти с первого нажатием клавиши [key Tab], и тогда фокусировка сработает. То есть, дело здесь именно в `onmousedown="return false"`.
[/warn]