|
|
|
|
|
для: 12345
(19.05.2006 в 19:26)
| | Спасибо за столь обширный ответ.
Похоже, что способы "return false" (return!1) и "event.preventDefault()" для Mozilla/FF
в некоторых ситуациях НЕ равнозначны (проверено опытом).
Для меня как любителя С/С++ return !1 - вообще режет глаз,
так как булево значение может зависеть от реализации компилятора,
а унарное отрицание !1 это просто 0.
onclick действительно не страдает, страдает onMouseUp.
Причем, кросброузерная обработка этого события если последовательность:
нажата-мышь-на-рисунке --- выведена за границу окна браузера - отпущена
заслуживает сама по себе отдельной статьи.
Большое спасибо. | |
|
|
|
|
|
|
|
для: AlexL1914
(19.05.2006 в 16:22)
| | в атрибуте return возвращает значение в стандартный обработчик. Отсутствие означает возврат null, который НЕ отменяет стандартный обработчик. Кроме возврата через return в атрибуте есть возврат через reurnValue/preventDefault(). Они совершенно равнозначны. Поставьте onMouseDown=return!1 , и эффект будет тот же.
Поэтому, если забыли написать return (и не вызвали reurnValue/preventDefault() ), стандартное событие не отменится.
Стандартное событие для onMouseDown - начать DragDrop, если это рисунок, и если его затем потащат. И ничего больше, даже onclick не страдает от отмены onMouseDown. В IE DragDrop можно отменить прямо, а в FF, наверное, нет (я не нашёл способа, и не я один). Поэтому выбран косвенный способ отмены.
Думаю, у Вас возникает вопрос, зачем тогда нужны reurnValue/preventDefault() ? Для функций-обработчиков событий, определённых пользователем. Т.е. когда она вызывается не через атрибут тега.
По "голосованию" "Как правильно?":
правильно всё. Т.е. , как описано выше, отменить станд. обраб. можно тем или другим способом. Во 2-й строчке моего примера для FF сделано как раз "другим способом", а в первой строчке для ИЕ - первым способом.
Описание, наверное, будет лучшее здесь (как и всё остальное):
http://wdh.suncloud.ru/dhtml11.htm#ref411 - Глава 4.11. Обработка событий в DOM
http://wdh.suncloud.ru/dhtml12.htm#ref412 - Глава 4.12. Обработка событий в IE
Наверное, стоит написать статью на эту тему... У событий есть целый ряд особенностей, который компактно нигде не описан. В частности, если onMouseDown="MyFunction();", то MyFunction - не есть функция-обработчик, назначенная пользователем, это обычная функция. Поэтому, чтобы она могла обработать событие, ей необходимо передать event (объект) в параметре. Настоящий же обработчик имеет в себе доступный объект event. (В Gecko - c иным способом доступа, чем в IE/Opera.)
Или всё в разделах "Справочники" и "Учебники" на | |
|
|
|
|
|
|
|
для: 12345
(19.05.2006 в 15:05)
| | Спасибо. Всё гениальное - просто.
Но теперь я вообще перестал понимать DHTML в IE.
Куда возвращается это значение?
И зачем тогда event.preventDefault() ?
когда можно так (просто возвращать false)
<img src="image.jpg"
onMouseDown="return MyMouseDown();"
onMouseUp="return MyMouseUp();"
oncontextmenu="return false;"
ondrag="return false;"
>
function MyMouseDown() {
// нужный код
return false;
}
function MyMouseUp() {
// нужный код
return false;
}
|
И как всё-таки правильно:
1 ... onMouseDown="MyFunction();"
2 ... onMouseDown="return MyFunction();"
3 ... onMouseDown="MyFunction(event);"
4 ... onMouseDown="return MyFunction(event);"
|
или return имеет отношение только к onDrag ?
В любом случае, большое спасибо за советы, критическую часть проекта мы сделали.
Всё работает, только понимания почему и как до сих пор нет,
скорее его стало даже меньше :)
Если разъясните кратко или дадите линк на _нормальный_ учебник/справочник - буду благодарен.
Alex. | |
|
|
|
|
|
|
|
для: AlexL1914
(19.05.2006 в 13:01)
| | ondrag="return MyHandleOnDrag();" | |
|
|
|
|
|
|
|
для: 12345
(19.05.2006 в 02:23)
| | to 12345 посследний вопрос по теме:
Вот так работает
<img ondrag="return false;" ... >
|
А вот так не работает
<img ... ondrag="MyHandleOnDrag();" ... >
...
function MyHandleOnDrag() { return false ;}
....
|
Вопрос. Как вынести остановку события OnDrag в отдельную функцию?
А нужно это чтоб внутри функции разделять картинки по имени классов, на каких
надо обрабатывать события мыши по-моему, а какие - по дефолту.
Заранее спасибо. | |
|
|
|
|
|
|
|
для: 12345
(19.05.2006 в 02:23)
| | to 12345
Да, БОЛЬШОЕ спасибо.
То, что нужно, работает и в IE и в FireFox. Осталось разобраться почему оно так.
Пошёл читать доку. | |
|
|
|
|
|
|
|
для: ec_stasis
(19.05.2006 в 01:51)
| |
<img src="snow21.gif" onMouseUp=alert('Yes') ondrag=return!1
onmousedown=if(event.preventDefault)event.preventDefault();>
|
| |
|
|
|
|
|
|
|
для: AlexL1914
(19.05.2006 в 01:01)
| | Хм... у меня все работает... | |
|
|
|
|
|
|
|
для: ec_stasis
(18.05.2006 в 23:37)
| | Неет. onMouseDown - для других целей нужен.
Вопрос почему это если просто кликнуть, то создаются и onMouseDown и onMouseUp,
а если у юзера "рука дрогнула" то второго - как не бывало. А его обработка критична.
P.S. Не логично. Так как я с обекта имж - не ухожу. Чуть-чуть мышь подвинул. | |
|
|
|
|
|
|
|
для: AlexL1914
(18.05.2006 в 23:32)
| | видимо событие срабатывает только если курсор на самом элементе <IMG> (что вполне логично). Выход: поменять маусап на маусдаун... | |
|
|
|
|