前端面试——href="#"、href="javascript:void(0)"与href="javascript:;"的区别

本文探讨了HTML中a标签的两种空链接用法:href=#与href=javascript:void(0)的区别。前者用于页面内定位,后者创建死链接阻止默认行为,适用于执行JS函数而不跳转。

我们在使用a标签的空链接时,通常写为 href=# 或者 href=javascript:void(0) ,这两种写法有什么区别呢?我想很多人都不会去深究,但是这两种写法出来的效果有时候是不一样的。

概括来说,这两种写法有如下几个区别:

  1. # 包含了一个位置信息,默认的锚是 #top 也就是网页的上端。
  2. 而javascript:void(0), 仅仅表示一个死链接,当 href=javascript:void(0) 的空链接被点击时,页面不会有任何反应。
  3. 在页面很长的时候会使用 # 来定位页面的具体位置,格式为:# + id。
  4. 如果你要定义一个死链接请使用 javascript:void(0) 。

下面实例代码演示上述1、2点的区别:

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>a标签空链接href=#与href=javascript:void(0)的区别</title>
</head>

<body>
    <p style="height:1300px;width:100%;background:#cccccc"></p>
    <p style="width:100%;padding:10px;background:#999999">
        <a href="#">空链接: href=#</a>
        <br>
        <a href="javascript:void(0)">空链接: href=javascript:void(0)</a>
    </p>
    <p style="height:100px;width:100%;background:#cccccc"></p>
</body>

</html>

使用 # 来定位页面的具体位置的实例代码:

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>a标签空链接href=#与href=javascript:void(0)的区别</title>
</head>

<body>
    <p style="width:100%;padding:10px;background:#999999">
        <a href="#p1">跳到目标位置: href=#p1</a>
    </p>
    <p style="height:100px;width:100%;background:#cccccc"></p>
    <p id="p1" style="height:1000px;width:100%;padding:10px;background:#999999">目标位置:id="p1" </p>
</body>

</html>

 

为什么要使用href=”javascript:void(0);”

href=”javascript:void(0);” 的含义是,让超链接去执行一个js函数,而不是去跳转到一个地址,而void(0)表示一个空的方法,也就是不执行js函数。

javascript:是伪协议,表示url的内容通过javascript执行。void(0)表示不作任何操作,这样会防止链接跳转到其他页面。这么做往往是为了保留链接的样式,但不让链接执行实际操作。下面的语句:

<a href="javascript:void(0)" onclick="window.open()">

点击链接后,页面不动,只打开链接。而下面的语句:

<a href="#" onclick="javascript:return false;">

作用一样,但不同浏览器会有差异。

多数情况下,当某一链接要执行一个javascript程序时,我们可以使用href=javascript:void(0)再加上onclick事件来实现,如下面实例代码:

<!doctype html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>a标签空链接href=#与href=javascript:void(0)的区别</title>
</head>

<body>
    <p style="width:100%;padding:10px;background:#999999">
        <a href=javascript:void(0) onclick=func()>点击执行函数func()</a>
    </p>
    <script>
    function func() {
        alert("ok");
    }
    </script>
</body>

</html>

javascript:;与javascript:void(0)的区别

  1. 从执行效果来看:“javascript:;”直接返回undefined。“javascript:void(0);”要去执行一次表达式“0”,然后返回undefined。
  2. 性能上的区别:javascript:void;会多一次表达式解析。
  3. 空间上区别:“void(0);”比“;”多7个字符。
<a href="#" >test</a> //点击链接,页面默认上滚到页的顶部,但可以加上 onclick="return false",防止上滚到页的顶部
<a href="####" >test</a> //使用2个到4个#,见的大多是"####",也有使用"#all"等其他的。默认不上滚到页的顶部
<a href="javascript:void(0);" >test</a> //新浪微博写法,javascript:void(0) 仅仅表示一个死链接,执行空事件
<a href="javascript:;" >test</a> //QQ空间写法

 

### 爬虫处理 `href=javascript:void(0)` 的解决方案 当遇到 `<a>` 标签的 `href` 属性设置为 `javascript:void(0);` 时,传统的爬虫技术通常会失效,因为这些链接并不指向实际的 URL 资源。然而,现代网站往往依赖于 JavaScript 动态加载数据,因此可以通过以下方法解决这一问题。 #### 方法一:模拟浏览器行为 使用支持 JavaScript 执行环境的工具(如 Selenium 或 Puppeteer),可以有效应对动态加载的内容。这类工具有能力运行目标页面上的 JavaScript 代码并捕获最终渲染后的 DOM 结构。 ```python from selenium import webdriver driver = webdriver.Chrome() driver.get(&#39;https://example.com&#39;) # 查找所有带有 href="javascript:void(0);" 的 a 标签 elements = driver.find_elements_by_xpath("//a[@href=&#39;javascript:void(0);&#39;]") for element in elements: # 模拟点击事件 driver.execute_script("arguments[0].click();", element) # 获取点击后产生的新内容 content = driver.page_source print(content) ``` 此方法利用 WebDriver API 提供的功能直接触发点击动作,并获取更新后的页面内容[^1]。 #### 方法二:分析网络请求 许多情况下,尽管前端 HTML 中存在 `javascript:void(0);`,但实际上的数据交互是通过 AJAX 请求完成的。借助开发者工具中的 Network 面板可以帮助识别这些后台调用的具体接口地址及其参数结构。 按照如下流程操作: 1. **打开开发者模式**:按下 F12 键或者右键菜单选择“检查”选项; 2. **切换至 Networks 标签页**:准备观察 HTTP 流量情况; 3. **筛选 XHR 类型流量**:专注于异步通信部分; 4. **记录关键请求细节**:复制有用的 URL 和 POST 数据体等信息用于后续仿造请求构建[^3]。 一旦明确了服务器端暴露出来的 RESTful 接口,则可以直接采用 Python 库 requests 实施自动化抓取: ```python import requests url = &#39;http://api.example.com/data&#39; headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0&#39;} params = { &#39;b_id&#39;: &#39;some_value&#39;, # 替换为你找到的实际参数值 } response = requests.get(url, headers=headers, params=params) if response.status_code == 200: data = response.json() print(data) else: print(f&#39;Failed to fetch data: {response.status_code}&#39;) ``` 注意某些站点为了保护资源安全设置了严格的 CORS 策略或者其他形式的身份验证机制,在尝试复刻原始请求前需仔细研究响应头字段以及 Cookie 存储状况[^4]。 #### 方法三:逆向工程 JavaScript 函数逻辑 如果确认目标功能完全由客户端脚本实现而非远程服务提供支撑的话,那么还可以进一步深入剖析相关联的 .js 文件内容,试图还原内部算法原理进而手动重现期望的结果集。不过这种方式难度较大且容易违反法律条款,请谨慎行事! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值