2011-01-05 3 views
9

sự khác biệt giữa việc sử dụngXác định tên miền bằng JavaScript?

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

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

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

Tôi chỉ cố gắng để phù hợp trên một domainName nhất định và muốn sử dụng phương pháp tốt nhất là gì.

+1

tôi có thể nói một trong đó có số tiền ít mã (1st) là tốt nhất, nhưng tôi không có bất kỳ kinh nghiệm với bất kỳ của ba như vậy ... anyways không dựa quá nhiều vào điều này, specia lly nếu bạn đang kiểm tra một cái gì đó liên quan đến an ninh bởi vì một kẻ tấn công có thể bỏ qua nó khá dễ dàng – JCOC611

+1

Bằng cách này, ví dụ của bạn sẽ không bao giờ làm việc. Bạn đang gọi toLowerCase() và sau đó bạn đang so sánh với một cái gì đó có chứa một chữ hoa 'N'.:) –

+0

ahhh có cuộc gọi tốt, tôi đã thay thế tên miền thực bằng với "domainName". nhưng có tôi đã sử dụng tất cả chữ thường trong chuỗi mà tôi đang kết hợp trên. – Shafique

Trả lời

31

tốt nhất và dễ đọc nhất sẽ là:

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

} 

Cập nhật:

Hoặc như Patrick chỉ ra nếu bạn chỉ tìm kiếm một phần của tên miền tôi sẽ sử dụng match.

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

Nếu location.hostname cung cấp cho bạn tên máy chủ, tại sao mọi người lại xây dựng một điểm kinh nghiệm reg để truy cập vào nó? –

+0

Chỉ có điều là nó không làm điều tương tự như mã OP. Chúng tôi không biết liệu có khớp chính xác hay không. – user113716

+1

Cuộc gọi tốt, tôi đã cập nhật. –

1

Thứ nhất và thứ ba phải đơn giản và nhanh chóng. Trong số hai, tôi không nghĩ rằng nó thực sự quan trọng miễn là bạn chỉ đang thử nghiệm tên miền.

Nếu bạn đang thử nghiệm tên miền phụ, hãy xem xét rằng document.domain được sửa đổi trong javascript, trong khi window.location.hostname thì không.

1

Vâng, window.location là cách tiêu chuẩn hơn, vì vậy tôi khuyên bạn nên sử dụng hơn document.domain. IndexOf sẽ phù hợp với chất nền, mà có lẽ không phải là những gì bạn muốn. Tại sao không chỉ:

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

Tôi đoán đối với một số trang web bạn có thể có tên miền phụ tùy chọn. Giống như www.domain.com và chỉ domain.com đều đi đến cùng một địa điểm. Nếu đó là một mối quan tâm bạn có thể làm cho một số regex xấu xí, hoặc bạn chỉ có thể chia trên chấm:

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

Tôi không nghĩ rằng trường hợp vấn đề, ít nhất là trong các trình duyệt tôi đã cố gắng (Firefox và Chrome) họ bình thường tên miền tên để viết thường tự động.

+0

Tôi thấy những gì bạn đang nói, nhưng tại sao sử dụng một regex xấu xí khi tôi chỉ có thể sử dụng indexOf()! = -1 để xem nếu chuỗi là một chuỗi con của toàn bộ tên miền/tên miền phụ? – Shafique

3

Tất cả các giải pháp ur đều không hiệu quả! về cơ bản, họ sẽ khớp mọi thứ chứa tên miền .. ví dụ: cho phép nói tên miền là "domain.com"

  • `http: // prefixdomain.com`
  • ` http: // domain.com.jo`
  • tên miền phụ `http: //sub.domain .com`
  • con đường: `http: // whatever.com/domain.com`

vì vậy giải pháp tốt nhất là

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

Trong khi câu trả lời này không trả lời câu hỏi đã được hỏi. Ý tưởng chia nhỏ tên miền và so sánh từng phần riêng lẻ là đáng khen ngợi. Mặc dù tôi gặp khó khăn trong việc hiểu thứ hai cho vòng lặp. Một phần vì có một lỗi '' host [i] '' có thể là '' myhost [i] ''. Một phần vì '' var j'' là cố định và '' hostName [j] '' được so sánh với mọi phần tử '' myhost [] ''. Tôi không thấy hàm này trả về '' true'' như thế nào. – iiminov

+0

Giả sử chúng ta so sánh '' http: // sub.domain.com'' với '' http: // sub.domain.com''. Trong trường hợp này '' j'' là '' 0''. Do đó '' hostName [0] '' là '' 'http: // sub''' sẽ được so sánh với '' myhost [' http: // sub ',' domain ',' com '] ''. Điều kiện thứ hai của câu lệnh '' if() '' trong trường hợp này sẽ là '' true'' trên lần lặp thứ hai và thứ ba. ''! hostName [j] '' nên luôn trả về '' false'' trừ khi '' hostName'' là '' undefined''. Vì vậy, ngay cả khi bạn trải qua lần lặp đầu tiên, bạn sẽ '' trả về false'' trên các lần lặp tiếp theo. – iiminov

+0

Tôi hy vọng tôi thực sự hiểu nhầm điều gì đó ở đây vì tôi chưa thực sự thử nghiệm chức năng này. Nhưng logic kết luận ngược lại. @AmjadMasad nếu có thể giải thích về hoạt động bên trong của vòng lặp '' for() '' thứ hai và chỉ ra nơi mà tôi không nhìn thấy logic đằng sau nó. Tôi nghĩ rằng bạn đang ở trên một cái gì đó ở đó nhưng tôi chỉ không thể nhìn thấy nó. Tôi sẽ đánh giá cao để tìm hiểu một cái gì đó mới. – iiminov