使用ajax和json响应在客户端和服务器之间进行交互

时间:2016-05-15 17:56:13

标签: php jquery ajax

我有一个网站,我正在建设,允许消费者订购食物。用户将按照他们的邮政编码(UK)搜索,例如A1 1AA。一旦他们按邮政编码搜索,就会出现送到他们所在地区的餐馆。

我目前正在结帐页面,我想阻止用户输入一个邮政编码,说餐馆也不提供。我想在用户按邮政编码字段输入的那一刻这样做。

我只是不知道如何做到这一点,我已经在一些帖子之后放了一些ajax(见下面,第一次使用ajax所以请原谅我,如果它的马虎)这样做,我知道它不是完成,但我不知道从哪里开始。

我有一个包含用户区和邮政编码的字符串网址。我还有一个数据库,上面有餐馆提供的邮政编码,我想做一些事情,如果餐厅没有送到邮政编码进入回声“对不起,这家餐厅不送货到A1。”。

我试图使用AJAX和Jquery

来实现这一点

代码

<div id="container">
 <form id="myform" name='myForm'>
    <input type="text" id='doorno' name="doorno" value="" placeholder="e.g. 2a" min="1" >
   <input type="text" id='addlin1' name="addlin1" value="" placeholder="e.g. Brunel Hall">
  <input type="text" id='addlin2' name="addlin2" value="" ><br>
  <input type="text" id='city' name="city" value="" >

  <input type="text" id='postal' name="postal" value="" placeholder=""><br>
</form>


<div id='ajaxDiv' style="background-color:red">Your result will display here</div>

$(function() {
  $("#container").keypress(function (e) {
  if (e.which == 13) {
  e.preventDefault(); // this prevents the default action of a enter 
    $.post('ajax-example.php',$("#myform").serialize() ,  function(response) { 
  $('#ajaxDiv').html(response); // this will echo any response from ajax file
       });
     }   
  });
}); 

我刚刚在Jquery中尝试过它。它几乎完美地工作除了它不能在按键上工作但是onclick,但我不知道如果$ _POST ['postal']不等于$ postcode(用户邮政编码变量) string url)/餐厅提供给我的数据库中的列的邮政编码

$(function(){

$('input[name="postal"]').click(function(){
 alert('Hello...!');
 });

$('#city').keypress(function (e) {
var key = e.which;
  if(key == 13)  // the enter key code
     {
$('input[name = postal]').click();
     return false;  
         }
     });

});

3 个答案:

答案 0 :(得分:0)

对于jQuery;您可能想尝试这种方法,看看它是否符合您的要求:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
    <script type="text/javascript">
        (function($) {
            $(document).ready(function(){


            $(document).keypress(function(e) {
                if(e.which == 13) {
                    if($(":focus").get(0) == $('input[name = postal]').get(0) ){
                        // DO WHATEVER YOU WANT TO DO HERE
                        // BECAUSE ENTER WAS PRESSED INSIDE OF THE FIELD WITH THE NAME postal
                        // FOR TESTING... ALERT SOMETHING...
                        alert("Sure, you pressed the Enter Key inside of the Postal Field...");
                    }
                }
            });

            });
        })(jQuery);
    </script>

您可以在此处测试并完成它:https://jsfiddle.net/csqsLmxh/

好的,所以这就是它们如何联系在一起。

JAVASCRIPT:JQUERY

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
    <script type="text/javascript">
        (function($) {
            $(document).ready(function(){


            $(document).keypress(function(e) {
                if(e.which == 13) {
                    if($(":focus").get(0) == $('input[name = postal]').get(0) ){
                        // SEND OUT AN AJAX REQUEST TO THE PHP-SCRIPT ON THE SERVER
                        // HERE WE ARE SIMPLY SAYING:
                        // ONCE THE USER FINISHES TYPING INSIDE THE POSTAL FIELD & HITS ENTER
                        // GO TO THE SERVER AND ASK THE SCRIPT: ajax.processor.php TO USE THE
                        // POSTED POSTAL CODE & CITY TO SEARCH FOR THE NEAREST AVAILABLE RESTAURANT...
                        // IN THIS CASE WE USE JSON, JUST IN CASE WE MAY WANT TO SEND BACK A COLLECTION OF DATA...
                        // AND SO OUR AJAX GOES LIKE THIS:
                        $.ajax({
                            url: "./ajax-processor.php",
                            dataType: "json",    //<== CHANGE TO "HTML" IF YOU ARE EXPECTING HTML DATA.
                            cache: false,
                            type: "POST",
                            data: ({
                                postal  : $("#postal").val(),
                                city    : $("#city").val()
                            }),

                            success: function (data, textStatus, jqXHR) {
                                // IF OUR AJAX CALL SUCCEEDS AND THUS RETURNS SOME RESULTS
                                // IN THIS CASE JSON, WE CAN USE IT TO UPDATE THE #ajaxDiv...
                                // HOWEVER IF WE ARE EXPECTING JUST HTML WE WILL GO A DIFFERENT ROUTE IN THE SUCCESS HANDLER...
                                // PLEASE, NOTE THAT YOU MAY NOT HAVE BOTH JSON & HTML SIMULTANEOUSLY
                                // THIS IS AN "EITHER-OR" CASE HERE:
                                // SO IF YOU EXPECT HTML, YOU ARE ADVISED TO 
                                // EITHER DELETE OR COMMENT-OUT FROM THE BEGINNING 
                                // TO THE END OF JSON HANDLING LOGIC BELOW & VICE-VERSA
                                if(data){
                                    // ##BEGINNING OF JSON HANDLING...## //
                                    if(data.restaurant){
                                        var output = "<em>Restaurant: </em><strong>" + data.restaurant + "</strong>"; 
                                        output    += "<br /><em>Take-Away: </em><strong>" + data.takeAway + "</strong>"; 
                                        $("#ajaxDiv").html(output );
                                    }
                                    // ## END OF JSON HANDLING... ## //

                                    // ##BEGINNING OF HTML HANDLING...## //
                                        $("#ajaxDiv").html(data);  <== JUST UPDATE THE DIV WITH THE RAW DATA FROM THE RESPONSE... IT IS EITHER HTML OR STRING OR NUMERIC DATA...
                                    // ##END OF HTML HANDLING...## //
                                }
                            },

                            error: function (jqXHR, textStatus, errorThrown) {
                                console.log('The following error occured: ' + textStatus, errorThrown);
                            },

                            complete: function (jqXHR, textStatus) {
                            }
                        });
                    }
                }
            });

            });
        })(jQuery);
    </script>

<强> HTML

    <html>
    <body>
    <div id="container">
        <form id="myform" name='myForm'>
            <input type="text" id='doorno' name="doorno" value="" placeholder="e.g. 2a" min="1" >
            <input type="text" id='addlin1' name="addlin1" value="" placeholder="e.g. Brunel Hall">
            <input type="text" id='addlin2' name="addlin2" value="" ><br>
            <input type="text" id='city' name="city" value="" >
            <input type="text" id='postal' name="postal" value="" placeholder=""><br>
        </form>


        <div id='ajaxDiv' style="background-color:red">Your result will display here</div>
    </body>

    </html>

<强> PHP

    <?php

        // FILENAME: ajax-processors.php        <== MUST MATCH THE URL WE DECLARED IN THE AJAX DEFINITION (JS)
        $postal     = isset($_POST['postal'])   ? htmlspecialchars(trim($_POST['postal']))  : null;
        $city       = isset($_POST['city'])     ? htmlspecialchars(trim($_POST['city']))    : null;
        // RUN YOUR QUERIES AND DO ALL YOUR MAGIC USING THE POSTED $postal & $city
        // TO DETERMINE WHICH DATA ARE RELEVANT TO BE RETURNED...
        // ASSUMING IN THE END YOUR QUERIES RETURNED SAY 2 RESULTS LIKE Derby Inn, Kings Pizza.
        // YOU CAN THEN BUNDLE THE RESULTS INTO AN ARRAY (IF IT IS NOT ALREADY AN ARRAY OR OBJECT) LIKE SO:
        $arrResponse = array(
            "restaurant"    => "Derby Inn",
            "takeAway"      => "Kings Pizza",
        );
        // HOWEVER, THIS IS NOT NECESSARY IF YOU ARE SENDING BACK ONLY A STRING VALUE... 
        // IN THE CASE OF A STRING VALUE (SAY, JUST "Kings Pizza")
        // YOU COULD JUST DO IT OTHERWISE. LIKE THIS:
        /* die("Kings Pizza"); */

        // IF YOU DID IT LIKE THIS, BE SURE TO CHANGE YOUR THE "dataType" ATTRIBUTE 
        // IN YOUR AJAX FROM *JSON* TO **HTML** AND ALSO TO HANDLE THE SUCCESS
        // CALLBACK DIFFERENTLY... ***SEE THE JAVASCRIPT SECTION FOR COMMENTS***


        // NOW WE ARE DONE... ALL WE NEED DO IS SEND THIS RESPONSE BACK TO THE SCRIPT AS JSON LIKE SO:
        die( json_encode($arrResponse));

        // ALTHOUGH THERE ARE NO REAL QUERIES HERE OR ANY PROCESSING LOGIC, 
        // THIS SCRIPT WILL STILL RUN & SEND BACK JSON DATA TO THE JAVASCRIPT 
        // DOUBT IT? THEN TRY IT....

答案 1 :(得分:0)

据我了解,您在这里尝试在输入字段上添加一个按键处理程序。 此处理程序将发出一个发布请求,并将验证是否可以在指定的邮政编码中进行交付。 如果是这种情况,那么最好使用模糊处理程序而不是按键。 因为按键将触发服务器对按下的每个键的请求,即如果用户输入5位数的邮政编码,例如AA110然后将发送5次请求,这是不必要的。

答案 2 :(得分:0)

在与您交谈后,我了解到您已成功完成

  1. 按Enter键,您向数据库发送了一个查询
  2. 然后从数据库发送过程并发送错误消息,如果邮政编码不匹配
  3. 现在你想知道.howt处理在post回调函数中从数据库发送的没有传递错误消息,以便向用户提供警报或通知 为此,我举了一个小例子 在根目录中创建两个文件Example.phpExample.html,并在浏览器类型中将每个文件内容从此处复制到其中 localhost/Example.html每次运行输出更改的文件时都按下输入通知。
  4. 从php到html页面的数据是使用json格式发送的,这对将来很有用。第一个要发送的数据被插入一个关联数组 然后使用服务器端的json_encode()函数将其编码为json格式 JSON.parse()方法用于解析此处获取的json格式数据,使用jsonobjectname.keyName访问json对象的值以获取从服务器发送的值。

    以防万一

    var returned = JSON.parse(data)
                console.log(returned.Key); 
    

    这些行解释了它

    顺便说一下,当关联数组转换成json格式时,它看起来像这样

    $result = array("Key"=>"1");
    echo json_encode($result);
    {"Key":"1"}
    

    Here is document of json_encode function

    另一件事我使用随机变量生成器函数rand()来模拟循环的真假条件。

    <强>使用example.php

    <?php 
    $trueorfalse = rand(0, 1);
    if($trueorfalse){//your condition if there is delivery
    $result = array("Key"=>"1");
    echo json_encode($result);
    }else{//your condition if there is no delivery
    $result = array("Key"=>"0");
    echo json_encode($result);
    }
    
    ?>
    

    <强> example.html的

    <html>
    
    <head>
    <script src="http://code.jquery.com/jquery-latest.min.js"
            type="text/javascript"></script>
            <script type="text/javascript">
            $(document).ready(function(){
            $.post("/NTD.php",function(data){
            console.log(data);
            var returned = JSON.parse(data)
            console.log(returned.Key);
    
            if(returned.Key==0){
             $("#NotifcationDiv").html("There is no shipping to your region");
            alert(returned["Key"]+"No delivery");
    
    }
            })
    
            });
            </script>
    </head>
    <body>
    <p id="NotifcationDiv"></p>
    </body>
    </html>
    

    免责声明:对于迟到我很抱歉我看到了OP问题,并且说明了从服务器到客户端的json和php交互的一个简单示例,我只是这样,以后只发布了另一个答案