Safari & Javascript - Политика одинакового происхождения? - PullRequest
0 голосов
/ 03 декабря 2008

У меня есть Javascript, который меняет хост в ссылках в соответствии с текущим сервером разработки / тестирования.

Вот пример:

var ndomain = document.domain;
var mydomain = 'www.foo.com';
var alink = document.getElementsByTagName('a');
for (var i = 0; i < alink.length; i++) {
    if (alink[i].href.length > 0){
        if (alink[i].host.substr(0, mydomain.length) == mydomain){
            alink[i].host = ndomain;
        }
    }
}

Это изменяет ссылки на http://www.foo.com/page.html на http://level1.test.foo.com/page.html.

Это работает во всех протестированных мною браузерах, кроме Safari (Mac или Win). Я искал и искал информацию о том, почему, и самая близкая причина, по которой я пришел, это «политика одного и того же происхождения».

Исходя из моего понимания политики того же происхождения, это должно работать, потому что все находится в домене foo.com . Может ли Safari быть более строгим в том, что я собираюсь использовать двухуровневый поддомен (например, level1.test )?

Может кто-нибудь посоветовать, почему этот процесс не работает в Safari или как я могу заставить его работать в Safari?

ТИА!

Ответы [ 2 ]

0 голосов
/ 11 декабря 2008

Это не должно иметь ничего общего с той же политикой происхождения.

То же самое можно увидеть в Google Chrome. Оба используют WebKit, поэтому, возможно, ключом к этой проблеме является интерфейс DOM WebKit.

Запуск JS в вопросе в Chrome не меняет хосты в ссылках. Ни отладчик JS, ни консоль JS не сообщают о каких-либо проблемах.

Попытки изменить свойство anchor.host вызывают:

  • ошибок не сообщается
  • без изменений в свойстве anchor.host

Это говорит о том, что свойство anchor.host по какой-то причине доступно только для чтения.

Свойство anchor.href выглядит доступным для записи, так что это, вероятно, ваш лучший вариант. Следующий код будет работать :

var ndomain = document.domain;
var mydomain = 'www.foo.com';
var alink = document.getElementsByTagName('a');
for (var i = 0; i < alink.length; i++) {
    if (alink[i].href.length > 0){
        if (alink[i].host.substr(0, mydomain.length) == mydomain){
            var currentHref = alink[i].getAttribute('href');
            var newHref = '';

            // Generate newHref based on currentHref and setting host as required

            alink[i].setAttribute('href', newHref);
        }
    }
}
0 голосов
/ 04 декабря 2008

В строке 5 есть синтаксическая ошибка (3 открывающих скобки, только 2 закрывающих скобки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...