Html
    Css
    Js

    
                        
body {
	text-align:center
}
h1 {
	text-align:center;
}
.box {
	padding:50px;
	margin:auto;
	width:520px;
	border:1px solid gray;
	border-radius:2px;
}
a {
	font-size:18px;
	margin:50px;
	padding:10px;
	border:1px solid #333;
	border-radius:6px;
	color:white;
	transition:all .3s;
	text-decoration:none;
}
a:first-child {
	background:green;
}
a:last-child {
	background:blue;
}
a:hover {
	font-weight:bold;
	text-decoration:underline;
	font-size:24px;
	transform:scale(1.5, 1.5);
}

                        
↑上面代码改变,会自动显示代码结果 jQuery调用版本:2.0.0
 立即下载

JS单个、多文件批量下载,前端文件下载(原创)

前言:

在html5中 a 标签多了一个属性?>download,用户点击a链接浏览器会打开并显示该链接的内容,若在a链接中加了 download 属性,点击该链接就不会打开这个文件,而是直接下载。

注意,download是html5中的a标签的新特性,所以(不支持h5)的低版本浏览器不兼容!

实例1:

单个文件下载: 以下载mp3为例:

重点在于:要在a标签中加上download属性;

<a download="xxx.mp3的文件名" href="http://www.xxx.com/upload/xxx.mp3">音乐下载</a>

怎么样,是不是很简单;

实例2:

多个文件批量下载:

同上面的单个文件下载原理一样,不同点在于:

因为有多个文件,所以就要模拟次点击事件,根据要下载的数量来进行对应的循环生成a标签dom,并循环模拟点击下载事件。

其实现代码如下: 

var btn = document.getelementbyid('download-btn'); //将要进行多文件下载的mp3文件地址,以组数的形式存起来(这里只例了3个地址)   
var mp3arr = ["http://www.xxx.com/xxx.mp3", "http://www.xx.com/xxx.mp3", "http://wwww.xxx.com/xxx.mp3"];

function download(name, href) {
    var a = document.createelement("a"), //创建a标签           
        e = document.createevent("mouseevents"); //创建鼠标事件对象       
    e.initevent("click", false, false); //初始化事件对象       
    a.href = href; //设置下载地址       
    a.download = name; //设置下载文件名       
    a.dispatchevent(e); //给指定的元素,执行事件click事件    
}
//给多文件下载按钮添加点击事件   
btn.onclick = function name(params) {
    for (let index = 0; index < mp3arr.length; index++) {
        download('第' + index + '个文件', mp3arr[index]);
    }
}

关于js中的自定义事件的定义和触发(createevent, initevent,dispatchevent)

1、document.createevent(eventtype )   //创建新的 event 对象。

参数:

eventtype 共5种类型:   

events :包括所有的事件.

htmlevents:包括 'abort', 'blur', 'change', 'error', 'focus', 'load', 'reset', 'resize', 'scroll', 'select', 'submit', 'unload'. 事件

uieevents :包括 'domactivate', 'domfocusin', 'domfocusout', 'keydown', 'keypress', 'keyup'.间接包含 mouseevents.

mouseevents:包括 'click', 'mousedown', 'mousemove', 'mouseout', 'mouseover', 'mouseup'.         

mutationevents:包括 'domattrmodified', 'domnodeed', 'domnoderemoved', 'domacterdatamodified', 'domnodeedintodocument',

'domnoderemovedfromdocument', 'domsubtreemodified'.

2、event.initevent(eventtype)  //初始化新事件对象的属性

在document.createevent()后必须初始化,其对应的5种对应的初始化方法  htmlevents 和 通用 events:           

 initevent('type', bubbles, cancelable) uievents: inituievent('type', bubbles, cancelable, windowobject, detail) mouseevents: initmouseevent('type', bubbles, cancelable, windowobject, detail, screenx, screeny, clientx, clienty, ctrlkey, altkey, shiftkey, metakey, button, relatedtarget) mutationevents: initmutationevent('type', bubbles, cancelable, relatednode, prevvalue, newvalue,attrname, attrchange)

3. dom.dispatchevent(event) //给节点分派一个合成事件。

在初始化完成后就可以随时触发需要的事件了,前面的dom就要触发事件的元素,

需要注意的是在ie 5.5+版本上请用fireevent方法,还是浏览兼容的考虑

其他事件例子    

1、立即触发鼠标被按下事件     

var fireonthis = document.getelementbyidx_x('someid');
var evobj = document.createevent('mouseevents');
evobj.initmouseevent('click', true, true, window, 1, 12, 345, 7, 220, false, false, true, false, 0, null);
fireonthis.dispatchevent(evobj);

 2 、考虑兼容性的一个鼠标移动事件  

 var fireonthis = document.getelementbyidx_x('someid');
 if (document.createevent) {
     var evobj = document.createevent('mouseevents');
     evobj.initevent('mousemove', true, false);
     fireonthis.dispatchevent(evobj);
 } else if (document.createeventobject) {
     fireonthis.fireevent('onmousemove')


7
      自带丶BGM0
      2019/12/17 14:13:50
      为什么在你这里都能正常使用,一下载下来就不能使用了,,,多个文件下载只能下载一次
          沐枫自然1
          2019/12/22 14:42:58
          这里的多个文件下载原理也是单个文件下载的,多个文件下载只是循环的执行单个文件下载,就变成多个文件下载了。
      回复
      °葱。0
      2018/9/26 18:22:52
      谷歌浏览器是直接打开的地址显示图片或视频,无法下载
          沐枫自然1
          2018/9/27 22:28:51

          单文件下载 需要在a标签中添加 download 属性(只有 firefox 和 chrome 支持 download 属性),href就是被下载的文件地址 。
          多文件下载 是模拟click事件,循环执行下载动作,而下载的次数取决于文件的个数,在上面js例子中的mp3arr是一个数组,用于存放文件地址,有多少个地址用调用多少次!。
          当然,不管单文件或多文件下载除前端以外,还可以借助后端如php、net、jsp等语言实现进行下载(这样兼容性更好)!

      回复
      溪边石头0
      2018/9/7 10:05:43
      多文件下载 无法使用 谷歌浏览器
          沐枫自然1
          2018/9/7 21:24:06
          谷歌浏览器 在进行多文件下载时【出于全安问题,默认是单个文件下载,用要得用户的允许受权后才能进行多个文件下载】。所以,一般在进行多文件下载时,谷歌浏览器会自动弹出【是否允许下载多文件】,这时选择允许就可以进行多文件下载了!
          沐枫自然1
          2018/9/7 21:32:24
          chrome://settings/content/automaticdownloads

          如果点击多文件下载没反应,可能是因为下载已被阻止了, 复制以在地址,在谷歌浏览器地址栏中打开,可以进行相关下载的设置,允许下载就行了!

      回复