2011-01-05 18 views
9

Qual è la differenza tra l'utilizzo diDetermina il nome del dominio in JavaScript?

if (document.domain.toLowerCase().indexOf("domainName") != -1) 

e

if(window.location.href.match(/:\/\/(.[^/]+)/)[1].toLowerCase().indexOf("domainName") != -1) 

e

if(window.location.hostname.toLowerCase().indexOf("domainName") != -1) 

Sto solo cercando di abbinare su un certo domainName e si desidera utilizzare l'approccio migliore.

+1

direi quella che richiede meno quantità di codice (1 °) è il migliore, ma non ho alcuna esperienza con nessuno dei tre quindi ... comunque non contare troppo su questo, lly se stai cercando qualcosa relativo alla sicurezza perché un hacker potrebbe aggirarlo abbastanza facilmente – JCOC611

+1

A proposito, il tuo esempio non funzionerà mai. Stai chiamando a LowerCase() e poi stai confrontando con qualcosa che contiene una 'N' maiuscola.:) –

+0

ahhh sì buona chiamata, stavo sostituendo il nome di dominio reale con "domainName". ma sì, ho usato tutte le lettere minuscole in quella stringa su cui mi sto abbinando. – Shafique

risposta

31

migliore e più leggibile sarebbe:

if(location.hostname == "mysite.com"){ 

} 

Aggiornamento:

O come Patrick ha sottolineato, se siete solo alla ricerca di una parte del nome di dominio che userei match.

if(location.hostname.match('mysite')){} // will return null if no match is found 
+0

Se location.hostname ti dà il nome host, perché qualcuno dovrebbe creare un exp di reg per raggiungerlo? –

+0

L'unica cosa è che non fa la stessa cosa del codice OP. Non sappiamo se si desidera una corrispondenza esatta. – user113716

+1

Buona chiamata, ho aggiornato. –

1

Il primo e il terzo devono essere semplici e veloci. Dei due, non penso che importi davvero lo a condizione che tu stia testando il dominio.

Se si sta testando un sottodominio, quindi si consideri che document.domain essere modificato in javascript, mentre window.location.hostname non può.

1

Beh, window.location è il modo più standard, quindi suggerirei che oltre document.domain. IndexOf corrisponderà alle sottostringhe, il che probabilmente non è quello che desideri. Perché non solo:

window.location.hostname == "stackoverflow.com"? 

Suppongo che per alcuni siti sia disponibile un sottodominio opzionale. Come www.domain.com e just domain.com entrambi vanno nello stesso posto. Se questo è un problema che si potrebbe fare un po 'brutto regex, o si può solo dividere su punti:

var domainParts = window.location.hostname.split("."); 
domainParts[domainParts.length - 2] == "stackoverflow" 

non credo che le questioni caso, almeno nei browser che ho provato (Firefox e Chrome) che normalizzano il dominio nome in minuscolo automaticamente.

+0

Vedo quello che stai dicendo, ma perché usare una regex brutta quando potrei semplicemente usare indexOf()! = -1 per vedere se la stringa è una sottostringa dell'intero dominio/sottodominio? – Shafique

3

Tutte le nostre soluzioni non sono efficienti! baseranno fondamentalmente tutto ciò che contiene il nome di dominio .. ad es. diciamo che il dominio è "domain.com"

  • `http: // prefixdomain.com`
  • ` http: // domain.com.jo`
  • sottodomini `http: //sub.domain .com`
  • percorsi: `http: // whatever.com/domain.com`

modo migliore soluzione sarebbe quella

function isEquals(myhost){ 
       var hostName = window.location.hostname.split('.'); 
       myhost = myhost.split("."); 
       //handle stuff like site:.com or ..com 
       for (var x in myhost) 
       if (myhost[x] == "") myhost.splice(x,1); 

      //j is where to start comparing in the hostname of the url in question 
      var j = hostName.length - myhost.length; 
      for(var i in myhost) 
      { 
       //if j is undefined or doesn't equal the hostname to match return false 
       if (!hostName[j] || hostName[j].toLowerCase() != host[i].toLowerCase()) 
        return false; 
       j++; 
      } 
      return true; 
     } 
+0

Mentre questa risposta non risponde alla domanda che è stata posta. L'idea di dividere il dominio e confrontare ogni singola parte è encomiabile. Anche se ho problemi a capire il secondo ciclo. In parte perché c'è un errore di battitura '' host [i] '' probabilmente dovrebbe essere '' myhost [i] ''. In parte perché '' var j'' è corretto e '' hostName [j] '' viene confrontato con ogni elemento di '' myhost [] ''. Non riesco a vedere come questa funzione restituire '' true''. – iiminov

+0

Diciamo che stiamo confrontando '' http: // sub.dominio.com'' a '' http: // sub.dominio.com''. In questo caso '' j'' è '' 0''. Pertanto '' hostName [0] '' è '' 'http: // sub''' che verrebbe comparato a '' myhost [' http: // sub ',' dominio ',' com '] ''. La seconda condizione dell'istruzione '' if() '' in questo caso sarà '' true'' sulla seconda e terza iterazione. ''! hostName [j] '' dovrebbe sempre restituire '' false'' a meno che '' hostName'' fosse '' undefined''. Quindi, anche se si supera la prima iterazione, si '' restituisce false'' nelle iterazioni successive. – iiminov

+0

Spero di essere davvero frainteso qualcosa qui perché non ho ancora testato questa funzione. Ma la logica ha concluso diversamente. @AmjadMasad if potrebbe elaborare il funzionamento interno del secondo ciclo '' for() '' e indicare dove non sono riuscito a vedere la logica dietro di esso. Penso che tu stia facendo qualcosa ma non riesco a vederlo. Gradirei imparare qualcosa di nuovo. – iiminov

Problemi correlati