2012-05-23 10 views
11

Sto costruendo un app per iPhone e iPad utilizzando PhoneGap e jQmCome disattivare il comportamento predefinito di un ancoraggio in jQuery Mobile (iOS)

<div class="ui-block-a"> 
    <a id="btnLink" href="#pageID" data-role="button"></a> 
</div> 

e funziona bene, ma quando l'eseguo sulla dispositivo (non provare il simulatore) e premere a lungo, ottengo il menu predefinito di iPhone per un collegamento in un normale browser per aprire o copiare il collegamento.

Come disattivare questa funzione predefinita nella mia app?

ho provato questi senza successo:

$("a").click(function(event) { 
    event.preventDefault(); // long press menu still apear 
}); 


$("a").bind('click',function(event) { 
console.log(['preventingclick',event.type]); 
event.preventDefault(); // long press menu still apear 
}); 

se mi legano su 'taphold' Vedo ancora il menu su una lunga pressione, ma fare clic su Annulla vedo il log della console dopo: [ "prevenire lunga stampa", "taphold"]

$("a").bind('taphold', function(event) { 
console.log(['preventing long press',event.type]); 
event.preventDefault(); // long press menu still apear 
}); 

se uso delegato sulla manifestazione 'taphold' in questo modo:

$("a").delegate('taphold', function(event) { 
console.log(['preventing long press',event.type]); 
event.preventDefault(); 
}); 

risolverà ° Problema, ma non posso più allegare alcun evento, quindi non funzionerà più nessuno dei miei pulsanti.

$('#btnLink').bind("click", function() { 
$.mobile.changePage('mypage', 'slide'); // won't fire any more because of the delegate before 
}); 

so che delegato verrà applicata su tutti gli elementi, ora e in futuro, ma penso che io sono sempre vicino alla risposta, ma non ancora.

Grazie in anticipo

Anchor long press menu on iPhone

risposta

11

ok ottenuto al lavoro,

ho dovuto combinare entrambi codice di correzioni, CSS e JavaScript

quindi nel mio CSS ho fatto questo:

body { -webkit-touch-callout: none !important; } 
a { -webkit-user-select: none !important; } 

nel mio JavaScript ha fatto questo:

function onBodyLoad() { 
    $("a").bind('taphold', function(event) { 
    event.preventDefault(); 
}); 
} 

e ora tutti i collegamenti sono disabilitati, ma se si allega un evento a nessuno di T funzionerà senza alcun problema

ringrazia tutti

+1

fa 'taphold' richiede jQuery mobile? –

7

Quando si fanno $ ('a'). Click (..) che stai elaborazione solo l'evento 'click'. Qui è un evento diverso e in realtà un evento di sistema per iOS che non puoi gestire in javascript.

Quindi dovrai disabilitare questa funzione completamente dalla tua webapp se non la vuoi.

Provare quanto segue:

<script> 
document.documentElement.style.webkitTouchCallout = 'none'; 
</script> 

O nel CSS:

a[data-role=button] { 
    -webkit-user-select: none!important; 
} 
+0

grazie per la risposta, e basta provato questo e non ha funzionato, ancora ricevendo il menu nella mia app su una lunga pressione ... – EMMNS

+0

Il javascript funziona. Sostituisci documentElement con l'elemento di cui hai bisogno per disabilitare lo stile. – Hama

11

Date un'occhiata agli eventi sparati da jQm qui http://jquerymobile.com/demos/1.1.0/docs/api/events.html. Vuoi gestire l'evento "taphold".

EDIT Poco dopo aver postato questo ho finito per vedere lo stesso problema nella mia app! Ho trovato che l'aggiunta di questo stile, simile a quello che @chrisben correzioni suggerite esso:

body { 
    -webkit-touch-callout: none !important; 
} 

non ho alcun i form mia app in modo da non so dire di quelli ma link e bottoni tutti funzionano perfettamente bene con questo stile aggiunto.

+0

Provato il default su tabhold usando bind, non ha funzionato se uso delegato, tutti i miei eventi e pulsanti di clic smetteranno di funzionare, anche quelli che ho collegato loro gli eventi dopo, non funzionerà, immagino che mi stia avvicinando, ma non è ancora la risposta definitiva, grazie – EMMNS

+0

controllare il codice modificato nella domanda sopra – EMMNS

3

modo più semplice per farlo funzionare su iPhone è quella di disabilitare gli stili webkit tocco:

document.getElementById('your element id').style.webkitTouchCallout = 'none'; 
2
<style type="text/css"> 
*:not(input):not(textarea) { 
-webkit-user-select: none; /* disable selection/Copy of UIWebView */ 
-webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ 
}  
</style> 

**If you want Disable only anchor button tag use this.** 
a {-webkit-user-select: none; /* disable selection/Copy of UIWebView */ 
    -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ 
} 
Problemi correlati