Вопрос кажется мне несколько расплывчатым, поэтому вот что я интерпретирую (также из кода в fiddle-images в вашем вопросе):
- вы получаете
Blob
(двоичные данные изображения) через XMLHttpRequest()
GET
-запрос (responseType = 'blob'
)
- вы создаете
Blob URL
с URL.createObjectURL()
в URL Store
для XMLHttpRequest()
response
-объекта (Blob
содержит двоичные данные)
- вы устанавливаете результирующую
Blob URL
-строку как src
для изображения (и добавляете изображение к документу, тем самым показывая изображение, которое вы только что скачали)
- Вы «не хотите, чтобы это работало в новой вкладке» («я полагаю, что это
Blob URL
-строка»).
В своих комментариях вы говорите:
Мне кажется, что вы не хотите, чтобы пользователь мог просматривать/загружать большой двоичный объект, когда он копирует Blob URL
-строку (путем изучения живого источника или просто right-click-on-image>>Copy Imagelocation
) и вставляет ее в новый вкладка/окно (в качестве примера вы приводите youtube).
Но вы также говорите о видео.
TL;DR: кажется, что ваш вопрос/награда может смешивать 2 разных типа URL, возвращаемых window.URL.createObjectURL();
:
Blob URL
referencing (objects that represent) 'raw local data' (like (Local-)File, Blob, etc.)
For these you want to automatically (or programmatically) revoke the Blob URL
from the browser's URL Store
(which you could consider a simplified local webserver inside the browser, only available to that browser).
MediaSource object URL
referencing a special MediaSource Object
These URL's are
- only intended to link
src
of a HTMLMediaElement
(think <audo>
& <video>
elements) to the special MediaSource Object
Note: a new tab/window is not an HTMLMediaElement
- уже автоматически отозвано
Примечание: даже если они созданы с помощью window.URL.createObjectURL();
Вот что происходит со скрипкой на изображении вашего вопроса и аналогичным кодом, который загружает видео как Blob
(где вы загружаете данные/двоичный файл всего видеофайла на сервер с помощью xhr) или любой другие «локальные» данные:
вы по существу используете «голый» «нерасширенный» File-API.
URL Store
сохраняется только во время сеанса (поэтому он выдержит обновление страницы, поскольку это все тот же сеанс) и теряется при выгрузке документа.
Таким образом, если ваша скрипка все еще открыта, то fiddle-document (документ, который создал Blob URL
), очевидно, не еще не выгружен, и поэтому его Blob URL
s доступны для браузера (любая вкладка/окно) как до тех пор, пока он не будет отозван!
Это важная функция: вы можете создать/загрузить/изменить Blob
в браузере, создать Blob URL
и установить его как href
для ссылки для загрузки файла. (которое пользователь может щелкнуть правой кнопкой мыши и открыть в новой вкладке/окне!!)
Закрыть скрипка или отозвать Blob URL
из URL Store
, а Blob URL
больше не доступны (также не в другой вкладке/окне).
Попробуйте свои модифицированные скрипты: https://jsfiddle.net/7cyoozwv/
В этой скрипте больше не должно быть возможности загрузить образец изображения в другую вкладку/окно после того, как вы скопировали URL-адрес изображения (после того, как изображение отобразится на вашей странице).
Здесь я отозвал URL-адрес вручную. (revokeObjectURL()
), так как в настоящее время это лучший кросс-браузерный метод (частично из-за того, что API еще не полностью стабилизирован).
Также обратите внимание: событие onload
элемента может быть элегантным местом для отзыва вашего Blob URL
.
Вот что происходит с источником <audio>
или <video>
, связанным с MediaSource Object
с помощью MediaSource object URL
, возвращенного window.URL.createObjectURL(MediaSource)
:
The Расширения источников мультимедиа (MSE) также расширяют window.URL.createObjectURL()
File-API
, чтобы принимать MediaSource Object
. В (текущий вариант) расширения объекта URL указано, что:
Этот алгоритм предназначен для отражения поведения метода createObjectURL()[FILE-API] с параметром autoRevoke, установленным в значение true.
Обратите внимание, что текущая спецификация window.URL.createObjectURL()
File API
больше не имеет логический флаг autoRevoke
(или flag_oneTimeOnly
), доступный для программиста, который вместо этого должен использовать window.URL.createFor()
для этой цели. Интересно, когда спецификация Media-Source будет имитировать это (и для обратной совместимости псевдоним их createObjectURL()
для нового расширения createFor()
(кажется более подходящим, поскольку именно так он, по-видимому, и предназначен для работы в настоящее время)).
Эти результирующие автоматически аннулированные строки URL предназначены только для связи src
элемента HTMLMediaElement
(например, элементов <audo>
и <video>
) со специальным MediaSource Object
.
I не думайте, что пустой Document
(из новой вкладки/окна) является элементом <audo>
или <video>
.
Возможно, "Краткое руководство по MSE"(источник: MSDN) может помочь прояснить разницу и основное использование:
Чтобы использовать API MSE, выполните следующие действия:
- Определите элемент HTML5
video
в разделе HTML страницы.
- Создайте объект
MediaSource
в JavaScript.
- Создайте виртуальный URL-адрес, используя
createObjectURL
с объектом MediaSource
в качестве источника.
- Назначьте виртуальный URL свойству
src
видеоэлемента.
- Создайте
SourceBuffer
, используя addSourceBuffer
, с типом пантомимы видео, которое вы добавляете.
- Получите сегмент инициализации видео из медиафайла онлайн и добавьте его в
SourceBuffer
с помощью appendBuffer
.
- Получите сегменты видеоданных из медиафайла, добавьте их к
SourceBuffer
с помощью appendBuffer
.
- Вызовите метод
play
для элемента видео.
- Повторяйте шаг 7, пока не закончите.
- Очистить.
Вы (или такой крупный игрок, как YouTube, который будет динамически выбирать поддерживаемые технологии для воспроизведения на клиентской платформе (поэтому невозможно точно сказать, о каком URL-адресе видео на YouTube вы говорите)) можете em> использовать новый специальный MediaSource Object
для воспроизведения видео (или аудио).
Это добавляет параметры источника на основе буфера к видео HTML5 для поддержки потоковой передачи (по сравнению с загрузкой полного видеофайла перед воспроизведением или использованием надстройки, такой как Silverlight или Adobe Flash для потоковой передачи мультимедиа).
Надеюсь, это то, что вы искали!
person
GitaarLAB
schedule
07.04.2016