首页 > 解决方案 > JavaScript - 检查是否使用了对象 URL

问题描述

我可以像这样创建一个对象 URL:

let pixel = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
let data = atob(pixel);
let buffer = new ArrayBuffer(data.length);
let array = new Uint8Array(buffer);
for (var i = 0;i<data.length;i++){
    array[i]=data.charCodeAt(i);
}
let blob = new Blob([buffer], {type: 'image/jpeg'});
let url = URL.createObjectURL(blob);

我可以像这样撤销对象 URL:

URL.revokeObjectURL(url);

但我想做的是在使用一次后自动撤销 URL。

有没有办法检查对象 URL 是否已被访问?

先感谢您。

编辑:

在这种情况下,我不能只在使用 URL 时触发一个函数。相反,我希望能够检查它是否已在页面之外使用。一个例子是,如果有人在地址栏中键入 URL,这不能调用 javascript AFAIK。

标签: javascripthtmlbrowsercreateobjecturlrevokeobjecturl

解决方案


如果您没有 API 来执行此操作,您可以使用它localStorage来跟踪它。

你可以有两种方法,

  • addUrlStatus- 它将一个 url 作为输入并检查它是否在过去被访问过。

  • updateUrlStatus- 一旦用户使用了 url,就会将 url 的状态设置为truein localStorage(不确定在您的代码中定义的操作是什么)。

所以你可以做类似的事情,


let pixel = "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==";
let data = atob(pixel);
let buffer = new ArrayBuffer(data.length);
let array = new Uint8Array(buffer);
for (var i = 0;i<data.length;i++){
    array[i]=data.charCodeAt(i);
}
let blob = new Blob([buffer], {type: 'image/jpeg'});
let url = URL.createObjectURL(blob);
addUrlStatus(url);


function addUrlStatus(url) {
  var _url = localStorage.getItem(url);
  if(!_url) {
    localStorage.setItem(url, false); // false indicates it hasn't been used yet.
    return;
  }
}


// this function needs to be called when the user has used the url.
function updateUrlStatus(url) {
  localStorage.setItem(url, true);
  URL.revokeObjectURL(url);
}


推荐阅读