Javascript-使用Iframe下载文件,然后将其删除

Javascript-使用Iframe下载文件,然后将其删除,javascript,iframe,Javascript,Iframe,我想做的是: 将新的iframe附加到主体并使用它下载文件 下载文件后删除iframe 我读了几篇文章,得出了以下代码: let fileHref = baseLocation + '/excelexports/' + fileName; var iframe = document.createElement('iframe'); iframe.style.display = "none"; iframe.src = fileHref; iframe.onload = function() {

我想做的是:

  • 将新的iframe附加到主体并使用它下载文件
  • 下载文件后删除iframe
  • 我读了几篇文章,得出了以下代码:

    let fileHref = baseLocation + '/excelexports/' + fileName;
    var iframe = document.createElement('iframe');
    iframe.style.display = "none";
    iframe.src = fileHref;
    iframe.onload = function() {
        this.parentNode.removeChild(this);    
    };
    document.body.appendChild(iframe);
    

    问题是下载文件后,
    onload
    回调没有启动…

    根本不需要使用iframe。只需重定向到下载url。url中的标题将阻止浏览器将其作为页面加载,从而不会破坏当前页面

    let fileHref = baseLocation + '/excelexports/' + fileName;
    window.location.href  = fileHref ;
    

    根本不需要使用iframe。只需重定向到下载url。url中的标题将阻止浏览器将其作为页面加载,从而不会破坏当前页面

    let fileHref = baseLocation + '/excelexports/' + fileName;
    window.location.href  = fileHref ;
    

    您可以只使用HTML5下载属性。例如
    或者,如果您需要javascript引擎来执行此操作

    let fileHref = baseLocation + '/excelexports/' + fileName;
    var anchor = document.createElement('a');
    anchor.setAttribute("download", true);
    anchor.setAttribute("href", fileHref);
    anchor.click();
    
    如果您使用单击来运行此javascript,您甚至可以将事件传递给更具侵入性的弹出窗口阻止程序,以帮助将您的下载识别为用户操作

    someElem.addEventListener('click', function(evt){
        let fileHref = baseLocation + '/excelexports/' + fileName;
        var anchor = document.createElement('a');
        anchor.setAttribute("download", true);
        anchor.setAttribute("href", fileHref);
        anchor.dispatchEvent(evt);
    });
    
    资料来源:

    您可以使用HTML5下载属性。例如
    或者,如果您需要javascript引擎来执行此操作

    let fileHref = baseLocation + '/excelexports/' + fileName;
    var anchor = document.createElement('a');
    anchor.setAttribute("download", true);
    anchor.setAttribute("href", fileHref);
    anchor.click();
    
    如果您使用单击来运行此javascript,您甚至可以将事件传递给更具侵入性的弹出窗口阻止程序,以帮助将您的下载识别为用户操作

    someElem.addEventListener('click', function(evt){
        let fileHref = baseLocation + '/excelexports/' + fileName;
        var anchor = document.createElement('a');
        anchor.setAttribute("download", true);
        anchor.setAttribute("href", fileHref);
        anchor.dispatchEvent(evt);
    });
    
    资料来源:

    onload用于DOM加载,它对文件下载状态一无所知。简单的解决方案是根本不删除iframe。如果您需要再次使用它,请仅在该id不存在的情况下使用该id创建它,从而确保您只执行一次。下载时没有此类事件。@AlexK。你的正确和错误同时出现,DOM加载是正确的,但是下载启动后,您不需要下载状态。浏览器已连接,可以删除iframe。但是,正确的地方在于知道iframe是否触发下载是不可能的,因为iframe onload不会触发,因为它没有通过负责下载的浏览器引擎加载页面触发JavaScriptById(“隐藏的”iframe”);如果(!ifr)ifr=createIFrameFunc();ifr.src=…;onload用于DOM加载,它对文件下载状态一无所知。简单的解决方案是根本不删除iframe。如果需要再次使用它,请仅在该id不存在的情况下使用id创建它,从而确保只执行一次。对于下载,不存在此类事件。@AlexK。您的正确和错误在同时,DOM加载是正确的,但是下载启动后您不需要下载状态。浏览器已连接,并且可以删除iframe。但是,正确的地方在于知道iframe是否触发下载是不可能的,因为iframe onload不会启动,因为它没有通过浏览器引擎respon加载页面触发JavaScriptById是可能的,但问题是我用许多iframe使dom变得混乱:{所以只创建一个:
    var ifr=document.getElementById(“隐藏的iframe”);if(!ifr)ifr=createIFrameFunc();ifr.src=…;
    让我使用iframe的问题是,在您的解决方案中,adblocker可以阻止该调用,我想通过它that@omriman12如果不是由用户操作事件触发,大多数弹出窗口拦截器只会阻止该调用。现在,大多数弹出窗口拦截器都绑定到浏览器javascript引擎的核心,例如内置在br中Oser和这些将阻止非由用户事件触发的下载,这是正确的。事实上,您能够通过iframe触发而无需用户操作,这是弹出阻止程序中的一个缺陷,毫无疑问将得到修复。这现在不适用于Chrome 65。让我使用iframe的问题是,在您的解决方案中,AdBlocker可以阻止噢,我想通过that@omriman12如果不是由用户操作事件触发,大多数弹出窗口拦截器只会阻止该调用。大多数弹出窗口拦截器现在绑定到浏览器javascript引擎的核心,例如内置在浏览器中,这些拦截器将阻止非由用户事件触发的下载,这是正确的没有用户操作的iframe的igger是弹出窗口拦截器中的一个bug,毫无疑问会被修复。这在Chrome 65上不起作用