Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Два события на одном объекте (https://javascript.ru/forum/dom-window/38275-dva-sobytiya-na-odnom-obekte.html)

zzzzzz 26.05.2013 00:44

Два события на одном объекте
 
<td onclick='openGroupBM(this)' ondblclick='editNamegroup(this)'>текст</td>
при одиночном клике срабатывает функция от онклик - все првильно,

а при двойном, два раза функция от онклик а уже потом от даблклик.

как при даблклик сделать так чтобы онклик функция не срабатывала?

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

elnoro 26.05.2013 11:24

Не очень элегантное решение через глобальную переменную и setTimeout:
function openGroupBM (elem) {
    timer = setTimeout(function() {
    /* старый код */
    }, 1000)
}
function editNamegroup(elem) {
    clearTimeout(timer);
    /* старый код */
}

bes 26.05.2013 22:17

<button id="but">click</button>
<script>
(function () {
	var flag = true;
	but.onclick = function () {
		if (flag) { 
			console.log('click');
		}
		flag = false;
		setTimeout(function () {flag = true}, 500);
	}
	but.ondblclick = function () {
		console.log('dblclick');
	}
})();
</script>

http://learn.javascript.ru/events-and-timing-depth

danik.js 27.05.2013 08:22

Кстати задержка у разных пользователей может быть разной, поэтому такое решение костыльное и нестабильное. Лучше избегать его использования.

bes 27.05.2013 18:53

Цитата:

Сообщение от danik.js
Кстати задержка у разных пользователей может быть разной, поэтому такое решение костыльное и нестабильное. Лучше избегать его использования.

danik.js, у тебя есть другой вариант?

Aetae 27.05.2013 19:08

Цитата:

Сообщение от bes (Сообщение 253093)
danik.js, у тебя есть другой вариант?

Да. В таких случаях dblclick отдельно не вешается - функция срабатывает при повторном onclick в течении задержки. Кстати средняя dblclick задержка - 300мс.

bes 27.05.2013 19:21

Цитата:

Сообщение от Aetae
Да. В таких случаях dblclick отдельно не вешается - функция срабатывает при повторном onclick в течении задержки. Кстати средняя dblclick задержка - 300мс.

где именно?
в варианте elnoro второй onclick точно сработает, хоть и с задержкой вру
в варианте elnoro последовательность onclick dblclick не гарантирована и зависит от времени задержки
в моём варианте этому помешает флаг
флаг гарантирует, что второй onclick не сработает раньше времени задержки, коего достаточно для того, чтобы сработал dblclick
или я не понял о чём речь

Aetae 28.05.2013 08:48

bes, время dblclick можно настроить в винде как те нравится. Поставит какой-нить инвалид секунду и всё тазом накроется.

Примерно так делается:
<button id="but2">click 2</button>
<button id="but5">click 5</button>
<div style="background:#ddf;color:#220" id="out"></div>
<script>
function multiclick(delay){
    var clicks = Array.prototype.slice.call(arguments,1),
        length = clicks.length,
        index = 0,
        timer;
    return function(event){
        var self = this,
            i = Math.min(++index, length);
           
        clearTimeout(timer);
 
        timer = setTimeout(function(){
            clicks[i-1].call(self, event, i, index);
            index = 0;
        },
        delay)
    }
}
function id(i){return document.getElementById(i)};
 
function alertIndex(e, i, trueI){
    out.innerHTML += ' &nbsp;&nbsp;&nbsp;'+ i + '(' + trueI + ')';
}
 
id('but5').onclick = multiclick(
    250,
    alertIndex,
    alertIndex,
    alertIndex,
    alertIndex,
    alertIndex
);
 
id('but2').onclick = multiclick(
    250,
    alertIndex,
    alertIndex
);
</script>

Denis_od 29.05.2013 13:33

Жмите по кнопке http://jsfiddle.net/z2w6D/1/

Aetae 29.05.2013 13:41

Denis_od, и?
Если кликнуть один раз, а затем кликнуть второй раз через 300 мс у вас сработает и клик и даблклик.
Читайте тему. Вышеописанные проблемы касаются и вас. То что вы написали такое же косячное дерьмо на jquery, не делает это дерьмо менее косячным.


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