Если он работает в браузере, у меня такой вид работает ..

тоящее время я использую следующую функцию, чтобы «преобразовать» относительный URL в абсолютный:

function qualifyURL(url) {
    var a = document.createElement('a');
    a.href = url;
    return a.href;
}

Это работает довольно хорошо в большинстве браузеров, но IE6 все еще настаивает на возвращении относительного URL! Это делает то же самое, если я использую getAttribute ('href').

Единственный способ получить полноценный URL из IE6 - это создать элемент img и запросить его атрибут 'src' - проблема в том, что он генерирует запрос к серверу; что-то, чего я хочу избежать

Итак, мой вопрос: есть ли способ получить полный URL-адрес в IE6 от относительного (без запроса сервера)?

Прежде чем рекомендовать быстрое исправление регулярных выражений / строк, уверяю вас, это не так просто. Базовые элементы + двойной период относительные URL + тонна других потенциальных переменных действительно превращают его в ад!

Должен быть способ сделать это без необходимости создавать гигантское решение regex'y ??

 Jaime Hablutzel15 июн. 2012 г., 00:05
У меня не получилось с этим работать, у меня просто "фу" и я хочу "example.com/foo"
 James23 янв. 2009 г., 09:15
Спасибо, Гамбо, полагаю, это придется сделать. Мне бы понравилось более сжатое решение, но все равно спасибо, я никогда не знал, что этот класс js-uri существует!
 djsmith13 дек. 2012 г., 21:52
Библиотека js-uri, кажется, не делает то, что хочет оригинальный плакат.
 Gumbo22 янв. 2009 г., 22:58
Вы могли бы использоватьJS-URI разрешить относительный URI к абсолютному.
 Tom Harrison Jr14 февр. 2012 г., 17:03
Сладкий взлом! Не волнует IE6. Спасли меня часы. Ты жжешь.

Ответы на вопрос(11)

который не требовал бы изменения исходного документа (даже временно), но все же использовал встроенный в браузер анализ URL-адресов и тому подобное. Кроме того, я хотел быть в состоянии предоставить свою собственную базу (как ответ ecmanaught). Это довольно просто, но использует createHTMLDocument (может быть заменен на createDocument, чтобы быть немного более совместимым, возможно):

function absolutize(base, url) {
    d = document.implementation.createHTMLDocument();
    b = d.createElement('base');
    d.head.appendChild(b);
    a = d.createElement('a');
    d.body.appendChild(a);
    b.href = base;
    a.href = url;
    return a.href;
}

http://jsfiddle.net/5u6j403k/

 Oriol03 мар. 2016 г., 14:19
Не уверен, что я что-то упустил, но IE6 (ни 7, 8) не поддерживаетdocument.implementation.createHTMLDocument
 ericP05 мая 2017 г., 11:28
Я использовал это, когда я использовал веб-приложение для загрузки и очистки других страниц. В обратном вызове из jQuery.load,$("#loadedHere").createElement("a").url="foo" в результате я получил пустой URL, поэтому мне пришлось прибегнуть к созданию отдельного документа.

base>, какие браузеры стремятся:

function resolve(url, base_url) {
  var doc      = document
    , old_base = doc.getElementsByTagName('base')[0]
    , old_href = old_base && old_base.href
    , doc_head = doc.head || doc.getElementsByTagName('head')[0]
    , our_base = old_base || doc_head.appendChild(doc.createElement('base'))
    , resolver = doc.createElement('a')
    , resolved_url
    ;
  our_base.href = base_url || '';
  resolver.href = url;
  resolved_url  = resolver.href; // browser magic at work here

  if (old_base) old_base.href = old_href;
  else doc_head.removeChild(our_base);
  return resolved_url;
}

Вот jsfiddle, где вы можете поэкспериментировать с ним:http://jsfiddle.net/ecmanaut/RHdnZ/

 Hartator03 июл. 2013 г., 01:08
вахо, лучший ответ когда-либо. Я хочу, чтобы я мог проголосовать 10 раз.
 Oriol03 мар. 2016 г., 18:42
@AndreasDietrich Это потому, что вы не передаете никаких аргументовbase_url параметр, поэтому он становитсяundefined и является строковым"undefined", Вместо этого вы должны передать пустую строку. Или, если вы хотите сделать второй параметр необязательным, используйтеour_base.href = base_url || "" вместоour_base.href = base_url..
 John21 июл. 2013 г., 03:27
Помимо поддержки произвольных базовых URL-адресов, насколько именно это отличается от решения, представленного в вопросе? Это работает на IE 6?
 ecmanaut03 мар. 2016 г., 22:33
Хорошая идея, @Oriol - нет причин не иметь более дружелюбного поведения по умолчанию для людей, не передающих оба параметра. Интегрированная.
 ecmanaut22 авг. 2014 г., 03:27
@AmadeusDrZaius Не следует, но они могут быть, если хотите. Javascript добавляет автоматическую точку с запятой только в конце строки, если это не сделает следующую строку недопустимым. «, foo = 1» является синтаксической ошибкой, и, таким образом, весь оператор var вычисляется в натуральном выражении без вставки точки с запятой.

Я нашел на этомблог другой метод, который действительно выглядит как решение @bobince.

function canonicalize(url) {
    var div = document.createElement('div');
    div.innerHTML = "<a></a>";
    div.firstChild.href = url; // Ensures that the href is properly escaped
    div.innerHTML = div.innerHTML; // Run the current innerHTML back through the parser
    return div.firstChild.href;
}

Я нашел это немного более элегантным, не имеет большого значения.

function qualifyURL(url) {
    var a = document.createElement('a');
    a.href = url;
    return a.cloneNode(false).href;
}

(Протестировано с использованием IETester в режимах IE6 и IE5.5)

 Jay Taylor02 июн. 2017 г., 06:30
Лучший ответ ИМО. Так чисто, спасибо!

который предлагает использовать элемент изображения вместо якоря:

http://james.padolsey.com/javascript/getting-a-fully-qualified-url/

Это работает для надежного расширения URL, даже в IE6. Но проблема в том, что протестированные мною браузеры сразу же загрузят ресурс после установки атрибута image src - даже если вы установите в следующей строке src в null.

Я собираюсь дать решение Бобинса вместо этого.

которую я использую для разрешения основных относительных URL:

function resolveRelative(path, base) {
    // Absolute URL
    if (path.match(/^[a-z]*:\/\//)) {
      return path;
    }
    // Protocol relative URL
    if (path.indexOf("//") === 0) {
      return base.replace(/\/\/.*/, path)
    }
    // Upper directory
    if (path.indexOf("../") === 0) {
        return resolveRelative(path.slice(3), base.replace(/\/[^\/]*$/, ''));
    }
    // Relative to the root
    if (path.indexOf('/') === 0) {
        var match = base.match(/(\w*:\/\/)?[^\/]*\//) || [base];
        return match[0] + path.slice(1);
    }
    //relative to the current directory
    return base.replace(/\/[^\/]*$/, "") + '/' + path.replace(/^\.\//, '');
}

Проверьте это на jsfiddle:https://jsfiddle.net/n11rg255/

Он работает как в браузере, так и в node.js или других средах.

Это решение работает во всех браузерах.

/**
 * Given a filename for a static resource, returns the resource's absolute
 * URL. Supports file paths with or without origin/protocol.
 */
function toAbsoluteURL (url) {
  // Handle absolute URLs (with protocol-relative prefix)
  // Example: //domain.com/file.png
  if (url.search(/^\/\//) != -1) {
    return window.location.protocol + url
  }

  // Handle absolute URLs (with explicit origin)
  // Example: http://domain.com/file.png
  if (url.search(/:\/\//) != -1) {
    return url
  }

  // Handle absolute URLs (without explicit origin)
  // Example: /file.png
  if (url.search(/^\//) != -1) {
    return window.location.origin + url
  }

  // Handle relative URLs
  // Example: file.png
  var base = window.location.href.match(/(.*\/)/)[0]
  return base + url

Тем не менее, он не поддерживает относительные URL с ".." в них, как "../file.png".

 Teodors17 сент. 2017 г., 09:41
Это имеет некоторые проблемы. Например, вы предполагаете, что base такая же, как windows, и я не думаю, что это работает, если у меня есть url param в url. Сказать/img/profile.php?url=https://google.com/logo.svg.

url не начинается с '/'

Возьмите URL текущей страницы, отрежьте все, что осталось за последним '/'; затем добавьте относительный URL.

Иначе еслиurl начинается с '/'

Возьмите URL текущей страницы и отрежьте все справа от одиночного '/'; затем добавьте URL.

Иначе еслиurl начинается с # или?

Возьмите URL текущей страницы и просто добавьтеurl

Надеюсь, это работает для вас

 hallvors05 дек. 2012 г., 12:14
Вы также забыли синтаксис с точками относительно относительного ../../ (имеет ли значение это упущение или нет, зависит от того, для чего требуется вывод)
 Scott Wolchok07 мар. 2010 г., 07:19
Вы забыли, что URL-адреса могут начинаться с "//", что делает их относительными к схеме. //foo.com/bar/

URI.js кажется, чтобы решить проблему:

../foobar.html").absoluteTo("http://example.org/hello/world.html").toString()

Смотрите такжеhttp://medialize.github.io/URI.js/docs.html#absoluteto

Не проверено с IE6, но может быть полезно для других, ищущих общую проблему.

 y3sh20 авг. 2015 г., 17:19
На стороне узла вещей (для сканирования и т. Д.) Правильная библиотека здесь доступна черезnpm install URIjsа не другая библиотека с похожим названием
 Daniel Lizik19 сент. 2016 г., 19:56
названный пакет npm изменился наurijs github.com/medialize/URI.js#using-urijs

у меня такой вид работает ..

  function resolveURL(url, base){
    if(/^https?:/.test(url))return url; // url is absolute
    // let's try a simple hack..
    var basea=document.createElement('a'), urla=document.createElement('a');
    basea.href=base, urla.href=url;
    urla.protocol=basea.protocol;// "inherit" the base's protocol and hostname
    if(!/^\/\//.test(url))urla.hostname=basea.hostname; //..hostname only if url is not protocol-relative  though
    if( /^\//.test(url) )return urla.href; // url starts with /, we're done
    var urlparts=url.split(/\//); // create arrays for the url and base directory paths
    var baseparts=basea.pathname.split(/\//); 
    if( ! /\/$/.test(base) )baseparts.pop(); // if base has a file name after last /, pop it off
    while( urlparts[0]=='..' ){baseparts.pop();urlparts.shift();} // remove .. parts from url and corresponding directory levels from base
    urla.pathname=baseparts.join('/')+'/'+urlparts.join('/');
    return urla.href;
  }

когда вы используете innerHTML вместо методов DOM.

function escapeHTML(s) {
    return s.split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
}
function qualifyURL(url) {
    var el= document.createElement('div');
    el.innerHTML= '<a href="'+escapeHTML(url)+'">x</a>';
    return el.firstChild.href;
}

Немного некрасиво, но более кратко, чем «Сделай сам».

 djsmith13 дек. 2012 г., 21:57
Подтвердили работу в IE7.
 Oriol09 апр. 2016 г., 16:32
Этот подход заменяет нуль (U + 0000) на (U + FFFD), в соответствии сHTML спецификация.
 user21315406 июл. 2013 г., 21:40
 zachleat19 окт. 2009 г., 22:09
Этот метод отлично работает для меня! Спасибо за публикацию!
 Sebastien Lorber07 апр. 2014 г., 18:46
Я нашел это похожее решение в блоге, которому не нужен код для выхода:stackoverflow.com/a/22918332/82609

Ваш ответ на вопрос