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); }
在html5中 a 标签多了一个属性?>download,用户点击a链接浏览器会打开并显示该链接的内容,若在a链接中加了 download 属性,点击该链接就不会打开这个文件,而是直接下载。
注意,download是html5中的a标签的新特性,所以(不支持h5)的低版本浏览器不兼容!
单个文件下载: 以下载mp3为例:
重点在于:要在a标签中加上download属性;
<a download="xxx.mp3的文件名" href="http://www.xxx.com/upload/xxx.mp3">音乐下载</a>
怎么样,是不是很简单;
多个文件批量下载:
同上面的单个文件下载原理一样,不同点在于:
因为有多个文件,所以就要模拟次点击事件,根据要下载的数量来进行对应的循环生成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')