Link标签HREF设为#时Page Load事件触发两次的问题
问题:href="# 的link标签导致Page Load事件触发两次
当把link标签的href设为#时(比如用来替代真实的shortcut icon或stylesheet以避免JavaScript警告),会导致ASP.NET页面的Page Load事件执行两次——不管是rel="shortcut icon"还是rel="stylesheet"类型的link标签,都会出现这个问题。
原因分析
- 浏览器会主动请求link标签href指向的资源,当href值为
#时,浏览器会将其解析为当前页面的锚点,进而再次发起对当前页面的完整请求,服务器端因此会两次触发Page Load事件。 - 对于shortcut icon、stylesheet这类浏览器默认会加载的资源,只要href指向的是当前页面相关的地址,就会触发重复请求。
解决办法
1. 直接移除不必要的link标签
如果只是为了避免JS警告,直接删掉这类没有真实资源指向的link标签是最直接的方式——毕竟没有实际资源需要加载时,这类标签并非必须。
2. 使用空资源地址替代#
可以把href设为不会触发页面请求的空资源地址,比如:
- 针对shortcut icon:
<link rel="shortcut icon" href="data:,">(利用空data URI,浏览器会加载一个空资源) - 针对stylesheet:
<link rel="stylesheet" href="data:text/css,">
这种方式既能保留link标签,又不会触发页面重复请求。
3. 指向真实的占位资源
如果必须保留link标签,可以准备一个真实的占位资源:比如1x1的透明图标文件、空的CSS文件,将href指向这些静态资源。浏览器请求静态资源时,不会触发ASP.NET页面的Page Load事件。
示例HTML代码
<!doctype html> <html lang="en"> <head runat="server"> <title>My Example</title> <!-- 此link标签的href=#会触发Page load事件执行两次 --> <link rel="shortcut icon" href="#"> </head> <body> <form id="form1" runat="server"> <h1>My Example</h1> </form> </body> </html>
示例VB.NET后台代码
Partial Class myexample Inherits System.Web.UI.Page Private Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load ' 此方法会被触发两次 End Sub End Class
同样存在问题的stylesheet标签示例
<link rel="stylesheet" href="#" />
内容的提问来源于stack exchange,提问作者ptownbro
相关产品推荐
相关产品推荐

