为什么script.src像它一样工作?

rzy*_*mek 6 javascript browser

我找不到任何关于标签src属性的文档或规范script.

浏览器操纵该属性的值,它始终反映绝对URI.让我们考虑以下示例:

域: https://example.com

脚本标签: <script src="/path/a/b/c.js"></script>

script.getAttribute("src")
> /path/a/b/c.js
script.src
> https://example.com/path/a/b/c.js

正如你所看到的,src和之间有区别getAttribute("src").

我想知道在哪里可以找到它的详细信息(文档/规范/浏览器实现的源代码).

浏览器(包括移动设备)对此功能的支持是什么?

jfr*_*d00 5

我在HTML5规范中找到了它:

首先有这个,讨论的.src属性的<script>标签:

IDL属性src,type,charset,defer,每个都必须反映相同名称的相应内容属性.

然后,如果您按照该规范中的链接查看"反映"的含义,则可以执行以下操作:

如果反射IDL属性是DOMString属性,其内容属性被定义为包含一个URL,然后在获取时,该IDL属性必须解决的内容属性的值相对于元素,并返回结果的绝对URL,如果这是成功的,或否则为空字符串; 在设置时,必须将content属性设置为指定的文字值.如果content属性不存在,则IDL属性必须返回默认值(如果content属性有一个),否则返回空字符串.

因此,要以一个简短的形式描述:如果您设置.src属性(或任何其他属性采用URL),那么您设置的确切内容将存储为属性.获取.src属性后,返回的值是在相对于基URL解析属性后生成的绝对URL.

至于.getAttribute(),那里的规范就在这里.它只是说:

按名称检索属性值.

回报价值

DOMString | Attr值作为字符串,如果该属性没有指定或默认值,则为空字符串.

值得注意的是,此描述中没有任何与URL属性在直接读取其属性时具有的特殊行为相关的任何内容,如上所述.因此,使用.getAttribute()没有那种特殊的"反映"行为.它只返回属性的原始值,没有特殊getter行为.


这是一种预期的行为,并且这种方式已经很长时间了.还有针对描述该行为的特定浏览器的特定开发人员网站.

.src无论您在HTML中或通过Javascript分配了什么,读取属性始终会返回完全限定的URL.

读取相同的属性,.getAttribute("src")返回HTML中的内容.

Microsoft记录IE在这方面的行为如何在这里以IE8作为属性开始的任何标记.

Mozilla的Firefox的文件在这方面对图像的行为在这里.

图像演示(尽管具有src或href属性的所有类型的标签似乎具有相同的行为(包括<script>标签):

var t = document.getElementById("target");
log("target.getAttribute('src') = ", target.getAttribute('src'));
log("target.src = ", target.src);
Run Code Online (Sandbox Code Playgroud)
<head>
  <script src="http://files.the-friend-family.com/log.js"></script>
  <base href="http://dummyimage.com">
</head>
<img id="target" src="/200x100/000/fff">
Run Code Online (Sandbox Code Playgroud)

事实上,这是一个利用这个事实的小实用程序:

function makeAbsolute(uri) {
    var a = document.createElement("a");
    a.href = uri;
    return a.href;
}

var x = makeAbsolute("test.html");
document.write(x);
Run Code Online (Sandbox Code Playgroud)