由href return false 来看阻止默认事件

本文介绍了如何使用不同方法阻止HTML中a标签的默认跳转行为,包括直接在标签内使用JavaScript表达式、定义函数返回false及使用jQuery和addEventListener结合preventDefault()方法。

很多时候我们都想阻止一个a ?link的href跳转。

1
<a onclick=”return false;” href=”www.360.cn”>click</a>

以上代码可以达到这个效果

有一点要注意

1
2
3
4
5
6
7
function stop(){
  
return false;
  
}
  
<a onclick=”stop();” href=”www.360.cn”>click</a>

这么写是不会阻止默认事件的,stop()反回false, ?onclick却没有返回值 只有事件的返回值是false时 才会阻止默认事件 所以要这么写:

1
<a onclick=”return stop();” href=”www.360.cn”>click</a>

这样就会有效果, 那么如果是用绑定事件的方式呢 会怎么样呢

qwrap是用标准的事件绑定方式来做的 可以用它来测试

1
2
3
<a id=”testa” href=”www.360.cn”>click</a>
  
W(‘#testa’).click(function(){ return false;});// 这是一个标准的绑定事件方法

测试后发现 ie是可以阻止默认事件的 ?标准浏览器 chrome firefox等却没有能阻止 直接发生了跳转

分析后发现因为标准浏览器使用 addEventListener 绑定事件 而该方法是没有返回值的,可参见w3c文档 没有返回值, 返回值当然不会是false所以继续执行href 。

而ie使用attachEvent的方法这个方法是有returnValue的参见?http://msdn.microsoft.com/en-us/library/ie/aa703898(v=vs.85).aspx

所以成功阻止了默认事件,

那么使用addEventListener绑定事件 如何阻止呢 ?

虽然addEventListener 不能有返回值 但是它有一个方法 preventDefault() 专门用来阻止默认事件 ,

1
W(‘#testa’).click(function(e){ e.preventDefault();});

这样就可以成功阻止了.

所以 用addEventListener绑定的事件 必须用preventDefault()来阻止默认事件

但是又有一个现象

1
$(‘#testa’).click(function(){return false;});

query 却可以做到, 以上代码运行成功在所有浏览器

这是为什么 ?这并不是jquery可以例外 只是它悄悄的调用了preventDefault() 和 stopPropagation()

jqeury会把事件的响应函数封装在一个dispach的函数里 如果发现你的函数return false 就会同时调会preventDefault() 和stopPropagation()

所以在jquery中 return false 等价于:

1
2
3
4
5
e.preventDefault()
  
e.stopPropagation()
  
return false;

这三个

<think> 首先,用户查询是:“我想查找使用window.location.href跳转到指定页面的方法”。意思是用户想知道如何使用window.location.h属性来跳转到指定的页面。 从系统级指令看: - 所有行内数学表达式要使用$...$格式,但这个问题是关于JavaScript的,没有数学内容,所以这部分可能不适用。 - 独立公式必须使用$$...$$格式,但同样,这里没有数学公式。 - LaTeX语法正确:不涉及数学,没问题。 - 使用中文回答:所有响应必须用中文。 - 生成相关问题:在回答末尾,我需要生成一些相关问题。 - 回答中引用的段落末尾自然地添加引用标识:用户提供了四个引用[1][2][3][4],我需要参考这些并在适当的地方添加引用标识如[^1]。 用户提供的引用内容: - [^1]: 关于submit按钮导致跳转失效的问题,改为button类型解决。 - [^2]: 微信浏览器中多个location.href调用时第一个不生效,可能是运行机制问题。 - [^3]: 示例代码中使用了window.location.href和reload。 - [^4]: 解决方法中使用了window.event.returnValue=false阻止默认行为。 用户的需求是“使用window.location.href跳转到指定页面的方法”,所以我需要解释基本用法和常见问题。 我的回答结构: - 帮助用户逐步解决问题。 - 保证真实可靠。 - 引用相关信息并添加引用标识。 - 末尾生成相关问题。 步骤: 1. **介绍基本用法**:解释如何使用window.location.href进行页面跳转。 - 示例:`window.location.href = "http://example.com";` 2. **讨论常见问题**:基于引用,讨论用户在跳转时可能遇到的问题。 - 表单提交问题(如[^1])。 - 多个调用顺序问题(如[^2])。 - 避免不必要的reload(如[^3])。 - 防止默认事件(如[^4])。 3. **提供解决方案**:建议最佳实践。 - 使用button而不是submit。 - 小心多个跳转的顺序。 - 避免在跳转后调用reload()。 4. **添加引用**:在相关部分末尾添加引用标识。 5. **生成相关问题**:在回答末尾添加几个相关问题。 最终回答用中文。 </think> ### 使用 `window.location.href` 跳转到指定页面的方法 `window.location.href` 是 JavaScript 中用于页面跳转的常用方法。它会将当前窗口导航到指定的 URL。以下是基本用法、常见问题及解决方案的解释,帮助您安全实现跳转功能。 #### 1. **基本用法** 要跳转到指定页面,只需将目标 URL 赋值给 `window.location.href`。语法如下: ```javascript // 示例代码:跳转到"https://example.com" window.location.href = "https://example.com"; ``` - **原理**: 当执行该语句时,浏览器会立即加载新页面,当前页面会被替换。 - **注意事项**: - URL 应完整包含协议(如 `http://` 或 `https://`),否则可能被视为相对路径。 - 该方法适用于大多数浏览器和场景,但在表单提交事件中可能导致失效(需避免与其他事件冲突)[^1]。 #### 2. **常见问题及解决方法** 基于引用中的示例,以下是一些常见失效场景和优化建议: - **表单提交导致的失效**: 如果跳转代码在表单的 `submit` 按钮事件中,表单会先提交并离开当前页面,导致跳转无效。解决方法是改用普通 `button` 类型按钮,并手动触发表单提交或跳转。 ```javascript // 错误示例:使用submit按钮可能失效 // 正确示例:改为button类型并添加事件处理 document.getElementById("myButton").addEventListener("click", function() { // 先处理业务逻辑,再跳转 window.location.href = "/target-page"; // 生效 }); ``` 引用示例中,将按钮类型改为 `button` 即可解决问题[^1]。 - **多个跳转调用顺序问题**: 在条件语句中连续调用 `window.location.href` 时,第一个跳转可能被后续代码覆盖。解决方法是确保只执行一次跳转,或使用 `return` 提前结束代码。 ```javascript // 错误示例:多个跳转可能导致第一个失效 if (condition) { window.location.href = "https://site1.com"; // 可能不生效 } window.location.href = "https://site2.com"; // 覆盖前一个 // 正确示例:使用return确保只跳转一次 if (condition) { window.location.href = "https://site1.com"; return; // 结束当前函数 } window.location.href = "https://site2.com"; ``` 微信浏览器等环境下,需注意运行机制和事件循环[^2]。 - **避免不必要的 `reload()`**: 跳转后调用 `window.location.reload()` 会导致页面重新加载,可能破坏跳转逻辑。建议仅在需要时使用,例如在跳转前确保表单数据提交完毕。 ```javascript // 错误示例:跳转后立即reload可能无效 window.location.href = "/new-page"; window.location.reload(); // 可能导致冲突 // 正确示例:避免冗余调用,跳转后无须reload window.location.href = "/new-page"; // 直接跳转即可 ``` 引用代码中展示了不必要的 `reload()` 调用[^3]。 - **阻止默认事件行为**: 在事件处理函数中,跳转可能被其他默认行为(如表单提交或链接点击)中断。使用 `event.preventDefault()` 或设置 `returnValue=false` 来阻止默认行为。 ```javascript // 示例:在点击事件阻止默认行为 document.getElementById("link").addEventListener("click", function(event) { event.preventDefault(); // 阻止链接默认跳转 window.location.href = "/custom-page"; // 自定义跳转 event.returnValue = false; // 兼容旧浏览器 }); ``` 该方法可确保跳转优先级[^4]。 #### 3. **最佳实践总结** - **通用步骤**: 1. 确保跳转代码在事件处理函数中(如 `click` 事件),而非表单提交事件。 2. 使用绝对 URL 或完整路径。 3. 避免在跳转后添加冗余操作(如 `reload()`)。 4. 在异步操作(如 AJAX 请求)后调用跳转,以确保数据完整性。 - **测试建议**: - 在控制台测试 `window.location.href = "目标URL"`。 - 在微信浏览器等特殊环境下,检查跳转顺序和事件处理。 如果您提供更多代码上下文,我可以给出更具体的优化建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值