0

コードのどこかにバグがありますが、間違ったことを確認できません。

私が持っているのは、jQueryUIオートコンプリートを介して入力されるFacebookユーザーIDの非表示の入力です。

<input id="fbid" type="hidden" value="12345, 567890, ">

次に、リンクをクリックして友達の壁に投稿したときに実行されるjQuery関数があります。

<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
    FB.init({
        appId      : '12345678', // App ID
        channelUrl : '/channel.html', // Channel File
        status     : true, // check login status
        cookie     : true, // enable cookies to allow the server to access the session
        oauth      : true, // enable OAuth 2.0
        xfbml      : true  // parse XFBML
    });

    // Additional initialization code here

    FB.login(function(response)
    {
        if (response.authResponse)
        {                                               
            $("#send-voucher").click(function() {

                // Post message to friend's wall

                var opts = {
                    message : 'This is the message',
                    name : 'This is the name',
                    link : 'http://www.opticalexpress.co.uk',
                    description : 'This is the description',
                    picture : '/voucher_valid.png'
                };

                var referees = $("#fbid").val();

                // remove last comma and space from the end of the string
                referees = $.trim(referees);
                referees = referees.substring(0, referees.length - 1);

                var referee = referees.split(',');
                referee.each(function() {

                    FB.api('/'+ referee +'/feed', 'post', opts, function(response)
                    {
                        if (!response || response.error)
                        {
                            alert('Posting error occured');
                        }
                        else
                        {
                            alert('Success - Post ID: ' + response.id);
                            $("#send-voucher").hide();
                            $("#voucher-sent").fadeIn('slow');
                        }
                    });
                });
            });
        }
        else
        {
            alert('Not logged in');
        }
    }, { scope : 'publish_stream' });
};

クリックしてバウチャーを送信すると、else上記のステートメントのアラートダイアログからエラーが発生します。

Posting error occured

ループを開いた後にこれが発生した理由を確認するために、別のアラートを追加しました。

$.each(referee, function() {
    referee = $.trim(referee);
    alert(referee); // new alert for debugging
    ....

このアラートの出力は、の値として私を驚かせましたreferee12345, 567890非表示の入力と同じですが、末尾のスペースと最後のコンマが削除されています)。

したがって、jQueryは正しく分割されていないようですが、アラートボックスが2回ポップアップしてレフリーとエラーを通知するため、ループが正しい回数実行されます。(明確にするために、両方のアラートボックスが2回表示されます)。これが偶然の一致である場合は、非表示の入力にIDを追加しようとしましたが、アラートボックスにIDの数と同じ回数が表示されていることを確認できます。

ループが正しい回数実行されるので、何を間違えたのか疑問に思いましたが、コンマで区切られたIDはまったく分割されていないようです。

4

3 に答える 3

2

referee.each(function()refereejQueryオブジェクトではなく、という名前の配列で呼び出されています。

$.each(referee, function()代わりに試してください。

http://api.jquery.com/jQuery.each/

アップデート

.split代わりに正規表現を使用して、違いが生じるかどうかを確認することもできます。

var referee = referees.split(/\s*,\s*/);

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split

于 2012-05-04T12:23:35.583 に答える
1

refereeプログラムには分割された文字列のリストがあり、「各ループ」内ではインスタンスの代わりにリストを使用します。交換してみてください:

FB.api('/'+ referee +'/feed', 'post', opts, function(response)

FB.api('/'+ $(this) +'/feed', 'post', opts, function(response)
于 2012-05-04T12:23:52.800 に答える
1

コードにはいくつか問題があります。.each()他の人が述べたように、存在しないメソッドを使用して配列をループしています。代わりに標準for()ループを使用できます。また、正規表現を使用して空白と余分なコンマを削除する方がはるかに効率的です。

これは簡略化された例で、http://jsfiddle.net/hJQ6W/でも入手できます。

<input id="fbid" type="hidden" value="12345, 567890, ">
<script>
  var referees = $("#fbid").val();
  // trim string and remove all commas from the end of it
  referees = referees.replace(/\s/g,'').replace(/,*$/,'');
  var referee = referees.split(',');
  for(i=0; i<referee.length; i++) {
    alert('"'+referee[i]+'"');
  }
</script>
于 2012-05-04T14:14:41.453 に答える