href:Hypertext Reference的缩写,本意是超文本引用。
在Web开发中超链接的href属性非常有意思,
如果href属性的值是一个文档,那么浏览器会尝试检索并显示对应的文档;
如果href属性的值是一个可下载的资源,那么浏览器会尝试下载对应的资源。
最近因为在下载洋葱数学的应用包时遇到问题,在页面上看到一段很有意思的代码,简化如下:

<a href="http://m.yangcong345.com/api/apk/latest.apk" onclick="alert(1)"></a>
<script src="/javascripts/jquery.js"></script>
<script>
$('a').click(function (e) {
if (!$(this).is('[download]')) {
e.preventDefault();
$(this).attr('download', 'download');
this.click();
$(this).removeAttr('download');
}
})
</script>

最开始我是被代码中的:is(‘[download]’)用法吸引了,原来一直没用过。
搞明白它就是用来判断链接是否有download属性后,
紧接着我被this.click()给完全弄糊涂了。
this应该是指向当前的链接啊,如果要再次绑定点击事件,应该是:$(this).click()。
于是我把this换成了对应的dom元素,在控制台执行:

document.getElementByTagName('a')[0].click()

发现alert(1)直接执行了,我根本没有点击页面的链接。
瞬间我明白了,this.click()根本不是绑定click事件,而是模拟click事件。
但为何要模拟click事件呢?

<a href="http://m.yangcong345.com/api/apk/latest.apk" onclick="alert(1)"></a>

当我用一个简单的标签就实现了所需的功能,为何还要写这么多js呢?
回到文章的标题,href is secret。
当我把href的值修改成一个文档,而不是可下载的资源时,

<a href="http://www.baidu.com" onclick="alert(1)"></a>

你会发现点击链接后,alert(1),然后页面直接跳转了。
那如果要实现即使href属性的值是一个文档,也要把对应的文档下载下来呢。
这时我们就需要用到模拟click事件。
简单理解模拟事件就是:
给元素绑定一个事件,然后取消事件的默认行为,最后模拟事件。
当然还要加入判断,否则多次触发事件时,代码会有问题。