Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Клик и двойной клик (https://javascript.ru/forum/events/43737-klik-i-dvojjnojj-klik.html)

ksa 18.12.2013 14:23

Клик и двойной клик
 
Вот пример...

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
.on {
	background-color: green;
}
</style>
<script type="text/javascript">
$(function (){
	$('li').click(function (){
		if (this.className=='on') {
			action();
		} else {
			select(this);
		};
	});
	$('li').dblclick(function (){
		select(this);
		action();
	});
});
function select(Obj) {
	$(Obj.parentNode).find('li').removeClass('on');
	Obj.className='on';
};
function action() {
	alert('Action!')
};
</script>
</head>
<body>
<ul>
	<li>Item 1</li>
	<li>Item 2</li>
	<li>Item 3</li>
</ul>
</body>
</html>

При клике элемент либо выделяется... Либо срабатывает "экшн", если элемент уже выделен...
На двойной клик навешено выделение и запуск экшна...

Но при таком раскладе при двойном клике выполняется клик+клик+двойной_клик и экшн запускается два раза.
Как обойти это?
Пока решил проблему через переменную... :( Но это не нравится... Есть еще какие варианты?

Rise 18.12.2013 14:46

Ну убери вообще dblclick и будет то что надо...

рони 18.12.2013 14:51

ksa,
:write:
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
.on {
	background-color: green;
}
</style>
<script type="text/javascript">
$(function (){
	$('ul').on('click','li:not(".on")',function (){
		select(this)
	});
    $('ul').on('click','.on',function (){
		action();
	});
});
function select(Obj) {
	$(Obj.parentNode).find('li').removeClass('on');
	$(Obj).addClass('on');
};
function action() {
	alert('Action!')
};
</script>
</head>
<body>
<ul>
	<li>Item 1</li>
	<li>Item 2</li>
	<li>Item 3</li>
</ul>
</body>
</html>

ksa 18.12.2013 14:51

Цитата:

Сообщение от Rise
Ну убери вообще dblclick и будет то что надо...

Праильное решение! (с) :D

ksa 18.12.2013 14:54

рони, принято как рабочий вариант... :yes:

А как-то "остановить" события не получится?

рони 18.12.2013 15:00

Цитата:

Сообщение от ksa
А как-то "остановить" события не получится?

обьясни не понимаю ?
пока укороченный вариант ...
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
.on {
	background-color: green;
}
</style>
<script type="text/javascript">
$(function (){
	$('ul').on('click','li',function (){
	   $(this).hasClass('on') ? action():select(this)
	});

});
function select(Obj) {
	$(Obj).addClass('on').siblings().removeClass('on');
};
function action() {
	alert('Action!')
};
</script>
</head>
<body>
<ul>
	<li>Item 1</li>
	<li>Item 2</li>
	<li>Item 3</li>
</ul>
</body>
</html>

ksa 18.12.2013 15:32

Цитата:

Сообщение от рони
обьясни не понимаю ?

Да я что-то зациклился на этом двойном клике... :cray: А он действительно не нужен тут.

Rise 18.12.2013 15:58

ksa, еще можно так:
<script src="//code.jquery.com/jquery-1.10.2.min.js"></script>

<style>.on{background-color:green;}</style>

<ul>
	<li>Item 1</li>
	<li>Item 2</li>
	<li>Item 3</li>
</ul>

<script>
$(function (){
	$('li').click( { p: 0 }, function(e) {
		if (e.data.p == this) {
			alert('Action!');
			return;
		}
		if (e.data.p) e.data.p.className = '';
		this.className = 'on';
		e.data.p = this;
	});
});
</script>

ksa 18.12.2013 16:08

Rise, спасибо. :) Переделал все по первому варианту рони...

ksa 18.12.2013 16:28

Цитата:

Сообщение от ksa
Да я что-то зациклился на этом двойном клике...

Вот почему.
В ИЕ двойной клик это "отдельное" событие... И там по двойному клику все эти примеры не запустят экшн. :(

рони 18.12.2013 17:33

ksa,
как вариант можно поменять click в моём коде на mouseup, а так да двойной клик везде 3 события click - click - dblclick в старых ие только 2 click - dblclick

Rise 18.12.2013 17:42

Цитата:

Сообщение от ksa (Сообщение 287623)
Вот почему.
В ИЕ двойной клик это "отдельное" событие... И там по двойному клику все эти примеры не запустят экшн. :(

Странно, а class то ведь меняет зараза...

Rise 18.12.2013 18:41

Да рони прав, IE опять отличился, на mouseup всё OK.

ksa 18.12.2013 19:35

Цитата:

Сообщение от рони
можно поменять click в моём коде на mouseup

Так же не панацея... :(
Есть "мудрецы" - нажимают мышу на одном элементе, а отпускают на другом... :-E

Но все спасибо все равно. :yes:

cyber 18.12.2013 19:41

Цитата:

Сообщение от ksa
Есть "мудрецы" - нажимают мышу на одном элементе, а отпускают на другом...

mousedown ?

ksa 18.12.2013 21:28

Цитата:

Сообщение от cyber
mousedown ?

И что будет?
Нажал и пошел экшн! А кнопка даже не отпущена... Это нормально?

cyber 18.12.2013 21:54

ksa, при mousedown сохраняешь ссылку на элемент в переменной, при mouseup проверяешь переменную если она не пустаю то выполняешь экшн для того элемента, потом очищаешь переменную

ksa 19.12.2013 08:38

Цитата:

Сообщение от cyber
при mousedown сохраняешь ссылку на элемент в переменной

Я писал выше, что используя переменную, решил проблему клика и двойного клика.
Т.ч. весь вопрос был в том, как сделать без переменной.

ksa 19.12.2013 09:55

Цитата:

Сообщение от рони
как вариант можно поменять click в моём коде на mouseup

В итоге выделение оставил на клике, а запуск экшна на маусапе...
Пока такое сочетание нравится больше всего. :)
Еще раз спасибо. :yes:


Часовой пояс GMT +3, время: 16:45.