Необязательный baseURI (местоположение) в DOMParser? - PullRequest
2 голосов
/ 19 марта 2019
// html data loaded from [http://example.org/some/path]
let htmlSource = `<!DOCTYPE html><html><head></head><body>
 ... <a href="relative"></a> ... 
</body></html>`;

const dom = new DOMParser().parseFromString(htmlSource, 'text/html');

// this returns the value of the attribute as is
dom.links[0].getAttribute('href'); // -> "relative" / nothing new here

// this should resolve urls
dom.links[0].href // -> wait, relative to WHAT??

// if you run this code while being on [http://google.com] you'll get
dom.links[0].href // -> "https://www.google.com/relative"

// Also,

dom.location // -> null / you can't change it

dom.baseURI // -> "https://www.google.com/" / read-only

Похоже, DOMParser неявно заставляет использовать текущую страницу location как baseURI для новых HTMLDocument.

Почему бы не дать разработчику возможность (третий аргумент?) Явно указать местоположение документа?

Есть ли способ заставить DOMParser уважать необязательный базовый URL? Обходные?

1 Ответ

4 голосов
/ 10 апреля 2019

Вы должны использовать тег base внутри HTML-кода, вы даже можете добавить его динамически.Вот ваш пример:

const htmlSource = `
<!DOCTYPE html>
<html>
 <head>
  <base href="https://www.example.com/">
 </head>
 <body>
  <a href="relative"></a>
 </body>
</html>`;

const dom = new DOMParser().parseFromString(htmlSource, 'text/html');
console.log('DOM link ->', dom.links[0].href);

Будет выводить:

DOM link -> https://www.example.com/relative

Добавить динамически:

let baseEl = dom.createElement('base');
baseEl.setAttribute('href', 'https://www.example.com');
dom.head.append(baseEl);
...