Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: IMG + onMouseUp помогите.
 
 автор: AlexL1914   (18.05.2006 в 23:32)   письмо автору
 
 

Есть код
 <IMG src="image.jpg" onMouseUp="alert('Yes')" > 


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

Как бороться?

   
 
 автор: ec_stasis   (18.05.2006 в 23:37)   письмо автору
 
   для: AlexL1914   (18.05.2006 в 23:32)
 

видимо событие срабатывает только если курсор на самом элементе <IMG> (что вполне логично). Выход: поменять маусап на маусдаун...

   
 
 автор: AlexL1914   (19.05.2006 в 01:01)   письмо автору
 
   для: ec_stasis   (18.05.2006 в 23:37)
 

Неет. onMouseDown - для других целей нужен.

Вопрос почему это если просто кликнуть, то создаются и onMouseDown и onMouseUp,
а если у юзера "рука дрогнула" то второго - как не бывало. А его обработка критична.

P.S. Не логично. Так как я с обекта имж - не ухожу. Чуть-чуть мышь подвинул.

   
 
 автор: ec_stasis   (19.05.2006 в 01:51)   письмо автору
 
   для: AlexL1914   (19.05.2006 в 01:01)
 

Хм... у меня все работает...

   
 
 автор: 12345   (19.05.2006 в 02:23)   письмо автору
 
   для: 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 в 11:32)   письмо автору
 
   для: 12345   (19.05.2006 в 02:23)
 

to 12345

Да, БОЛЬШОЕ спасибо.
То, что нужно, работает и в IE и в FireFox. Осталось разобраться почему оно так.
Пошёл читать доку.

   
 
 автор: AlexL1914   (19.05.2006 в 13:01)   письмо автору
 
   для: 12345   (19.05.2006 в 02:23)
 

to 12345 посследний вопрос по теме:

Вот так работает
 <img ondrag="return false;" ... >  

А вот так не работает
 
 <img ... ondrag="MyHandleOnDrag();" ... > 
 ...
  function   MyHandleOnDrag() { return false ;}
 ....



Вопрос. Как вынести остановку события OnDrag в отдельную функцию?

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

Заранее спасибо.

   
 
 автор: 12345   (19.05.2006 в 15:05)   письмо автору
 
   для: AlexL1914   (19.05.2006 в 13:01)
 

ondrag="return MyHandleOnDrag();"

   
 
 автор: AlexL1914   (19.05.2006 в 16:22)   письмо автору
 
   для: 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.

   
 
 автор: 12345   (19.05.2006 в 19:26)   письмо автору
 
   для: 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.)

Или всё в разделах "Справочники" и "Учебники" на

   
 
 автор: AlexL1914   (19.05.2006 в 20:02)   письмо автору
 
   для: 12345   (19.05.2006 в 19:26)
 

Спасибо за столь обширный ответ.

Похоже, что способы "return false" (return!1) и "event.preventDefault()" для Mozilla/FF
в некоторых ситуациях НЕ равнозначны (проверено опытом).

Для меня как любителя С/С++ return !1 - вообще режет глаз,
так как булево значение может зависеть от реализации компилятора,
а унарное отрицание !1 это просто 0.

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

Большое спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования