Javascript 设置后,在HTML中获取BASE,但不使用页面URL

Javascript 设置后,在HTML中获取BASE,但不使用页面URL,javascript,html,base,Javascript,Html,Base,构建HTML页面时,在php中动态设置基准: $base_line = '<base href="' . $some_path . '/" /> '; echo $base_line; $base\u line=''; echo$基线; 现在我在HTML页面中,我需要访问这些信息($some_path),搜索了几个小时后,我似乎没有找到答案。请注意,加载的HTML页面有一个与基无关的URL,我没有访问PHP代码来修改它。加载的页面可以有一个URL,如:,但页面中的所有其他链接都将

构建HTML页面时,在php中动态设置基准:

$base_line = '<base href="' . $some_path . '/" /> ';
echo $base_line;
$base\u line='';
echo$基线;
现在我在HTML页面中,我需要访问这些信息($some_path),搜索了几个小时后,我似乎没有找到答案。请注意,加载的HTML页面有一个与基无关的URL,我没有访问PHP代码来修改它。加载的页面可以有一个URL,如:,但页面中的所有其他链接都将基于基设置的值,因此我无法使用页面URL获取基

我想我可以抓取其中一个元素,比如一个图像,然后使用DOM对其进行剖析以找到基础,但应该有一种更简单的方法来实现这一点。有什么想法吗


在这种情况下,使用window.location不起作用,因为它将返回与加载的页面URL相关的内容,而不是其中设置为基础的内容。

如果您没有访问PHP的权限,可以尝试使用javascript
window.location.hostname

如果你想要像

http://www.example.com/blahblah/blah.html
这三件事都会发生作用

window.location.protocol = "http"
window.location.host = "example.com"
window.location.pathname = "blahblah/blah.html"

var url = window.location.protocol + "://" + window.location.host + "/" + window.location.pathname;

您可以在这里查看基本url函数

更新3

正如@jorgecasar所提到的,现在每个
节点上都有一个属性,
baseURI
(包括每个
元素)

调用
document.baseURI
将获得页面的基本路径,并考虑
标记

请注意,这是所有现代浏览器都支持的最新ish属性,但如果您使用的是较旧的浏览器,您可能希望坚持使用较旧的答案,或者确保有一个poly或ponyfill(Babel的标准polyfill似乎包括一个,尽管我找不到具体的文档这么说)

另外,请注意,
document.baseURI
将为您提供完全限定的绝对路径,而从
获取
href
属性将为您提供准确的值,因此这两个属性的用法可能略有不同


原创

如果要获取基本元素的值,可以执行以下操作:

var baseHref = document.getElementsByTagName('base')[0].href
或者更安全一点:

var bases = document.getElementsByTagName('base');
var baseHref = null;

if (bases.length > 0) {
    baseHref = bases[0].href;
}

更新:更简洁的方法是:

const baseHref = (document.getElementsByTagName('base')[0] || {}).href;
baseHref
如果没有
,则可能为空


更新2:不要使用
getElementsByTagName()
,而是使用
querySelector()

var base=(document.querySelector('base')| |{}).href;
控制台日志(基本)
如果您使用的是jqLite(angularjs默认值),则代码如下所示:

base = angular.element(document.querySelector('base')).attr('href')

有关更多详细信息,请参阅。

不需要jquery、jqlite或过时的API。使用较新的
querySelector
API:

var base = document.querySelector('base');
var baseUrl = base && base.href || '';

我遇到的一个问题是,使用
element.href
无法准确返回设置的内容。例如,如果您有:

<base href="/some/sub/directory/" />
我发现使用jQuery
attr
函数可以避免这种情况:

$("base").attr("href")
# /some/sub/directory/
document.getElementsByTagName('base')[0].getAttribute("href")
# /some/sub/directory/
如果要避免使用jQuery,还可以使用
getAttribute
函数:

$("base").attr("href")
# /some/sub/directory/
document.getElementsByTagName('base')[0].getAttribute("href")
# /some/sub/directory/

每个节点都有一个只读属性,该属性返回绝对基本URL,如果无法获取绝对URI,则返回null

要获取文档的基本URL,可以使用:
document.baseURI

如果只需要路径名或URL的任何其他部分,则可以创建对象:


您是否尝试过
document.getElementsByTagName('base')
?在任何情况下,
BASE
都是您应该尽量避免的。它在各种浏览器中都有奇怪的效果,包括尝试从基本位置和非基本位置加载JS两次。我不知道这将如何告诉您基本位置。@Alien,这将返回页面的基本位置,而不是基本位置。@Alien,我知道这可能会让人困惑,但是我尝试了:我想要的是当前页面头部设置的基,而不是页面URL的基。您可以加载一个页面,但将该页面中的base设置为,并使test.php中的所有相关链接都由设置为base的内容提供服务。我希望这能澄清问题:-)您能补充一些解释吗?但解决方案提供的用途比完成如此简单的任务需要角度更好。即使在应用程序中使用angular,该解决方案也能正常工作,就像所有的vanilla js解决方案一样:)如果使用angular,则使用angular的方式更简洁:
base=$document.find('base').attr('href')
,我只需为
分配一个id,然后
document.getElementById('myBase')).href
@Blaise为什么要添加额外的不必要的HTML?我更新了答案,加入了有关
baseURI
的信息。最近我自己也在使用它。@samanime你可以像添加链接一样添加一个指向答案的链接。谢谢