0

以下のコードには、ターゲットURLを持つXMLHTTPRequestがありtest_location_jquery.php、成功関数がトリガーされても、このファイルにアクセスすることはありません。テストのために単独で実行するtest_location_jquery.phpと、期待どおりにJSONオブジェクトが正常に返されます。ファイルにアクセスしていないときに成功関数をトリガーする方法についてのアイデアをいただければ幸いです。

JQUERY

<?php

    require_once '../meta/php/dbConn.php';

    $charlie_query = "";
    $charlie_result = "";

    $charlie_query = "
        SELECT  ud.user_id as 'id',
                concat(ud.last_name,', ',ud.first_name) as 'name'
        FROM    `user_detail` AS ud,
                `user_type` AS UT
        WHERE ud.user_type = ut.id
        AND ut.class IN ('charlie')
        AND ut.level IN (4)
        ORDER BY ut.class;
    ";
    $charlie_result = mysql_query($charlie_query);
    
    if(!(bool)$charlie_result){
        throw new Exception();
    }

?>

<html>
<head>

    <script src="../meta/js/jquery-1.7.2.js"></script>
<!-- <script src="../meta/js/getXML_sir.js"></script>  -->
    <script>
        $(document).ready(function(){
            $('#charlie').change(function(){
                var charlie_id =  $('#charlie option:selected').val();
                var DT = "json";

                $.post(
                        'test_location_jquery.php',
                        {'id':charlie_id,'datatype':DT},
                        function(data){
                            alert('Success');
                            var obj = $.parseJSON(data);
                        }
                );
                
                if(obj != 'undefined'){
                    var locations = obj.find('location');
                    console.log(locations);
                }else{
                    alert("failure");
                }

            })
        })
            
    </script>

</head>
<body>

    <form>
        <label>Charlie: </label><select id="charlie" name="charlie">
            <option>&nbsp;</option>
        <?php
            while($row = mysql_fetch_assoc($charlie_result)){
                print("<option value='".$row['id']."'>".$row['name']."</option>");
            } 
        ?>
        </select>
        <label>Location: </label><select id="location" name="location"></select>
    </form>
    
    <div></div>
    
</body>
</html>

test_location_jquery.php

<?php

require_once("../meta/php/dbConn.php");

if(!isset($_POST)){
    throw new Exception();
}else{
    $id = $_POST['id'];
    $datatype = $_POST['datatype'];
}

$query = "
        SELECT  l.id as 'id',
            ld.attribute_string as 'name'
        FROM    `location` AS l,
                `location_details` AS ld
        WHERE l.id = ld.location_id
        AND     ld.attribute_label = 'name'
        AND l.id = ".$id.";
";
$result = mysql_query($query);

if(!(bool)$result){
    throw new Exception();
}else{
    switch($datatype){
        case 'xml':
        break;
        case 'json':
            $rows = array();
            while($r = mysql_fetch_assoc($result)) {
                $rows[] = $r;
            }
            return json_encode($rows);
        break;
}


?>
4

2 に答える 2

4

関数.post()は非同期です。つまり、呼び出す.post()だけで投​​稿が開始されます。その後の行は、post()が完了する直前、および成功ハンドラーが呼び出される前に実行されます。

次に、しばらくして、成功ハンドラーが呼び出されます。

投稿からの応答を使用するすべてのコードは、成功ハンドラーにあるか、成功ハンドラーから呼び出される必要があります。

.post()したがって、問題は、このコードが配置されている成功ハンドラー(呼び出しの直後)でデータセットを参照できないことです。このコードを成功ハンドラー自体の中に入れる必要があります。

            if(obj != 'undefined'){
                var locations = obj.find('location');
                console.log(locations);
            }else{
                alert("failure");
            }

したがって、それを実行すると、コードは次のようになります。

<script>
    $(document).ready(function(){
        $('#charlie').change(function(){
            var charlie_id =  $('#charlie option:selected').val();
            var DT = "json";

            $.post(
                    'test_location_jquery.php',
                    {'id':charlie_id,'datatype':DT},
                    function(data){
                        alert('Success');
                        var obj = $.parseJSON(data);
                        if(obj != 'undefined'){
                            var locations = obj.find('location');
                            console.log(locations);
                        }else{
                           alert("failure");
                        }
                    }
            );


        })
    })

</script>
于 2012-04-26T02:07:35.367 に答える
0

これは機能するはずです。

                     $.post(
                        'test_location_jquery.php',
                        {'id':charlie_id,'datatype':DT},
                        function(data){
                            alert('Success');
                            var obj = $.parseJSON(data);
                            if(obj != 'undefined'){
                             var locations = obj.find('location');
                                  console.log(locations);
                             }else{
                                alert("failure");
                             }
                        }
                );

Ajaxは非同期であるため、ページが完全に呼び出されるまでobj変数は存在しませんでした。したがって、function(data)内に配置すると、呼び出しが完全に行われた後にのみ続行され、変数が存在するようになります。

于 2012-04-26T02:10:47.970 に答える