4

bit.ly URL 短縮サービスを使用して、「Twitter で共有」機能に送信される特定の URL を短縮しています。ユーザーが実際に共有ボタンを押したときにのみ、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 THAT URLです。実際に長い URL の場所に移動したい場合は、単に次のようにします。

document.location.href = longurl;
于 2009-10-27T12:11:27.610 に答える
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 を使用して URL を更新することを提案して、正しい方向に向けてくれました。また、 @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 に答える
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 に答える