ajax回调中的this.href不执行跳转的解决办法

1. 问题背景

如下所示代码:

复制代码
        $.post("/ems/register",indata, function(data){
            if(data != null && data.result == 'error'){
                $("#no_error").text(data.msg);
                return false;
            }else{
                this.href="/ems/registerSuccess";
            }
        },'json');

即使注册成功, data.result != 'error' ,代码 : this.href="/ems/registerSuccess"; 也不会执行。测试了很久,最后才怀疑到ajax异步上来。

原因就是这里是异步调用,this.href 是处在异步调用的回调中。

但是即使是我们使用了ajax的同步调用,那么在回调函数中的:this.href="/ems/registerSuccess"; 也不会执行:

复制代码
        $.ajax({
            url:"/ems/register",
            async:false, // 注意此处需要同步,不然后面的 this.href=xxx 不执行
            type:"POST",
            dataType:"json",
            data:indata,
            success:function(data) {
                if(data != null && data.result == 'error'){
                    alert(222);
                    $("#no_error").text(data.msg);
                    return false;
                }else{
                    // 这里的this.href不会执行
                    this.href="/ems/registerSuccess";
                }
            }
        });

即使我们 async:false 采用同步调用,在firefox浏览器中的,回调函数中的 this.href="/ems/registerSuccess"; 也不会执行。

**2.**解决方法一

只有采用同步的同时,在 ajax 代码后面的 this.href="/ems/registerSuccess"; 才会执行。

复制代码
        $.ajax({
            url:"/ems/register",
            async:false, // 注意此处需要同步,不然后面的 this.href=xxx 不执行
            type:"POST",
            dataType:"json",
            data:indata,
            success:function(data) {
                if(data != null && data.result == 'error'){
                    alert(222);
                    $("#no_error").text(data.msg);
                    return false;
                }else{
                    // 这里的this.href不会执行
                    //this.href="/ems/registerSuccess";
                }
            }
        });
        this.href="/ems/registerSuccess";

最后面的 this.href="/ems/registerSuccess"; 在ajax 同步调用的后面,才会执行。

3. 解决方法二

既然我们不能使用 this.href, 那么我们可以换一种方式,我们使用 window.open(url,'_self'),经过测试,不存在this.href的问题。代码如下:

复制代码
        $.post("/ems/register",indata, function(data){
            if(data != null && data.result == 'error'){
                $("#no_error").text(data.msg);
                return false;
            }else{
                //this.href="/ems/registerSuccess";
                window.open("/ems/registerSuccess", '_self');
            }
        },'json');

这也算是 window.href 和 window.open(url,'_self')的一个小区别吧。

4. 解决方法三

我们在服务端 重定向,不在浏览器端重定向。就可以绕开这个问题。(其实服务端 重定向也是不行的,因为是一个 ajax 的请求,所以服务端的重定向不起任何作用,它不会让页面重定向到新的页面。)

相关推荐
笨笨饿11 分钟前
#121_图传中的H.364编码与MP4的联系
linux·运维·前端·单片机·嵌入式硬件·面试·职场和发展
默_笙32 分钟前
☕ 我给 TS 类型做了台"瘦身手术",还顺手用 Docker 起了个 MySQL
前端·javascript
leoZ2311 小时前
AI+前端提效- 06 AI辅助调试排错:前端报错、白屏、兼容问题极速定位
前端·人工智能·chatgpt·状态模式·超分辨率重建·openvino·dreamfusion
ji_shuke2 小时前
Vue 3 使用 History 哨兵和 popstate 拦截浏览器返回
前端·javascript·vue.js·history·哨兵·popstate
名字还没想好☜2 小时前
Prometheus 告警实战:写 alerting rules、用 Alertmanager 做路由分组与抑制
运维·前端·javascript·docker·kubernetes·prometheus
郭邯2 小时前
从零撸了一个 HTML 实体编解码工具,顺便聊聊我和 AI 结对编程的日常
前端
樊小肆2 小时前
DeepSeeker-Code源码导读12-Hooks四引擎
前端·人工智能·agent
xm_xm_xm_13 小时前
TypeScript 7 个 核心特性
前端·typescript
pppiii3 小时前
前端并发请求控制:5 种实现方案完整梳理
前端
郑州光合科技余经理3 小时前
本地生活平台搭建:统一订单表与多后台切换怎么拆
java·开发语言·前端·系统架构·uni-app·php·ai编程