JavaScript: как я определяю, находится ли цели ссылки тот же домен как страница это на?

Data Hygiene - это постоянная битва. Правильный случай никогда не бывает таким простым, как можно подумать. Существуют многочисленные различия и несоответствия при использовании данных из дикой природы.

Вот функция, которая может быть расширена при необходимости.

Полное раскрытие: Есть много других более производительных функций, но они, как правило, имеют упрощенный подход.

Пример

Declare @YourTable table (SomeCol varchar(100))
Insert Into @YourTable values
('old mcdonald'),
('dr. Langdon ,dds'),
('b&o railroad'),
('john-m-smith'),
('CARSON/jACOBS'),
('jAmes o''neil')

 Select *
       ,ProperCase = [dbo].[svf-Str-Proper](SomeCol)
 From @YourTable

Возвращает

SomeCol             ProperCase
old mcdonald        Old McDonald
dr. Langdon ,dds    Dr. Langdon ,DDS
b&o railroad        B&O Railroad
john-m-smith        John-M-Smith
CARSON/jACOBS       Carson/Jacobs
jAmes o'neil        James O'Neil

UDF, если интересно

[112 ]
7
задан Bill the Lizard 27 October 2010 в 02:55
поделиться

6 ответов

Я хотел бы указать, что, если Вы находитесь на so.com, следующими ссылками являются URL в том же домене:

(это может казаться нечетным, но последние два допустимы: если бы Вы находитесь на http://so.com, последний взял бы Вас на http://so.com/mail.google.com/index.php?var=value, который совершенно действителен),

Это действительно не отвечает на вопрос, но я надеюсь, что он будет вести остальную часть ответов. Если существует что-либо еще достаточно странное, не стесняйтесь добавлять его.

5
ответ дан 7 December 2019 в 05:32
поделиться

Возможно, это поможет: http://www.quirksmode.org/js/events_properties.html#target

0
ответ дан 7 December 2019 в 05:32
поделиться

Это походит на ответ комедии, но во всей серьезности это было бы быть желательным, чтобы Вы могли также сделать что-то как:

$('a.external')

Конечно, regex сравнение с Вашим window.location является программным ответом.

3
ответ дан 7 December 2019 в 05:32
поделиться

Метод вложения не является единственным способом, которым отличаются слушатели события IE и W3. Для IE необходимо считать window.event.srcElement; в W3 это - event.target, где событие является параметром, переданным функции обратного вызова.

Если Вам не нужны несколько обработчиков событий на ссылках, олдскульный DOM, 0 обработчиков событий являются, вероятно, более легким способом для Вас приблизиться к этому, позволяя Вам просто нам 'это' получать объект на любом браузере.

function bindtolinks() {
    for (var i= document.links.length; i-->0;)
        document.links.onclick= clicklink;
}

function clicklink() {
    if (this.host==window.location.host) {
        dosomething();
        return true; // I'm an internal link. Follow me.
    } else {
        dosomethingelse();
        return false; // I'm an external link. Don't follow, only do something else.
    }
}
2
ответ дан 7 December 2019 в 05:32
поделиться
if( someDomElementWhichIsALink.href.indexOf(window.location) != -1 ) {
  // this is targeting your domain
}
-2
ответ дан 7 December 2019 в 05:32
поделиться

Я отвечу на вопрос в обновлении о событиях в IE:

function track_file(evt)
{
  if (evt == undefined)
  {
    evt = window.event; // For IE
  }
  // Use evt
}

классический путь состоит в том, чтобы получить последовательный объект-событие через браузеры.

После этого я использовал бы regexes для нормализации URL, но я не уверен, о чем Вы заботитесь.

[РЕДАКТИРОВАНИЕ] Некоторый реальный код для помещения на практике, что я записал выше... :-)

function CheckTarget(evt)
{
  if (evt == undefined)
  {
    // For IE
    evt = window.event;
//~     event.returnValue = false;
    var target = evt.srcElement;
    var console = { log: alert };
  }
  else
  {
    target = evt.target;
//~     preventDefault();
  }
  alert(target.hostname + " vs. " + window.location.hostname);
  var re = /^https?:\/\/[\w.-]*?([\w-]+\.[a-z]+)\/.*$/;
  var strippedURL = window.location.href.match(re);
  if (strippedURL == null)
  {
    // Oops! (?)
    alert("Where are we?");
    return false;
  }
  alert(window.location.href + " => " + strippedURL);
  var strippedTarget = target.href.match(re);
  if (strippedTarget == null)
  {
    // Oops! (?)
    alert("What is it?");
    return false;
  }
  alert(target + " => " + strippedTarget);
  if (strippedURL[1] == strippedTarget[1])
  {
//~     window.location.href = target.href;  // Go there
    return true; // Accept the jump
  }
  return false;
}

Это - тестовый код, не производственный код, очевидно!

Строки с//~ комментарии показывают альтернативный способ предотвратить щелчок по ссылке, чтобы сделать переход. Это, так или иначе, более эффективно, потому что, если я использую console.log Firebug, любопытно ложь возврата неэффективна.
Я использовал здесь поведение, "переходят по ссылке или не", не зная реальной заключительной цели.

Как указано в комментариях, РЕ может быть более простым при помощи имени хоста вместо href... Я уезжаю как он, потому что это было уже кодировано и могло бы быть полезно в других случаях.
Некоторые специальные меры предосторожности должны быть приняты в обоих случаях для обработки особых случаев, как localhost, IP-адреса, порты...
Я избавился от доменного имени, прежде, чем перечитать вопрос и видеть, что это не была проблема... Ну, возможно, это может быть полезно для кого-то еще.

Примечание: Я показанный аналогичное решение в вопросе украсить ссылки: Редактирование всех внешних ссылок с JavaScript

0
ответ дан 7 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: