A标签中通过href和onclick传递的this对象

本文探讨了在JavaScript中使用a标签的不同方式来触发事件处理函数时,“this”关键字的行为差异。通过对比两种不同场景下“this”的指向,帮助读者理解如何正确地在点击事件中获取元素属性。

 

在blog的后台管理中允许为一个分类添加一个地址,但是不好添加onclick事件。想传递当前对象给一个函数,于是就将这个URL写成"Javascript:shoControlSidebar(this)",可是结果发现这并不可行,传递过去的参数是一个对象,但是却得不到任何其他信息。我想得到的是innerText,而这个this并非指向它所在的A标签。


这是<a href="Javascript:shoControlSidebar(this)">和<a href="javascript:void(0)" onclick="shoControlSidebar(this)">不同的地方。


当使用onclick="shoControlSidebar(this)"的时候,解释器会给他包装一个匿名函数,变成了:

  a.onclick = function anonymous()

  {   

        shoControlSidebar(this);   

  }

这个this指的就是a这个对象,而使用href的方式时,由于是一个地址,这个this就无处可指了。 

 

原文地址:http://blog.163.com/xiao_mege/blog/static/72942753201083011169572/

转载于:https://my.oschina.net/u/555639/blog/226888

<think>我们正在讨论a标签href属性设置为javascript:void(0)时如何触发文件下载。 根据引用,我们知道: 1. href="javascript:void(0)" 的目的是阻止链接的默认行为(即跳转或刷新页面),同时保持光标为手型。 2. 通常我们会结合onclick事件来执行JavaScript代码,实现自定义操作。 因此,要实现文件下载,我们可以在a标签onclick事件中编写JavaScript代码来触发下载。 有两种常见方式: 方式1:使用window.location.href = 文件URL 这种方式会改变当前页面的地址,如果文件是浏览器支持直接打开的类型(如txt、jpg、pdf等),则会在浏览器中打开,而不是下载。 但是,如果服务器设置了响应头Content-Disposition为'attachment',则浏览器会强制下载。 方式2:使用window.open(文件URL) 这种方式会打开一个新窗口或标签页来下载文件,但可能会被浏览器的弹出窗口拦截。 方式3:动态创建一个隐藏的iframe,设置其src为文件URL,这样可以在不离开当前页面的情况下下载文件。 方式4:使用HTML5的a标签的download属性(推荐,但需要注意跨域问题) 我们可以创建一个临时的a标签,设置其href为文件URL,并设置download属性,然后触发点击事件。 考虑到兼容性用户体验,我们通常采用方式4(如果支持)或方式1(结合服务器设置)。 具体实现: 方法一:使用onclick事件中直接跳转(适合已知服务器已设置强制下载的情况) <a href="javascript:void(0)" onclick="window.location.href='文件下载URL'">下载文件</a> 方法二:使用动态创建a标签并触发点击(推荐) <a href="javascript:void(0)" onclick="downloadFile('文件下载URL', '文件名')">下载文件</a> 然后编写JavaScript函数: function downloadFile(url, fileName) { var a = document.createElement('a'); a.href = url; a.download = fileName || 'downloaded-file'; // 设置下载的文件名,可选 document.body.appendChild(a); a.click(); document.body.removeChild(a); } 注意:使用download属性时,如果文件URL是跨域的,则download属性可能会失效,浏览器会按照同源策略处理(即可能变成打开而不是下载)。 另外,引用[3]中展示了一个例子,通过给a标签添加自定义属性(如openLink)来存储下载链接,然后在click事件中通过window.location.href或window.open来实现。但这种方式需要注意弹出窗口拦截的问题。 因此,我们总结: 1. 如果文件是同源的,推荐使用download属性的方式(方法二)。 2. 如果文件是跨域的,且服务器设置了Content-Disposition: attachment,则可以使用方法一(直接跳转)或方法二(但download属性可能无效,所以跳转方式更可靠)。 3. 如果不想离开当前页面,也可以使用iframe方式(方法三),但代码稍复杂。 方法三(iframe方式)示例: function downloadFile(url) { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; document.body.appendChild(iframe); // 可以设置一个定时器,过一段时间后移除iframe setTimeout(function() { document.body.removeChild(iframe); }, 1000); } 根据引用[3]中的代码,他们使用了window.location.href来实现,并且return false来阻止可能的事件冒泡(但这里hrefjavascript:void(0)所以不需要阻止默认行为,因为已经阻止了)。但注意,在onclick事件中,如果使用return false,会阻止事件的传播(包括阻止默认行为停止冒泡)。 因此,我们可以这样写: <a href="javascript:void(0)" onclick="window.location.href='文件URL'; return false;">下载</a> 但是,return false并不是必须的,因为href="javascript:void(0)"已经不会跳转,而window.location.href会改变当前页面的地址(导致页面跳转)。如果希望在不跳转页面的情况下下载,则应该使用iframe方式或动态a标签的download方式(并且不跳转页面)。 然而,下载文件通常意味着离开当前页面(除非是后台下载),所以用户可能接受页面跳转。但更好的体验是在后台下载,不离开当前页面。 所以,综合以上,推荐使用动态创建a标签并利用download属性的方法(方法二),因为它不会导致页面跳转,并且可以指定下载的文件名。但要注意跨域限制。 如果跨域,则只能依赖服务器设置Content-Disposition为attachment,然后使用window.open或window.location.href(会跳转页面)或者iframe(不跳转页面)的方式。 因此,我们给出一个兼容性较好的方案: function downloadFile(url, fileName) { // 如果浏览器支持download属性并且同源,则使用download属性 var a = document.createElement('a'); if (typeof a.download !== 'undefined' && isSameOrigin(url)) { a.href = url; a.download = fileName || 'download'; a.style.display = 'none'; document.body.appendChild(a); a.click(); document.body.removeChild(a); } else { // 如果不支持download属性或跨域,则使用iframe方式 var iframe = document.createElement('iframe'); iframe.src = url; iframe.style.display = 'none'; document.body.appendChild(iframe); setTimeout(function() { document.body.removeChild(iframe); }, 1000); } } // 判断是否同源 function isSameOrigin(url) { var origin = window.location.origin; var u = new URL(url, window.location.href); // 使用绝对URL return u.origin === origin; } 注意:上述代码中,iframe方式在跨域时是否有效取决于服务器是否允许嵌入(CORS设置),但通常下载文件不需要嵌入,所以iframe方式可以触发下载(即使跨域),但前提是服务器设置了Content-Disposition为attachment,否则可能会在iframe中打开文件(用户看不到)。 因此,更简单的方式是直接使用iframe,无论是否跨域,因为如果服务器设置正确,浏览器会下载文件。 所以,我们可以简化: function downloadFile(url) { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = url; document.body.appendChild(iframe); setTimeout(function() { document.body.removeChild(iframe); }, 1000); } 然后这样使用: <a href="javascript:void(0)" onclick="downloadFile('文件URL')">下载文件</a> 但是,这种方式无法指定下载的文件名,文件名由服务器响应头Content-Disposition决定。 综上所述,我们给出两种方案: 方案1(推荐,支持自定义文件名,但受同源限制): 使用动态a标签的download属性。 方案2(兼容跨域,但无法自定义文件名): 使用iframe方式。 用户可以根据实际需求选择。 最后,根据引用[3]中的例子,他们使用了window.location.href,并且return false。这种方式会跳转页面,所以如果希望不跳转页面,应避免使用。 因此,我们回答用户的问题: 在a标签href="javascript:void(0)"的情况下,可以通过onclick事件触发JavaScript函数来实现文件下载。具体实现方式有多种,推荐使用动态创建a标签并设置download属性的方法(适用于同源文件),或者使用iframe方法(适用于跨域文件,但需要服务器设置Content-Disposition为attachment)。</think>在 `a` 标签中使用 `href="javascript:void(0)"` 时,可通过以下方法触发文件下载: ### 解决方案 1. **动态创建下载链接(推荐)** 在 `onclick` 事件中动态创建隐藏的 `a` 标签,设置 `download` 属性并触发点击: ```html <a href="javascript:void(0)" onclick="downloadFile()">下载文件</a> <script> function downloadFile() { const link = document.createElement('a'); link.href = 'https://example.com/file.pdf'; // 文件URL link.download = 'filename.pdf'; // 下载文件名(可选) link.style.display = 'none'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } </script> ``` **优点**: - 不跳转页面,体验流畅 - 可通过 `download` 属性自定义文件名(需同源策略支持)[^2][^4] 2. **直接跳转文件URL** 使用 `window.location.href` 或 `window.open`: ```html <!-- 方法1:当前页跳转 --> <a href="javascript:void(0)" onclick="window.location.href='https://example.com/file.zip'"> 下载 </a> <!-- 方法2:新标签页打开 --> <a href="javascript:void(0)" onclick="window.open('https://example.com/file.zip')"> 下载 </a> ``` **注意**: - 若文件类型(如 PDF/图片)可被浏览器直接打开,需在服务器设置响应头强制下载: `Content-Disposition: attachment; filename="file.zip"`[^2][^3] 3. **结合自定义属性(灵活传递参数)** 在 `a` 标签中存储文件 URL,通过 JavaScript 读取: ```html <a href="javascript:void(0)" class="download-btn" data-file="https://example.com/data.xlsx" data-filename="report.xlsx"> 下载报表 </a> <script> document.querySelector('.download-btn').addEventListener('click', function() { const url = this.getAttribute('data-file'); const filename = this.getAttribute('data-filename'); // 此处调用动态创建链接的方法 }); </script> ``` ### 关键注意事项 1. **跨域限制** - `download` 属性仅适用于同源文件,跨域文件需服务器配置 `Access-Control-Allow-Origin`[^2]。 2. **浏览器兼容性** - `download` 属性兼容现代浏览器(IE 部分支持)[^4]。 3. **服务器配置** - 确保服务器返回正确的 MIME 类型(如 `application/octet-stream`) `Content-Disposition` 头。 ### 示例代码 ```html <!-- 完整实现 --> <a href="javascript:void(0)" onclick="triggerDownload('https://example.com/file.zip', 'archive.zip')"> 下载压缩包 </a> <script> function triggerDownload(url, filename) { const link = document.createElement('a'); link.href = url; link.download = filename; link.style.display = 'none'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } </script> ``` 通过以上方法,可在保持 `href="javascript:void(0)"` 阻止页面跳转的前提下,实现文件下载功能[^1][^2][^3][^4]。 --- ### 相关问题 1. **如何解决跨域文件的下载问题?** - 需服务器配置 CORS 响应头(如 `Access-Control-Allow-Origin`),或通过后端代理中转文件请求[^2]。 2. **`download` 属性失效的场景有哪些?** - 跨域文件、浏览器安全限制、服务器未返回 `Content-Disposition` 头等情况可能导致失效[^4]。 3. **除了 JavaScript,还有哪些方法实现无刷新下载?** - 使用 `Blob` 对象 + `URL.createObjectURL()` 下载前端生成的内容 - 通过 `iframe` 隐藏加载文件(兼容旧浏览器)[^3]。 4. **如何让浏览器强制下载而非打开文件?** - 服务器需设置响应头:`Content-Disposition: attachment; filename="file.ext"`[^2][^3]。 [^1]: 使用 `javascript:void(0)` 可阻止默认跳转行为,同时保持光标手型 [^2]: 结合 `onclick` 事件执行下载逻辑,避免页面刷新 [^3]: 动态创建链接或 `iframe` 实现后台下载 [^4]: `download` 属性控制文件名,但受同源策略限制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值