Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么时候调用URL.revokeObjectURL安全?_Javascript_Html - Fatal编程技术网

Javascript 什么时候调用URL.revokeObjectURL安全?

Javascript 什么时候调用URL.revokeObjectURL安全?,javascript,html,Javascript,Html,如果我理解正确,createObjectURL将创建一个表示文件或blob的URL。因为URL只是一个字符串,浏览器无法知道您何时使用完URL所代表的资源,因此提供了一个URL.revokeObjectURL函数 MDN显示: 所以有一些问题 在分配newImg.src后立即更改代码以撤销URL是否安全 var canvas = document.getElementById("canvas"); canvas.toBlob(function(blob) { var newImg = do

如果我理解正确,createObjectURL将创建一个表示文件或blob的URL。因为URL只是一个字符串,浏览器无法知道您何时使用完URL所代表的资源,因此提供了一个
URL.revokeObjectURL
函数

MDN显示:

所以有一些问题

  • 在分配
    newImg.src
    后立即更改代码以撤销URL是否安全

    var canvas = document.getElementById("canvas");
    
    canvas.toBlob(function(blob) {
      var newImg = document.createElement("img");
      var url = URL.createObjectURL(blob);
    
      newImg.src = url;
      // no longer need to read the blob as it's assigned to newImg.src
      URL.revokeObjectURL(url);
      document.body.appendChild(newImg);
    });
    
    我猜答案是“否”,因为
    newImg.src=url上可能没有任何内容。此时它仍然只是一个字符串,在当前JavaScript事件退出之前将一直如此。还是这样

  • 撤销URL是否有效/合法/正确,但在知道它被其他对象引用的情况下仍然使用它

    var canvas = document.getElementById("canvas");
    
    canvas.toBlob(function(blob) {
      var newImg = document.createElement("img");
      var url = URL.createObjectURL(blob);
    
      newImg.onload = function() {
        // no longer need to read the blob so it's revoked
        URL.revokeObjectURL(url);
    
        // Use the URL again even though it's revoked
        var newImg2 = new Image():
        newImg2.src = url; 
      };
    
      newImg.src = url;
      document.body.appendChild(newImg);
    });
    
    在本例中,我正在分配
    newImg2.src=url
    ,即使我已经撤销了url。其想法是,
    newImg
    仍在引用blob URL,因此可以说

    someImage.src = someOtherImage.src
    
    随时都可以。是吗


  • 好吧,按照@adeneo的建议,我测试了这个

    $('test')。关于('change',函数(e){
    var newImg=document.createElement(“img”);
    var url=url.createObjectURL(e.target.files[0])
    console.log(url);
    newImg.src=url;
    revokeObjectURL(URL);
    文件.正文.附件(newImg);
    console.log(url);
    });
    $('#test3')。关于('change',函数(e){
    var newImg=document.createElement(“img”);
    var url=url.createObjectURL(e.target.files[0])
    console.log(url);
    newImg.src=url;
    newImg.onload=函数(){
    revokeObjectURL(URL);
    文件.正文.附件(newImg);
    var i=新图像();
    i、 src=newImg.src;
    文件.正文.附件(一);
    setTimeout(函数(){
    var g=新图像();
    g、 src=newImg.src;
    文件.正文.附件(g);
    }, 3000);
    }
    });
    
    
    使用前测试




    测试使用撤销使用


    1。可能不会,因为浏览器必须将URL解析为图像,这需要时间。2.
    newImg.src
    不再是您的“旧”blob URL,它只是一个(数据)URL,就像来自任何其他来源一样。因此,“原始”已被撤销(并因此被移交给垃圾收集)不会以任何方式影响您在这里所做的事情。在我们有需要显示图像(通过src)的图像之前,您不能这样做吗?我们不应该称为“撤销”?我在将blob设置为
    img
    src之后撤销了它,一切都很好。在我将blob设置为
    background image
    css属性后,我撤销了它,一切都不好!使用了Firefox。如果您在撤销之前使用URL,我希望imgs可以正常工作,但如果您在撤销之后尝试使用URL,则imgs不会正常工作。
    someImage.src = someOtherImage.src