сделать относительный URL-адрес абсолютным, используя произвольный корень в JavaScript - PullRequest
5 голосов
/ 10 мая 2011

Предполагается, что я нахожусь на странице в другом домене (mydomain.com) и что относительный URL-адрес существует только в коде (но не в DOM)

Как мне полностью объединить два произвольных URL в javascript?

var a = 'http://example.com/some/path/';
var b = '../other/path/';
var c = magicUrlCombine(a,b);
assert(c == 'http://example.com/some/other/path/');

Это также должно работать для

var a = 'http://example.com/some/path/';
var b = 'http://pink-unicorns.com/some/other/path/';
var c = magicUrlCombine(a,b);
assert(c == 'http://pink-unicorns.com/some/other/path/');

EDIT:

Я ищу совершенно общую функцию для объединения абсолютного URL с произвольным URL. Та же логика, что и в браузере, используется для разрешения ссылок, но для URL, которых нет в HTML-коде страницы и / или нет относительно текущего местоположения. Href.

var a = 'http://example.com/a/b/c/';
var b = '../d/e/';
assert(c == 'http://example.com/a/b/d/e/')

OR

var b = '/f/g/';
assert(c == 'http://example.com/f/g/')

OR

var b = 'http://jquery.com/h/i/';
assert(c == 'http://jquery.com/h/i/')

РЕДАКТИРОВАТЬ 2:

node.js имеет модуль url , который имеет правильную функциональность, но я не нашел хорошего способа использовать его на стороне клиента. ( как использовать модульную систему node.js на стороне клиента )

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

Ответы [ 5 ]

2 голосов
/ 03 апреля 2015

Я использовал на стороне сервера, используя NodeJS,

var url = require('url');
url.resolve(from, to);

в вашем случае:

var a = 'http://example.com/some/path/';
var b = '../other/path/';
var c = url.resolve(a, b);
assert(c == 'http://example.com/some/other/path/');

var a = 'http://example.com/some/path/';
var b = 'http://pink-unicorns.com/some/other/path/';
var c = url.resolve(a, b);
assert(c == 'http://pink-unicorns.com/some/other/path/');
2 голосов
/ 07 июля 2011

JQuery Mobile имеет его

$. Mobile.path.makeUrlAbsolute (relPath, absPath)

console.log($.mobile.path.makeUrlAbsolute('../d/e/', 'http://example.com/a/b/c/'));
console.log($.mobile.path.makeUrlAbsolute('/f/g/', 'http://example.com/a/b/c/'));
console.log($.mobile.path.makeUrlAbsolute('http://jquery.com/h/i/', 'http://example.com/a/b/c/'));

все дают ожидаемые результаты

1 голос
/ 10 мая 2011

Это возможное, но не проверенное решение:

function magicCombine(a,b){
    if(b.indexOf('://') != -1) return b;

    var backs = 0;
    var lastIndex = b.indexOf('../');

    while(lastIndex != -1){
        backs++;
        lastIndex = b.indexOf('../', lastIndex+3);
    }

    var URL = a.split('/');
    //Remove last part of URL array, which is always either the file name or [BLANK]
    URL.splice(URL.length-1, 1)

    if(b.substr(0,1) == '/')
        b = b.substr(1);
    var toAdd = b.split('/');

    for(var i = 0, c = toAdd.length-backs; i < c; ++i){
        if(i < backs)
            URL[URL.length - (backs-i)] = toAdd[backs+i];
        else
            URL.push(toAdd[backs+i]);
    }

    return URL.join('/');
}

Должен позаботиться об обоих случаях ...

1 голос
/ 10 мая 2011

Я предположил, что понял вопрос, но моя скрипка возвращает два ложных. Примеры не очевидны

http://jsfiddle.net/mplungjan/z5SUn/

function magicUrlCombine(a,b) {
  var linkA = document.createElement('a');
  linkA.href = a;
  var linkB = document.createElement('a');
  linkB.href = b;
  return linkB.href.replace(linkB.host,linkA.host)
}
1 голос
/ 10 мая 2011

Не устоял перед решением проблемы

var magicUrlCombine = function(a,b){
   return (a + b).replace(/[\w\-\.]+\/..\/|\:\/\/[\w\-\.\/]+http/g,'');
}

работает как для тестовых случаев, так и для комбинаций двух

http://jsfiddle.net/8HLeQ/2/

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