2

我有一个正常的链接:

<a href="http://www.google.com" class="continue">Continue</a>

我已经将点击绑定到一个事件以发布这样的 ajax 请求:

$('.continue').click(function () {

    $.ajax({
        type: 'POST',
        url: '/url-to-post-to',
        data: mydata,
        contentType: 'application/json',
        error: function (err) {
            alert("error - " + err);
        },
        success: function () {
            return true;
        }
    });
});

我想要实现的是成功后要遵循的链接......
即,如果没有错误,用户应该被重定向到谷歌。

我知道我可以放入window.location.href成功处理程序,但如果可能的话我试图避免这种情况

4

4 回答 4

11

不幸的是(在您的情况下),ajax 是异步的,这意味着您的 click 函数启动 ajax 调用,然后继续运行而不注意它的作用(因此最后什么也不返回)。

success 函数稍后调用(当 ajax 返回成功时),是一个完全不同的函数,因此它的返回true与您原来的 click 函数无关。

综上所述,您将需要使用 javascript 来覆盖锚标记的自然行为(直接访问 google.com)以及之后发生的情况(重定向)。

$('.continue').click(function (e) {
    e.preventDefault(); // otherwise, it won't wait for the ajax response
    $link = $(this); // because '$(this)' will be out of scope in your callback

    $.ajax({
        type: 'POST',
        url: '/url-to-post-to',
        data: mydata,
        contentType: 'application/json',
        error: function (err) {
            alert("error - " + err);
        },
        success: function () {
            window.location.href = $link.attr('href');
        }
    });
});
于 2013-05-15T11:29:02.913 回答
2

你有没有尝试过这样的事情:

$('.continue').click(function(e) {
    e.preventDefault();
    var link = $(this).attr('href');

    $.ajax({
        type: 'POST',
        url: '/url-to-post-to',
        data: mydata,
        contentType: 'application/json',
        error: function (err) {
            alert("error - " + err);
        },
        success: function () {
            window.location.href = link; // <-- This line
        }
    });
});

或者,如果链接与响应文本一起发送,请使用该数据。

编辑:我没有看到你的最后一行,不想使用它的原因是什么?它是完全动态的,所有支持 JavaScript 的浏览器都支持它。

于 2013-05-15T11:10:35.877 回答
1

你可以试试这个

     $('.continue').click(function () {
   $.ajax({
    type: 'POST',
    url: '/url-to-post-to',
    data: mydata,
    contentType: 'application/json',
    error: function (err) {
        alert("error - " + err);
    },
    success: function () {

       $(location).attr('href',$(this).attr('href'));
    }
  });
  return false;
 });
于 2013-05-15T11:27:29.890 回答
0

如果我们需要在这里真正有一个“点击”,我们应该只是新触发点击事件并让它在第二次点击时返回true。

$('.continue').click(function () 
{
    if ($(this).attr('tracked')!=undefined)
    {
        return true;
    }
    a = $(this);
    $.ajax({
        type: 'POST',
        url: '/url-to-post-to',
        data: mydata,
        contentType: 'application/json',
        error: function (err) {
            alert("error - " + err);
        },
        success: function () {
            $(this).attr('tracked',true);
            $(a)[0].click();
        }
    });
});
于 2018-03-20T23:09:26.903 回答