2011-08-15 7 views
1

私はよく調べて遊んできましたが、私は困惑しています。基本的に私は自分のサイトをセットアップして、ユーザーが「ログイン」しているかどうかを検出し、それによって見た目を変えることができるようにします。「サインイン」リンクを削除し、「サインアウト」リンクなどで置き換えます。テスト目的のために

は、私は私のindex.htmlページを開始しました:次

<?php 
session_start(); 
$_SESSION["username"]="javaman"; 
?> 

、私はjqueryのdocument.readyの中から私のsetup関数を呼び出します。

$(document).ready(function() { 
    setup_page(); 
}; 

セットアップ機能がどのように見えます次のようになります。

function get_user() 
{ 
    var result; 

    $.post("./session.php", {action : "get", key : "username", value : "val"}, function(data){ 
      result = data; 

     }); 

    return result; 
} 

session.phpは、3つのポスト値をとり、うまくいけば適切な結果を吐くという単純なアプリケーションです。私が実行している問題は、js結果変数がしばしば未定義であることです。 IEの開発ツールバー。 FFでもOKです。私は正しい方法でコールバックを使用していますか?私はalert()関数をどこにでも置いてみたところ、コードがどこにあるのか解明しようとしましたが、警告が結果が定義されていないとしばしば助けになりません。その間、get_userがpost関数を呼び出すようですが、スタックはすぐに戻り、get_userが..の値を返した後までreturn文に到達しません。ここでコードの流れを誤解していると思います。私は論理的に1つの関数が別の関数をたどるCに慣れています。その中で私はコールバックを本質的に以下のように解釈しています:

int i = callback_function(post( "some data"));

私の考えでは、投稿はアクションを完了してから別の関数を呼び出すか、少なくとも別のアクションを実行してから完了すると、get_userはその値を返すことができます。

操作の順序は:post、get_user、コールバック?シアトル

に混乱

...
+0

セキュリティで保護されていないjs al allを使用しないで、セッションをphpでチェックし、適切にページを構築します。 –

答えて

0

Internet Explorerは、ネイティブ配列にindexOfをサポートしていません。代わりにjQueryの$.inArray()を使用します。

var index = $.inArray("error", username); 
+0

ああ、ありがとう! IEがサポートするものとサポートしないものを指定するリソースはありますか?または、jQueryには、できるだけ多くのブラウザをサポートするためにどのような機能を使用するかに関するドキュメントがありますか? – Steve

+0

多くのリソースがあります。現時点では具体的なことは考えられません。 P.S.私の答えがあなたの問題を解決したら、それを正しい答えとして受け入れます - 私の答えの左側にあるチェックマークをクリックして - この投稿に来る他の人々がこれが正解であることを知るようにします。 –

+0

@Steve indexOf関数は、jqueryとは何の関係もないネイティブのjavascript関数です。愚かなIEの欠陥は完全に。 –

0

は、AJAXが非同期 JavascriptとXMLの略であることに留意してください。コールバックは応答が来るとすぐに起動しますが、残りの実行は継続します。あなたはAJAXリクエストが完了されるまで実行をロックしたい場合は、AJAX呼び出しの前に

$.ajaxSetup({async:false}); 

を使用しています。

+0

だから、私はサイトがajaxが完了するまで待つ必要があるときはいつでも、ajaxSetupを使う必要がありますか?私がそれを使用すると、$ .ajaxSetup({async:true})にする必要があります。すぐ後で? – Steve

+0

どちらか、または** async **オプションで$ .ajax()を使用してください。 – Hnatt

+0

$ .post()は$ .ajax()の省略形ですが、 'post'呼び出しに' async:false'オプションを追加することもできます。 – Hnatt