<iframe>中的srcdoc =“…”和src =“ data:text / html,…”之间有什么区别?


72

例如,这是它们之间的区别:

<iframe srcdoc="<p>Some HTML</p>"></iframe>
<iframe src="data:text/html,<p>Some HTML</p>"></iframe>

演示版

并且,如果它们完全相同,为什么HTML5会添加srcdoc属性?

编辑

也许我还不够清楚。我不是比较srcsrcdoc,但src使用text / html的数据URI用srcdoc

然后,如果功能图是这样的

                   | src属性| srcdoc属性
 -------------------------------------------------- ------------------
  网址| 是的 不使用src(*)
  HTML内容| 是的,使用数据URI | 是

为什么srcdoc需要?


(*)注意

似乎srcdoc可以使用带有属性的子框架通过URL(Demo)加载页面src

<iframe srcdoc="<iframe src='http://microsoft.com'></iframe>"></iframe>

Answers:


47

其他答案列出了一些表面上的差异,但实际上错过了关键差异的标记,该差异解释了为什么浏览器/规范编写者将本质上复制已经存在的内容:

<iframe src="data:...untrusted content" sandbox /><-在现代浏览器中是安全的,在没有沙箱支持的旧版浏览器中是不安全的

<iframe srcdoc="...untrusted content" sandbox /><-在现代浏览器中是安全的,在旧版浏览器中是安全的(尽管不起作用)

这种新语法为内容作者提供了一种保护其用户的方法,即使他们可能正在使用旧版浏览器也是如此。没有它,内容作者将根本不愿使用沙盒功能,也看不到它的用途。


如果主要好处是不受信任的内容,为什么还要指定它包含内联内容-大多数不受信任的内容不是来自外部URL吗?即,为什么不sandboxedsrc采用[data] URI的属性呢?(这还可以避免将来的某些浏览器在不实现沙箱的情况下实现srcdoc)。
贝尼·切尔尼亚夫斯基-帕斯金

因为作者已经可以使用外部URL(在单独的域上)来提供不受信任的内容。
Fabio Beltramini 2015年

您所说的安全是什么意思?它无法访问嵌入页面?嵌入的收款人无法访问它?或两者?还是什么
Gregory Magarshak

否则,在常规div或HTML组件上的意义是什么
Gregory Magarshak

iframe的“沙盒”上的任何文章都将讨论其提供的好处
Fabio Beltramini,

18

从MDN:

1.嵌入式上下文要包含的页面内容。该属性应与沙箱和无缝属性一起使用。如果浏览器支持srcdoc属性,它将覆盖src属性中指定的内容(如果存在)。如果浏览器不支持srcdoc属性,它将显示src属性中指定的文件(如果存在)。

因此,srcdoc属性将覆盖使用src属性嵌入的内容。

演示版


另外,您对以下代码段data:text/html所说的称为数据URI,它有局限性。

2.数据URI不能大于32,768个字符。

1. MDN2。MSDN


“因此,该srcdoc属性将覆盖使用src属性嵌入的内容。” 显然不是在Firefox 24中,我看到了两个带有Microsoft网站的iframe。
Marcel Korpel 2013年

@MarcelKorpel支持的Firefox的第一个版本srcdoc是25(developer.mozilla.org/en-US/docs/Web/HTML/Element/…
Oriol

1
@MrAlien关于数据URI的长度限制的要点,这与没有限制的html属性不同。无论如何,该限制似乎是由Microsoft实施施加的,因为MDN没有说明任何限制,而RFC标准仅说“请注意,某些使用URL的应用程序可能会施加长度限制
Oriol

@MarcelKorpel对无缝属性和其他较新的html5属性进行了分析,您将了解为什么需要srcdoc
Alien先生

@Oriol谢谢,是的,mdn没有指定任何限制,但是aamsure uri确实有限制
Alien先生

15

src具有HTML内容属性的iframe是跨域的,

但是srcDoc具有HTML内容属性的iframe不是跨域的


2
很好,Chrome将数据URI视为跨域。Firefox将它们视为相同来源,不确定Edge会做什么。
Oriol

1
您所说的“非跨域”是什么意思?
Gregory Magarshak

1
@GregoryMagarshak“非跨域”,表示iframe内容将被视为与父页面来自同一域。因此,它不会受到浏览器同源策略的限制,该策略通常会阻止浏览器访问远程页面的内容,就像使用src ='some-url.com'时一样。developer.mozilla.org/en-US/docs/Web/Security/...
佐尼为什么

13

撰写本文时-Chrome(v36)中的srcdoc允许设置和提取cookie,而将src与数据URL结合使用不能:

未捕获的SecurityError:无法从“文档”中读取“ Cookie”属性:在“数据:” URL中禁用了Cookie

这对您可能并不重要,但可能会排除我正在构建的应用程序中数据URL的使用,这很可惜,因为IE当然当前不支持srcdoc(v11)。


1
好点子。数据URI在某些浏览器中有限制,因此srcdoc在这些情况下效果更好。
Oriol

在Chromium 81中,父框架的背景和字体样式也级联到iframe中,从而增加了更多实用程序。
乔什·哈布达斯

7

另一个明显的区别是srcdata-uri属性支持URI百分比编码规则,srcdoc但不支持常规html语法,

这些来源将产生不同的结果:

<iframe srcdoc="<p>hello%20world</p><h1>give%0D%0Ame%0D%0Asome%24</h1>"></iframe>

<iframe src="data:text/html;charset=UTF-8,<p>hello%20datauri<p><h1>give%0D%0A me%0D%0Asome%24</h1>"></iframe>

我还注意到属性值内的js脚本解析有所不同(它可能不只是百分比编码),但还没有弄清楚规则……


的内容src必须经过URL编码才能正确处理。有关如何执行此操作的详细信息,请参见此问题
用户

我在大型文本文件上没有很多运气URI编码属性值。对我有用的是事先在bash中使用recode(1)清理输入。
乔什·哈布达斯

0

在您的示例中,这两种形式在功能上是相同的。但是,您可以同时使用srcsrcdoc属性,从而允许非HTML5浏览器使用该src版本,而HTML5浏览器可以将该srcdoc版本与sandboxseamless属性一起使用,从而在处理iFrame时提供了更大的灵活性。


但是sandboxseamless属性可以用也可以使用src属性,他们不能?在我看来,它srcsrcdoc
Oriol 2013年

@Oriol,我认为我的回答直接说明了为什么这很重要,而不是缺陷,而是特征
Fabio Beltramini

-3

srcdoc:嵌入上下文要包含的页面内容。该属性应与沙箱和无缝属性一起使用。如果浏览器支持srcdoc属性,它将覆盖src属性中指定的内容(如果存在)。如果浏览器不支持srcdoc属性,它将显示src属性中指定的文件(如果存在)。

src:要嵌入的页面的URL。


6
但是src属性也可以使用数据URI包含页面的HTML内容
Oriol 2013年

-4

主要区别在于'src'属性包含要嵌入标签中的文档的地址。

另一方面,“ srcdoc”属性包含要在嵌入式框架中显示的页面的HTML内容。

srcdoc的主要缺点是并非所有浏览器都支持它,而src与所有浏览器都兼容。

有关详细说明,请访问以下链接:https : //developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe


6
但是src属性也可以使用数据URI来包含页面的HTML内容
Oriol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.