2013-08-10 2 views
1

Я Попытка установить куки через JS с помощью jQuery.cookie для всех текущих субдоменов, как этотбыстрый способ получить .domain.com в JavaScript

$.cookie('account', 'myvalue', { path: '/', domain: '.domain.com' }); 

Дело в том, что window.location.hostname вернется www.domain.com или domain.com в зависимости от его контекст.

Есть ли какой-либо метод, позволяющий просто заменить поддомен, если присутствует, на "." и если никакой субдомен пока не отображается. в начале?

+2

''. " + window.location.hostname.split ('.'). slice (-2) .join ('.') '- но это не сработает с IP-адресом для хоста. – dc5

ответ

1

Для любого из следующих значений:

  • any.number.of.host.names.here.foo.domain.com
  • foo.domain.com
  • домен. с ом

следующие будут работать:

"." + window.location.hostname.split('.').slice(-2).join('.'); 

Хозяин localhost вернется .localhost в этом случае. Я не совсем уверен в лучшем поведении в этом отношении. См.: Cookies on localhost with explicit domain

Если вам нужно искать IP-адреса в качестве имени хоста, вы хотите добавить немного больше логики, чтобы определить, является ли это IP-адресом.

Лучший подход может быть:

function getDomain() { 
    var path = window.location.hostname.split('.'); 

    // See above comment for best behavior... 
    if(path.length === 1) return window.location.hostname; 

    if(path.length === 4 && isIPAddress(path)) return window.location.hostname; 

    return "." + window.location.hostname.split('.').slice(-2).join('.'); 
} 

// doesn't check for ip V6 
function isIPAddress(path) { 
    for(var i = 0; i < path.length; ++i) { 
     if(path[i] < 0 || path[i] > 255) { 
      return false; 
     } 
    } 

    return true; 
} 

Важно

Как отмечалось @Hiroto в одном из комментариев, убедитесь, что вы знаете, какой домен (ы) эта логика будет использоваться дальше. Не рекомендуется устанавливать файлы cookie для .co.uk. Для интересного чтения по этой проблеме см .: Mozilla Bug 252342: fix cookie domain checks to not allow .co.uk

1

Вопрос задан «что является самым быстрым способом», так что это самый быстрый способ, поскольку он использует наименьшие строки кода и не добавляет служебных данных контекстного переключателя, который имеет JavaScript для функций, или цикла for:

var domain = window.location.hostname; 
var parts = domain.split('.'); 
var isIpAddress; 

// Decide whether host is IP address 
isIpAddress = /[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}\.[0-9]{0,3}/.test(domain); 

// If it's an IP, then use full host name, 
// otherwise just use last two values of the dot-delimited host name array 
if(isIpAddress) 
    domain = window.location.hostname; 
else 
{ 
    if(parts.length <= 3) 
     domain = '.'+window.location.hostname; 
    else 
     domain = '.'+window.location.hostname.split('.').slice(1).join('.'); 
} 
+0

Без '.join ('.')' Массив будет преобразован в строку с помощью разделителя запятой. – dc5

+0

@ dc5 ''. '+ 'Автоматически вызывает JavaScripts' toString() 'function –

+0

Вправо - и это будет использовать разделитель запятой – dc5