2012-03-15 7 views
0

私は以下のようなエラーがあり、実際の苦労を始めています。Jqueryポストでの苦しいjqueryエラー

エラーが表示された行に何らかの理由でpostDataが定義されていません。しかし、私はpostDataを定義し、get.phpから返されたjsonでそれを設定しました??ここに欠けているものがありますか?あなたはポストの成功ハンドラ内でそれを定義しているので、コールバックの外側

<script> 
function postToFeed(shoeID) { 

    $.post("get.php",{id: shoeID}, 
       function(data){ 
           var postData = data; 
           }, "json"); 

    var obj = { 
     method: 'feed', 
     link: 'https://developers.facebook.com/docs/reference/dialogs/', 
     picture: 'http://fbrell.com/f8.jpg', 
     name: postData.title, //ERROR 
     caption: '<?=SHARE_CAPTION?>', 
     description: postData.description //ERROR 
    }; 

    function callback(response){ 
     if(response['post_id']){ 
      $.post("vote.php",{id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', shoe: shoeID, type: 'share'}, 
          function(score){ 
          $("#shoe_"+shoeID).html(score) 
          }); 
     } 
    } 

    FB.ui(obj,callback); 
    } 
</script> 
+1

おそらくgoogling _ "javascript scope" _があなたにもっと役立つかもしれません。 – gdoron

+0

呼び出しは非同期ですか?そうであれば、実際には答えはありません。 – pimvdb

答えて

2

は、それにはアクセスできません。外側のスコープにpostDataを定義すると正常に動作します。

function postToFeed(shoeID) { 
    var postData;// 
    $.post("get.php",{id: shoeID}, 
       function(data){ 
           postData = data; 
           }, "json"); 

.... 
.... 

もう1つ注意してください。 $.postを使用するとajaxが非同期に呼び出されるため、外側のスコープにpostDataを定義しても、ポストリクエストが実行されるまで、postDataがnullまたは空であるため動作しません。

したがって、残りのコードは成功ハンドラ$.postの中で実行する必要があります。これを試して。

function postToFeed(shoeID) { 

    $.post("get.php",{id: shoeID}, function(data){ 
     var postData = data; 
     var obj = { 
      method: 'feed', 
      link: 'https://developers.facebook.com/docs/reference/dialogs/', 
      picture: 'http://fbrell.com/f8.jpg', 
      name: postData.title, //ERROR 
      caption: '<?=SHARE_CAPTION?>', 
      description: postData.description //ERROR 
     }; 

     function callback(response){ 
     if(response['post_id']){ 
      $.post("vote.php",{id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', shoe: shoeID, type: 'share'}, 
          function(score){ 
          $("#shoe_"+shoeID).html(score) 
          }); 
     } 
     } 

     FB.ui(obj,callback); 

    }, "json"); //$.post-End 

} 
2

移動POSTDATAそれはobj内部にアクセスできるように..

var postData; 
$.post("get.php",{id: shoeID}, 
      function(data){ 
       postData = data; 
      }, 
      "json"); 
1

あなたがちょうどあなたのコードを少し再配置する必要が

<script> 
var postData; 
function postToFeed(shoeID) { 


$.post("get.php",{id: shoeID}, 
      function(data){ 
          postData = data; 
          }, "json"); 

var obj = { 
    method: 'feed', 
    link: 'https://developers.facebook.com/docs/reference/dialogs/', 
    picture: 'http://fbrell.com/f8.jpg', 
    name: postData.title, //ERROR 
    caption: '<?=SHARE_CAPTION?>', 
    description: postData.description //ERROR 
}; 

function callback(response){ 
    if(response['post_id']){ 
     $.post("vote.php",{id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', shoe: shoeID, type: 'share'}, 
         function(score){ 
         $("#shoe_"+shoeID).html(score) 
         }); 
    } 
} 

FB.ui(obj,callback); 
} 
</script> 
0

を、内部機能でそれを定義する外部のそれを定義してのみ、その関数に値を割り当てないでください。

function postToFeed(shoeID) { 
    function callback(response) { 
     if (response['post_id']) { 
      $.post("vote.php", { 
       id: '<?=(isset($_POST['fbid'])? $_POST['fbid'] : $data['id'])?>', 
       shoe: shoeID, 
       type: 'share' 
      }, function(score) { 
       $("#shoe_" + shoeID).html(score) 
      }); 
     } 
    } 

    $.post("get.php", { 
     id: shoeID 
    }, "json").done(function(postData){ 
     var obj = { 
      method: 'feed', 
      link: 'https://developers.facebook.com/docs/reference/dialogs/', 
      picture: 'http://fbrell.com/f8.jpg', 
      name: postData.title, 
      caption: '<?=SHARE_CAPTION?>', 
      description: postData.description 
     }; 
     FB.ui(obj, callback); 

    }); 
}​ 

どのようにobjが作成され、が元の$.post()doneの後にのみ呼び出されることに注意してください。