javascript - 如何处理 HTMLElement.Click() 静默失败

标签 javascript html dom

我使用类似于 this answer 的代码通过 ajax 实现了一个文件下载按钮。 .我的代码看起来像这样:

$('#download-link').on('click', function (event) {
    event.preventDefault();
    var link = $('#download-link').attr('href');
    $.ajax({
        url: link,
        success: function (result) {

            var blob = getBlob(result);
            var a = document.createElement('a');
            var url = (window.URL ? URL : webkitURL).createObjectURL(blob);
            a.href = url;
            a.download = 'somefilename.txt';
            a.style.display = 'none';
            document.body.appendChild(a);                       
            try {
                a.click();
            }
            catch (err) {
                //fallback. if .click() is unavailable display a new button for user to get file.
                a.style.display = '';
                a.innerText = 'Get File';
                var downloadButton = document.getElementById('download-link');
                downloadButton.style.display = 'none';
            }
        }
    });
});

所以本质上,我们正在创建一个对象 URL,创建一个 <a>具有对象 URL 的 Href 并调用 Click() 的元素在该元素上下载文件。某些浏览器会在此时抛出错误,因此作为回退,我们捕获错误并显示创建的按钮,以便用户可以按下并获取文件。

问题是某些浏览器(似乎是在 iOS 和旧版本的 Android 上)会简单地忽略 Click()称呼。我知道我可以使用浏览器嗅探来处理这个问题,但我认为这不是一个很好的解决方案。有什么更优雅的方法可以让我检测到这种情况并使用我的后备方法吗?

最佳答案

您可以创建一个标志来检查您的脚本是否能够触发点击事件。监听点击并翻转标志,一段时间后处理未检测到点击的情况。

        a.href = url;
        a.download = 'somefilename.txt';
        a.style.display = 'none';
        var linkClicked = false;
        a.addEventListener('click',()=>linkClicked = true);
        document.body.appendChild(a);                       
        a.click();
        setTimeout(()=>{
            if(!linkClicked){
            //fallback. if .click() is unavailable display a new button for user to get file.
            a.style.display = '';
            a.innerText = 'Get File';
            var downloadButton = document.getElementById('download-link');
            downloadButton.style.display = 'none';
            }
        },500);

另一种解决方案是始终显示链接,但让链接文本类似于“如果您的下载未开始,请单击此处”

关于javascript - 如何处理 HTMLElement.Click() 静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46001046/

相关文章:

javascript - 如何在不刷新页面的情况下使用 ajax/javascript 更新数据库 asp.net mvc

php - 交响乐2 : How to reuse variable(username) inside template?

html - 使用 CSS 背景拉伸(stretch)图像以填充背景

javascript - 使用 javascript 重新加载 CSS 样式表

javascript - 如何在cordova中使用硬件意图

javascript - 使用javascript在html中重新排序动态表

html - 无法解释的文档高度和滚动条问题

javascript - 如何在通过 JavaScript 加载图像时显示微调器

javascript - 为什么在 <table> 单元格中使用 SVG 强制表格为 100% 宽度?

php - 保留更改 MySQL