4

我正在使用bit.ly url 缩短服务来缩短某些 url 被发送到“在 twitter 上分享”功能的时间。我只想在用户实际按下共享按钮时加载 bit.ly url(由于 bit.ly 的最大 5 个并行请求限制)。Bit.ly 的 REST API返回一个带有缩短 url 的 JSON 回调,这使得整个场景异步。

我尝试了以下方法来停止点击事件,并在启动点击之前等待 JSON 调用返回一个值。

我在 jQuery(document).ready() 中有以下简化代码:

更新代码(过于简单)!

jQuery("#idofaelement").click(function(event) {
    event.preventDefault(); //stop the click action
    var link = jQuery(this);
    bitlyJSON(function(shortUrl) {
        link.attr("href", function() {
          //process shortUrl
          //return finalized url;                   
        }).unbind().click();
    });
});

下面的代码来处理位缩短(工作得很好):

function bitlyJSON(func) {
//
// build apiUrl here
//
jQuery.getJSON(apiUrl, function(data) {
    jQuery.each(data, function(i, entry) {
        if (i == "errorCode") {
            if (entry != "0") {
                func(longUrl);}
        } else if (i == "results") {
            func(entry[longUrl].shortUrl);}
    });
});  
} (jQuery)

href 改变了它的值,但最终的 .click() 事件永远不会被触发。这在为 href 定义静态值时可以正常工作,但在使用异步 JSON 方法时则不行。

4

4 回答 4

5

正如您概述的那样:

event.preventDefault(); //stop the click action

这意味着,BROWSER IS NOT GOING TO THE URL,如果您希望实际前进到长 url 位置,只需执行以下操作:

document.location.href = longurl;
于 2009-10-27T12:11:27.610 回答
1

iirc,jquery 不会触发 A 元素的“点击”。我会在回调中尝试旧的好“location.href=whatever”。

 bitlyJSON(function(shortUrl) {
      link.attr("href", function() {
      //process shortUrl
      //return finalized url;                   
    });
    location.href = link.attr("href");
});
于 2009-10-27T09:11:56.413 回答
1

我认为您真正想要的是return false;从点击事件中,以防止实际关注href,对吗?

像:

jQuery("#idofaelement").click(function(event) {
    //event.preventDefault(); //stop the click action
    var link = jQuery(this);
    bitlyJSON(function(shortUrl) {
        link.attr("href", function() {
        //process shortUrl
        //return finalized url;                   
        }).unbind().click();
    });
    return false;
});
于 2009-10-27T09:44:27.617 回答
1

@Tzury Bar Yochay建议我使用 location.href 来更新网址,从而为我指明了正确的方向。@Victor 也帮助了他的回答。

结合答案,我得到了一些工作,但在 Firefox 的历史上遇到了问题。似乎更新window.location确实重定向了用户,但也从历史记录中删除了“源页面”。这在 chrome、safari、ie8、ie8-compatibility 或 ie7 中没有发生。

基于对另一个问题的回复,我能够创建一个解决方法,提供以下工作代码 + 进行了一些更改:

jQuery("#idofaelement").one("click", function(event) {
    bitlyJSON(function(shortUrl) {
        jQuery("#idofaelement").attr("href", function() {
            //process shortUrl
            //return finalized url;                   
        });
        setTimeout(function() {
            window.location = jQuery("#idofaelement").attr("href");
        }, 0);
    });
    return false;
});

感谢所有的帮助!

于 2009-10-27T22:18:54.527 回答