Newsgroup: it.comp.lang.javascript
Titolo: riconoscere un clic prolungato

esiste la possibilità in js di riconoscere un clic che arriva dopo 
qualche secondo di pressione del tasto del mouse? come?
grazie

 qualche secondo di pressione del tasto del mouse? come? grazie
Puoi registrarti la data onmousedown e poi calcolare la differenza in 
millisecondi con onmouseup.
Del tipo:
dato un tag:
 <div onmousedown="mouseDown()" onmouseup="mouseUp()">Click & Release me! 
(dopo almeno 3 secondi)</div>
La parte js potrebbe essere un qualcosa del tipo:
	var dateDown=null;
	function mouseDown() {
		dateDown=new Date();
	}
	function mouseUp() {
		if(dateDown==null)
			return;
		dataAdesso=new Date();
		alert((dataAdesso.getTime()-dateDown.getTime
())/3000>=1?"Premuto per almeno 3 secondi!":"Devi tenere premuto per 
almeno 3 secondi!");
	}



Devi specificare meglio la domanda, per me non è ben chiaro quello che vuoi.
Mi viene da pensare che tu voglia un click dato dalla pressione (e non
dal rilascio). Ovvero, mentre ancora stai premendo il pulsante del
mouse, senza averlo rilasciato, vuoi che qualcosa accada dopo un tot.
Mac OS X è pieno di esempi del genere, nella sua UI.
Altrimenti non mi spiego la domanda, dato che il click è sempre
scatenato dal rilascio del pulsante del mouse (a meno di dragging), non
importa il tempo che ci metti tra la fase di pressione e quella di rilascio.
-- 
"When you have eliminated the impossible, whatever remains, however
improbable, must be the truth."

 	}
Ma fare un:
dataAdesso.getTime() - dateDown.getTime() >= 3000
? ;)


 ? ;)
;)

 Mac OS X ï¿œ pieno di esempi del genere, nella sua UI.
Strano come uno si accorga di fare delle domande imprecise ripensandoci 
sopra (mea culpa). Sï¿œ, esatto, ï¿œ questo l'effetto che vorrei ottenere. 
Anche se in subordine l'altra versione potrebbe pure andare (evento 
scatenato al rilascio dopo la pressione prolungata).

 scatenato al rilascio dopo la pressione prolungata).
onmouseodown esegui un bel setTimeout di 3 secondi per la function che 
vuoi eseguire:
 
https://developer.mozilla.org/en/window.setTimeout
onmouseup, se la function non è stata ancora eseguita, ne stoppi 
l'esecuzione:
 
https://developer.mozilla.org/en/DOM/window.clearTimeout

   
https://developer.mozilla.org/en/window.setTimeout
Così sembrerebbe perfetto. Ma probabilmente non ho capito bene qualcosa. 
Perché se scrivo:
javascript:var toID=window.setTimeout(alert("!",5000));
nella barra degli indirizzi la finestra di avviso compare subito e non 
dopo 5 secondi?

 secondi?
A parte che la prima parentesi chiusa e` nel posto sbagliato, cosi` passi 
il risultato della funzione alert (cioe` nulla) al setTimeout.
Devi fare come nella pagina linkata, e wrappare l'alert almeno in una 
anonymous function.
Bye.

 anonymous function.
Ops, scusate la mia goffaggine.
Così:
var toID=window.setTimeout(function(){alert("!");},3000);
tuttavia ottengo lo stesso risultato.

 tuttavia ottengo lo stesso risultato.
No, così ti deve funzionare. Prova eventualmente da una pagina web e non
dalla barra di indirizzi. Ti consiglio comunque quando devi eseguire del
codice js al volo di usare una qualche console (Praticamente tutti i
browser odierni ne hanno una).
Puoi anche rimuovere "window", comunque:
	var myTimerId = setTimeout(function() { alert("Hello") }, 3000);
Oppure:
	function sayHello() { alert("Hello") };
	var myTimerId = setTimeout(sayHello, 3000);


 ottengo lo stesso risultato.
Come ha detto Alessandro, nel link che ti ho postato c'è un esempio 
proprio con l'alert ...


il codice e' GPL V3:
cn = 0;
function conta(id){
     cn++;
     if(cn<5){
       chi = setTimeout('conta(\''+ id + '\')',200);
       ina[id].style.cursor = "crosshair";
     }
     if(cn>=5){
        cn = 5;
        ina[id].style.cursor = "pointer";
        if(confirm('delete this sofa ?')){
           deleteColumn(id);  // se supera il tempo fa questa
        }
     }
}
function ferma(id) {
     ina[id].style.cursor = "pointer";
     clearTimeout(chi);
     if(cn<5){
         changtimg2(id);  // se inferiore fa questa
     }
    cn = 0;
}
nel oggetto che deve fare la cosa:
ina[id].setAttribute('onmousedown','javascript: conta(\''+ id + '\')');
ina[id].setAttribute('onmouseup','javascript:ferma(\''+ id + '\');');

 ina[id].setAttribute('onmousedown','javascript: conta(\''+ id + '\')');
Perché setAttribute? 
 ina[id].onmouseover=conta; //ma non puoi passare parametri in questo 
modo. Ma usare setAttribute per gli eventi, sempre se funziona, si porta 
dietro sicuramente problemi di compatibilità
Non puoi metterlo direttamente come attributo del tag?

 ina[id].setAttribute('onmouseup','javascript:ferma(\''+ id + '\');');
Come ti ha detto Cristiano, è bene evitare `setAttribute` per problemi
di retrocompatibilità (IE6/7 non fanno il corretto binding all'evento).
La cosa migliore è usare addEventListener/attachEvent, una libreria, o
in casi semplici l'omonima proprietà (in questo caso
`element.onmousedown = function()...).
Inoltre non hai bisogno dello pseudo protocollo javascript, quello che
viene scritto all'interno di attributi collegati ad eventi è già
considerato javascript. Fare qualcosa tipo:
<button id="btnFoo" onclick = "foo()">click me</button>
è del tutto equivalente a:
document.getElementById("btnFoo").onclick = function(){
    foo();
}
Lo pseudo protocollo javascript è utile solo quando si tratta di URL,
quindi in attributi come href, ad esempio.
Tieni anche conto che cancellando il timeout sull'onmouseup
dell'elemento stesso, il timeout non viene cancellato se l'utente
tenendo premuto il pulsante esce dall'elemento e poi lo rilascia. A
volte questo non è problema, è considerato un edge case, ma è sempre
bene esserne consapevoli e sottolinearlo ad eventuali utilizzatori.


 modo.
Si può, basta fare qualcosa tipo:
var id = /* valore id */;
element.onmousedown = function(id) {
  return function() { conta(id) };
}(id);
O un più elegante currying:
element.onmousedown = conta.bind(null, id);
Per i browser che non supportano il metodo `bind` di ES5, si può sempre
optare per uno shim:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind


 Non puoi metterlo direttamente come attributo del tag?
e secondo te lo posso cambiare senza usare set atribute ?
l'oggetto di cui hi riportato l'esempio e' creato in modo dinamico da
un eval lato server quindi non si sa quanti sono a priori
e dove pensi che vada a finire ?
a crea elemento
b setta attributo
1 funzione che cambia attributo
2 evento dell'utente
3 che richiama funzione che risetta attributo
1,2,3, in loop se vuoi
se utilizzi il js con *abuso* di ajax vedi che il mondo cambia ma se lo 
utilizzi fine a se stesso o per degli eventi timer nella pagina
senza chiedere al server e' una cosa diversa
immagina di dover rinominare un file
il link deve diventare una textbox (quindi devi creare il div padre)
la textbox deve avere in value il nome del file
l'utente ci cambia il nome
passa al server
a) restituisce il nuovo nome del file
    rimette il link
b) restituisce errore
	b1 nome errato
	b2 permessi
		setta un altro Attribute

         setta un altro Attribute
Onestamente, non vedo come questo sia legato al discorso che ti faceva
Cristiano.


 
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/
Function/bind
Interessante... parla di compatibilità IE9, se è vero è usabile almeno in 
Intranet.
Non mi è molto chiaro perché usi (id) nel primo esempio, ma devo 
studiarmi meglio questo bind.

 e implementato nativamente come standard in ECMAScript 5.
[CUT]
Chiaro, grazie!