Firefox下代码触发a标签的click事件无效

通过一次导出功能是让自己如何一步一步掉坑最后又是怎么爬起来的

在页面中通过document.createElement(‘a‘);创建一个a标签,然后给a标签的href属性赋url,通过代码触发a标签的click事件请求后台,在Chrome浏览器中请求正常,但是在Firefox中始终无效,debugger发现代码也走到了a.click()方法,但是就是没反应。代码如下:

$.ajax({
        url: Config.ApiUrl + "TZTZ/DowloadFile",
        type: "Post",
        dataType: "json",
        contentType: 'application/json',
        data: JSON.stringify(datas),
        success: function (data) {
            debugger
            var strs = new Array(); //定义数组
            if (data.Code == 200) {
                strs = data.Data.split(";"); //字符分割
                console.info(strs);
                for (i = 0; i < strs.length; i++) {
                    if (strs[i] == ";" || strs[i] == "")
                        break;

                    var requestUrl = Config.ApiSite + "/Upload/Excel/" + strs[i];
                    console.info(requestUrl);
                    var a = document.createElement('a');
                    // 利用URL.createObjectURL()方法为a元素生成blob URL
                    a.href = requestUrl;
                    // 给文件命名
                    a.download = strs[i];
                    // 模拟点击(Firefox安全机制禁止了客户端程序员模拟点击)
                    a.click();
                }
            } else {
                alert("导出异常:" + data.msg);

            }

        }
    });

第一次是直接创建一个a标签去通过a标签的download属性模拟用户点击,但是发现a标签在火狐浏览器上是失效的,通过百度得出答案是因为火狐浏览器的同源策略不允许用户模拟点击事件也可能是因为Firefox的安全机制不允许开发这么做,后面就做了兼容,关键代码如下:


           if (navigator.userAgent.indexOf("Firefox") > -1){
                    //判断是否Firefox浏览器
                    //window.open(requestUrl);
                    window.location.href = requestUrl;
           }else {
                    var a = document.createElement('a');
                    // 利用URL.createObjectURL()方法为a元素生成blob URL
                    a.href = requestUrl;
                    // 给文件命名
                    a.download = strs[i];
                    // 模拟点击
                    a.click();
            }

         

注意:这样通过重定向取做导出excel对于单条数据是没问题的,但是导出多条对的话就会发现
循环window.location.href下载文件却只执行最后一个,每次都跑到了,但是只下载了循环的最后一个,这是因为页面跳转和下载是异步的,上一条还没来得及跳转呢,你又跳转了

网上看到有人说判断document.all来决定怎样调用click事件

if(document.all) {
  a.click();
} else {
    var evt = document.createEvent("MouseEvents");
    evt.initEvent("click",true,true);
    a.dispatchEvent(evt);
}

但是仍然不行,再次debugger发现,在Firefox下document.all不为空,因此还是执行的a.click()方法,改为不判断document.all,直接创建鼠标事件对象调用。最后完整代码如下:

 $.ajax({
        url: Config.ApiUrl + "TZTZ/DowloadFile",
        type: "Post",
        dataType: "json",
        contentType: 'application/json',
        data: JSON.stringify(datas),
        success: function (data) {
            debugger
            var strs = new Array(); //定义数组
            if (data.Code == 200) {
                strs = data.Data.split(";"); //字符分割
                console.info(strs);
                for (i = 0; i < strs.length; i++) {
                    if (strs[i] == ";" || strs[i] == "")
                        break;

                    var requestUrl = Config.ApiSite + "/Upload/Excel/" + strs[i];
                    console.info(requestUrl);
                    var a = document.createElement('a');
                    // 利用URL.createObjectURL()方法为a元素生成blob URL
                    a.href = requestUrl;
                    // 给文件命名
                    a.download = strs[i];
                    // 模拟点击(Firefox安全机制禁止了客户端程序员模拟点击)
                    //a.click();
                    var evt = document.createEvent("MouseEvents");
                    evt.initEvent("click", true, true);
                    a.dispatchEvent(evt);
                } 

            } else {
                alert("导出异常:" + data.msg);

            }

        }
    });

原文地址:https://www.cnblogs.com/imtudou/p/11251953.html

时间: 2024-11-06 03:15:11

Firefox下代码触发a标签的click事件无效的相关文章

如何用按钮的click事件去触发a标签的click事件

在jQquery中,可以用如下方式触发input.a标签的click事件: <input id="my_input" /> <a id="my_a" href="http://www.XXXX.html"></a> $("#my_input").click(function () { //do something }); 或 $("#my_a").click(functi

以input=file方式,获取文件时,在IE下8无法通过某个按钮click事件间接触发input=file的change事件

最近在项目中遇到了许多上传问题,公司内部的组件,通过form上传,需要使用input=file触发选择文件, 因为input=file在各个浏览器中显示的样式是不同的,谷歌,火狐,IE都有所不同,而且不太美观,所以为了解决 这一个问题,一开始采用了隐藏input=file 然后通过一个显示的button间接触发input=file的click事件如下 <input type="file" id="upload" style="display:none

a标签包着img事件 ie下 a标签的click事件失效

整个大的背景框有个点击事件, 如果标签结构是(详细的css样式略) a{background:green;} <a href=""> <img src="personal.png"/> <p>我是个人用户</p> </a> a标签有个click事件 像这样的 a标签包着img标签的时候 在ie下点击图片位置的时候 click事件不会触发 解决方式是把a标签改成div <div> <img

【转】HTML中A标签与click事件的前世今生

在动态网页中,常常需要在单击超链接时处理一些数据,而不是跳转一个网页.在这种情况下,通常有以下三种处理方式: 不设置<a>标签的href属性,只设置onclick属性.在这种处理方式下,通常超链接文本会和正文的文本以相同的形式出现,即不 会有默认的下划线.当鼠标放在超链接上也不会显示小手的形状(除非为该超链接设置了CSS).因此,用户很难知道这是一个可以点击的超链接. 将<a>标签的href属性值设置为"#",并设置onclick属性.在这种处理方式下,用户可以

动态生成DOM元素绑定click事件无效问题

在页面里,jq动态生成dom节点,该节点的click事件无效. 如,html里动态添加class名为.del的<a>, js文件中: $('.del').bind('click',fuction(){ alert('sda'); }) 不响应, 网上说可以用live代替bind事件,但在jq1.7版本开始,就取消了live事件, 解决方法: on()事件 代码改为: $(document).on('click','.del',fuction(){ alert('sda'); }) 这样就搞定了

jQuery触发a标签点击事件-为什么不跳转

今天开发发现 使用jQuery触发a标签的点击事件,当前的样式发生了变化,可是没有跳转,为什么? 百度后找到的解决方案: <a onclick="hanle()" href="test.jsp" target="main" ><span id="hand">处理</span></a> 在a标签中加上span标签,触发span标签的点击事件. 直接在a标签上触发点击,当前链接onc

给按钮绑定的click事件无效

1. 原因分析:按钮是发送 Ajax 请求,成功请求到数据后,使用 JQuery 动态生成的.Ajax 请求是异步刷新机制,不会等上面的代码执行完.因此给这种类型的按钮绑定点击事件时,按钮还没有被创建出,那么,click事件自然不会绑定到按钮上. 2. 解决办法: ① 在按钮创建的时候就绑定事件. ② 使用 JQuery 的 .live() 方法:给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效.但是在 JQuery 1.7开始的版本中被删除了,应该使用 .on() 来

EasyUi中的datagird中a标签的click事件无法触发?(未解决)

***************************2015-10-29 21:07************************* 问题如下: datagrid最后一列编辑中有如下a标签 { field: "编辑", title: "编辑", width: 100, align: "center", //value表示字段值,row表示当前行的值,index表示当前行的索引 formatter: function (value, row,

jquery中对动态生成的标签响应click事件(二)…与ajax交互使用

<script> jQuery(document).ready(function($) { $('#clickme').bind('click', function() { $.ajax({ type: "post", async:false, url: "ajax.jsp", data: { key: "Delete"}, success: function (data) { $('#divContent').append('<