这个问题对我来说似乎有些模糊,所以这是我的解释(也来自您问题中的小提琴图像中的代码):
- 您通过-request ( )接收
Blob
(图像的二进制数据)XMLHttpRequest()
GET
responseType = 'blob'
- 您在for -object中创建一个
Blob URL
with (保存二进制数据)URL.createObjectURL()
URL Store
XMLHttpRequest()
response
Blob
- 您将生成的
Blob URL
-string设置src
为图像(并将图像附加到文档中,从而显示您刚刚下载的图像)
- 您“不希望它在新选项卡中工作”(“it”是
Blob URL
我假设的 -string)。
在您的评论中,您说:
在小提琴中,我检查了图像并复制了 src,然后将其粘贴到新选项卡中,它可以正常工作并显示图像我不希望图像直接与 blob url 一起显示。
如果你去 youtube 并在新标签中打开视频的 src :它不会工作,我希望这发生
在我看来,您不希望用户在复制 -string 时能够查看/下载 blob Blob URL
(通过检查实时源或简单地right-click-on-image>>Copy Imagelocation
)并将其粘贴到新的选项卡/窗口中(您为此提供 youtube举个例子)。
但你也在谈论视频。
TL;DR:您的问题/赏金似乎混合了由以下返回的 2 种不同类型的 URL window.URL.createObjectURL();
:
这是您的问题图像中的小提琴和下载视频的类似代码Blob
(您使用 xhr 在服务器上下载整个视频文件的数据/二进制文件)或任何其他“本地”数据的情况:
您实际上是在使用'裸''未增强' File-API。
仅在URL Store
会话期间维护(因此它将在页面刷新后继续存在,因为它仍然是同一会话)并在文档卸载时丢失。
所以,如果你的 fiddle 仍然打开,那么 fiddle-document(创建 的文档Blob URL
)显然还没有被卸载,因此Blob URL
只要它没有被撤销,它就可以用于浏览器(任何选项卡/窗口)!
这是一个相关功能:您可以在浏览器中构建/下载/修改 a Blob
,创建 aBlob URL
并将其设置为href
文件下载链接(用户可以右键单击并在新选项卡/窗口中打开!!)
关闭小提琴或Blob URL
从 the撤消 theURL Store
和 theBlob URL
不再可访问(也不在不同的选项卡/窗口中)。
尝试使用修改后的小提琴: https
://jsfiddle.net/7cyoozwv/
在这个小提琴中,现在应该不再可以在复制图像 url 后将示例图像加载到不同的选项卡/窗口中(一旦图像显示在您的页面中)。
在这里,我手动撤销了 URL ( revokeObjectURL()
),因为它是目前最好的跨浏览器方法(部分原因是 api 尚未完全稳定)。
另请注意:元素的onload
事件可以是撤销您的Blob URL
.
以下是链接到使用返回的<audio>
<video>
MediaSource Object
MediaSource object URL
window.URL.createObjectURL(MediaSource)
an的或源发生的情况:媒体源扩展 (MSE) 还扩展了File-API
'window.URL.createObjectURL()
以接受MediaSource Object
. URL 对象扩展的(当前草案)指定:
该算法旨在反映 autoRevoke 设置为 true 的 createObjectURL()[FILE-API] 方法的行为。
请注意,File API
's的当前规范window.URL.createObjectURL()
不再具有可供程序员访问的autoRevoke
(或flag_oneTimeOnly
)布尔标志,而应该将其window.URL.createFor()
用于此目的。我想知道 Media-Source 规范何时会模仿这一点(并且为了向后兼容将它们别名createObjectURL()
为新的createFor()
扩展名(似乎更合适,因为这似乎是它目前的工作方式))。
这些生成的自动撤销的 URL 字符串仅用于将src
a HTMLMediaElement
(think <audo>
& <video>
elements) 链接到特殊的MediaSource Object
.
我不认为一个空的Document
(来自一个新的选项卡/窗口)是一个<audo>
or<video>
元素。
也许“关于 MSE 的快速教程” (来源:MSDN)可能有助于阐明区别和基本用法:
要使用 MSE API,请执行以下步骤:
video
在页面的 HTML 部分中定义一个 HTML5元素。
MediaSource
在 JavaScript 中创建一个对象。
createObjectURL
使用MediaSource
对象作为源创建一个虚拟 URL 。
- 将虚拟 URL 分配给视频元素的
src
属性。
- 使用您要添加的视频的 mime 类型创建
SourceBuffer
using 。addSourceBuffer
- 从在线媒体文件中获取视频初始化片段,并将其添加到
SourceBuffer
with appendBuffer
.
- 从媒体文件中获取视频数据的片段,将它们附加到
SourceBuffer
with appendBuffer
。
- 调用
play
视频元素上的方法。
- 重复步骤 7 直到完成。
- 清理。
您(或像 youtube 这样的大玩家,他们将动态选择支持的技术在客户端平台上播放(因此无法确定您在谈论哪种 youtube 视频 URL))可能正在使用新的特殊功能MediaSource Object
播放视频(或音频)。
这为 HTML5 视频添加了基于缓冲区的源选项以支持流式传输(与在播放之前下载完整的视频文件或使用 Silverlight 或 Adobe Flash 等插件流式传输媒体相比)。
希望这就是你所追求的!