Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

jQueryのajaxで詰まった

jQueryのajaxでちょっと詰まった箇所があったのでメモ



まず、jQueryの方の処理はこんな感じ。

$.ajax({
    type: 'post',
    url: base_url + '/target/url',
    data: {
        'data': 'true'
    },
    beforeSend: function(){
        $("#login_loading").show();
    },
    success: function(json){
        if(json == '1'){
            alert('success');
        }
        else{
            alert('fail');
        }
});

そしてこれを受けるphp側の処理はこんな感じです。

$ret = 1;
header("Content-Type: text/javascript; charset=utf-8");
echo Zend_Json::encode($ret);

詳細は省いていますが、
結果として0/1のみを返して、それに応じてjQuery側の処理を切り換える感じです。

が、これがうまくいかない。
条件判定で正しく判定されず、elseの方の条件になってしまう。

alert(json);
alert(typeOf(json));

試しに返ってくる値をチェックしましたが、
ちゃんと1でString型でした。
true/falseに切り換えたりもしましたがやはり変わらず。
何で条件判定うまくいかないだろうか……

今度は試しに返す値を配列化してみる。
こんな感じで、jQuery側も同様に対応。

$ret = array('result' => 1);
header("Content-Type: text/javascript; charset=utf-8");
echo Zend_Json::encode($ret);

すると今度は、処理自体が成功しなくなる。
ajaxが返ってきた時の関数呼び出し自体がうまくいってない模様。
(このとき、firefoxではエラー検出できなかったんですが・・・)

ふと、json形式を正しく解釈できていないのではないかと気付く。
そこでオプションの仕様を確認したところ・・・あった。データのタイプ指定が抜けていたのでそれを追加。

$.ajax({
    type: 'post',
    url: base_url + '/target/url',
    dataType: 'json', // データタイプの指定を追加
    data: {
        'data': 'true'
    },
    beforeSend: function(){
        $("#login_loading").show();
    },
    success: function(json){
        if(json == '1'){
            alert('true');
        }
        else{
            alert('false');
        }
});

このようにオプションを書き足したところ、無事解決しました。

どうも、単一の文字列をjsonでエンコードして返すと、
json型と指定していなくても途中まではうまくいくという仕様らしい。
変数を直接確認したら正常に渡しているかのように見えたからなかなか形式指定してない事に気付かずに詰まってしまっていた。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment