Javascript per rilevare Skype?

È ansible che alcuni Javascript rilevi se Skype è installato o meno?

La ragione per cui lo chiedo è che mi piacerebbe cambiare l’href di un link in base a questo: se Skype non è installato, mostra un popup che spiega cos’è Skype e come installarlo, se è installato, cambia il link su skype:my.contact.name?call modo che il clic avvii una chiamata. Questioni immobiliari significa che preferirei avere solo un link mostrato.

Grazie per le risposte a tutti: dai link e dai metodi seanb e alcuni postati, sono stato in grado di trovare una soluzione che funziona per IE e Firefox, quindi ho pensato di pubblicare una risposta “completa”. Ecco come una comoda estensione jQuery!

L’estensione jQuery

 jQuery.extend({ skype : function(failureFunction) { var $ = jQuery; if ($.browser.safari || $.browser.opera) { return true; } else if ($.browser.msie) { try { if (new ActiveXObject("Skype.Detection")) return true; } catch(e) { } } else { if (typeof(navigator.mimeTypes["application/x-skype"]) == "object") { return true; } } $('a[href^="skype:"]').click(function() { failureFunction(); return false; }); return false; } }); 

uso

HTML:

 Call me Add me 

Javascript:

 jQuery(function($) { $.skype(function() { // this function gets called if they don't have skype. alert("Looks like you don't have skype. Bummer."); }); }); 

E questo è tutto!

Se qualcuno usa Safari, Opera o Chrome, lascerà che sia il browser ad occuparsene.

modifica: rejigged la funzione in modo che esegua solo il controllo quando la pagina viene caricata, non ogni volta che viene caricata la pagina. La funzione $.skype ora restituirà un bool che ti dice se skype è stato rilevato o meno .

Funziona su IE e Firefox, ma non su Chrome o Opera

 function isSkypeInstalled(str) { try { /*@cc_on //The Microsoft way, thanks to the conditional comments only run in IE if (new ActiveXObject("Skype.Detection")) return true; @*/ //Tested for firefox on win if (navigator.mimeTypes["application/x-skype"]) return true; } catch(e){} return false; } 

Appoggiandosi ai metodi affidabili di rilevamento di nickf, aggiungo semplicemente il nome utente skype a un attributo dati (” data-skype “) e cambio i valori href per tutti i tel: link se skype non è supportato. Funziona davvero bene, applicazione globale con tel normale : i collegamenti ipertestuali restano intatti se Javascript è disabilitato.

  Call /* the javascript*/ function hasSkype() { if ($.browser.safari || $.browser.opera) { return true; } else if ($.browser.msie) { try { if (new ActiveXObject("Skype.Detection")) return true; } catch(e) { } } else { if (typeof(navigator.mimeTypes["application/x-skype"]) == "object") { return true; } } return false; } $('a[href^="tel:"]').each(function() { if(hasSkype()) { // if Skype is available, update the link to use Skype $(this).attr('href','skype:'+$(this).attr('data-skype')+'?call'); } }); 

Il plugin skype per IE modifica il DOM in modo da poter sempre avere un campo del numero di telefono “fittizio” da qualche parte e cercare tutti gli elementi di “span” iniettati con classname “skype_tb_injection” …

Quello che stai cercando è qualcosa del genere:

                           +6...             

sembra che tu ti stia codificando in un angolo … cercando di rilevare skype con JS, a corto di spazio sullo schermo.

il tutto potrebbe essere più amichevole se, invece, il link “Contatto” porta l’utente a una pagina di contatto, con i tuoi link “skype:” e il tuo contenuto skype-download esplicativo. sarà un po ‘più utile di un popup JS.

potresti aggiungere alcune prefs, come la casella di controllo “I have skype non mostrare più questa pagina” a questa pagina. Quindi utilizzare tale pref per triggersre il collegamento “Contatto”.

No, in genere non è ansible rilevare se skype o qualsiasi altro software è installato da una pagina Web a meno che l’app non faccia qualcosa di specifico per rendere le informazioni disponibili come modificare la stringa user agent a la .Net o si dispone di una speciale estensione per il browser,

Quello non sarebbe quello che vuole la politica di sicurezza di javascript.

Senza un plugin o altre cose di terze parti non si ottiene mai tali informazioni. Puoi solo ottenere informazioni sui plug-in mancanti ma non sul tuo sistema operativo.

dovrebbe anche essere problematico per ottenere questo lavoro su mac & linux e windows allo stesso tempo.

È ansible utilizzare lo standard W3C e il browser determinerà quale software è installato per gestire le chiamate:

  

Stavo solo testando la mia piattaforma Fedora 12, Linux usando firefox o altri browser non funziona il protocollo skype.

Anche avendo installato linux skype.

NB: i riferimenti sopra riportati sono validi per la piattaforma Windows

Tutti i plug-in del browser che registrano i loro mime-tipi nell’array globale denominato mimeTypes , a cui è ansible accedere tramite navigator object navigator.mimeTypes .

Quindi puoi usare questo per controllare il plugin attivo o no. Se il plugin è installato e disabilitato, nessun tipo mime verrà registrato per quel plugin disabilitato. Se il plugin è installato e attivo, ha un record di tipo mime in navigator.mimeTypes

Alcune implementazioni di codice usando jQuery:

 jQuery.extend({checkPlugin: function(mimetype_substr) { for (var i = 0; i < navigator.mimeTypes.length; i++) { if (navigator.mimeTypes[i]['type'].toLowerCase().indexOf(mimetype_substr) >= 0) { console.log("Gotcha! Here it is: "+navigator.mimeTypes[i]['type']); return true; } } return false; }}); 

Quindi questo: $.checkPlugin("skype"); restituisce true se skype click2call plugin è installato e attivo. E false se non ci sono plugin o plugin attivi non sono installati.

In realtà è necessario cercare all’interno di un altro array globale: navigator.plugins , ma tutti i plugin attivi hanno i loro record in navigator.mimeTypes , e questo è un po ‘più semplice.

Potrebbe essere utile scrivere un’applet java firmata. In questo modo puoi almeno accedere al sistema operativo e determinare se Skype è installato in quel modo. Altrimenti, come notato, Javascript non consente quel genere di cose (se così fosse, il tuo computer sarebbe già stato compromesso).