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>

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

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

рони 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


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