Web前端-JavaScript--ajax案例

聊天机器人Array版

 需求:
            点击按钮发送消息  实现聊天


        步骤:
            1.获取元素 #send  #inp  #msglist
            2.按钮点击事件 获取输入框内容
            3.创建本次发送的聊天框div 拼接到msglist里面去
            4.将本次发送的聊天 调用ajax发送给服务器
            5.服务器返回机器人说的话
            6.根据机器人说的话  创建聊天框  拼接到msglist里面

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;

        }
      html,body{
          height: 100%;
      }
        #box{
            width: 400px;
            height: 98%;
            border: 1px solid #e4393c;
            margin:0 auto;
            background: url("bg.jpg") no-repeat 0 0/100% 100%;
        }
        #msglist{
            height: 80%;
            overflow: auto;
        }
        #content{
            height: 20%;
        }
        #inp,#send{
            vertical-align: top;
            height: 100%;
            border: none;
            outline: none;
        }
        #inp{
            width: 70%;
            font-size:40px;
        }
        #send{
            width: 30%;
            background-color: #e4393c;
            color:white;
            font-size:35px;
        }
        #send:active{
            background-color: #d00000;
        }
        #msglist>div{
            height: 35px;
            padding: 0 20px;
            line-height: 35px;
            font-weight:700;
            border-bottom: 1px dotted hotpink;
        }
        #msglist>.own{
            text-align: right;

            background-color: rgba(255, 255, 255, 0.4);

        }
        #msglist>.robot{
            background-color: rgba(255, 0, 0, 0.4);
            border-bottom: 1px dotted #e4393c;
            color: white;
        }






    </style>
</head>
<body>
<div id="box">
    <div id="msglist">
 <!--       <div class="own">你好</div>
        <div class="robot">我不好</div>-->



    </div>
    <div id="content">
        <input type="text" id="inp"><button id="send">发送</button>


    </div>




</div>
<script>


    var ownChat="own";
    var robotChat="robot";



//    1.获取元素 #send  #inp  #msglist
    var send=document.getElementById("send");
    var inp=document.getElementById("inp");
    var msglist=document.getElementById("msglist");

//    2.按钮点击事件 获取输入框内容
    send.onclick=function () {
        var val=inp.value;
        if(val==""){
            alert("发送的内容不能为空!");
            return;

        }
//        3.创建本次发送的聊天框div 拼接到msglist里面去
        setChat(ownChat,val);
//        每次发送完 都把  输入框清空
        inp.value="";

//        4.将本次发送的聊天 调用ajax发送给服务器
        ajax_tools({
            url:"php/02.chatServerByArray.php",
            type:"post",
            data:"chatcontent="+val,
            success:function (res) {
                // 5.服务器返回机器人说的话
//                console.log(res.responseText);

//                6.根据机器人说的话  创建聊天框  拼接到msglist里面
                   setChat(robotChat,res.responseText);
            }

        })




    }

//    把创建聊天框的功能 封装成方法
    function setChat(className,content) {
        var ownDiv=document.createElement("div");
        ownDiv.setAttribute("class",className);
        ownDiv.innerHTML=content;
        msglist.appendChild(ownDiv)
//        每次新创建出div就要让  msgList显示到最底部
//        手动设置 msglist被卷去的头部 等于  整个内容的高度
        //那就表示始终卷到头  也就是始终显示底部
        msglist.scrollTop=msglist.scrollHeight;


    }

    function ajax_tools(settings) {
        if(!settings.url){
            return;
        }

        var ajaxObj=new XMLHttpRequest();

        if(settings.type && settings.type.toUpperCase()=="POST"){
//            匹配到这 只有这么几个值:  post  POST  Post poSt....

            ajaxObj.open(settings.type,settings.url);
            ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            if(settings.data){
                ajaxObj.send(settings.data);
            }else{
                ajaxObj.send();
            }


        }else{
//            其他一切情况 直接暴力的 把它该成  get方式
            settings.type="get";
            if(settings.data){
                settings.url=settings.url+"?"+settings.data;

            }
            ajaxObj.open(settings.type,settings.url);
            ajaxObj.send();
        }
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
                if(typeof settings.success=="function"){
                    settings.success(ajaxObj);

                }

            }
        }


    }
</script>

</body>
</html>

php

<?php
    header('Content-type:text/html;charset=utf-8');


    if(!isset($_POST["chatcontent"])){
        echo "你还未发送你要说的话!";
        return;
    }


   $chatcontent= $_POST["chatcontent"];


    $chatArr=array(
        "你好"=>array("我不好","不借钱","爱过","不健身","很不好","你走..."),
        "你吃了没"=>array("你请客熬?","没钱..","吃不起","双十一刚过..","猪肉炖粉条","肘子肉"),
        "再见"=>array("再也不见","一个以为不会走","一个以为会挽留","跪安吧..","卡其嘛","滚吧.."),
        "你多大了"=>array("你要干啥","我洗澡去了","不是本人","帮忙挂微信的","[自动回复]你说啥?")

    );
    $defaultArr=array("你说啥呢?","你们人类的世界我不懂","请再说一遍.","你瞅啥","铁憨憨..");


      //延迟2秒执行 模拟接收信息慢  time()函数获取当前时间
         time_sleep_until(time()+1.5);


//    判断发送的关键字在数组中是否存在
    if(array_key_exists($chatcontent,$chatArr)){

        //array_rand  表示随机从数组所有角标中 取出一个或多个
        $arr=$chatArr[$chatcontent];
//        取出一个随机角标
         $ranNum= array_rand($arr);

        echo $arr[$ranNum];
    }else{

        $ranNum= array_rand($defaultArr);

      echo $defaultArr[$ranNum];



    }






?>

聊天机器人json版

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;

        }
      html,body{
          height: 100%;
      }
        #box{
            width: 400px;
            height: 98%;
            border: 1px solid #e4393c;
            margin:0 auto;
            background: url("bg.jpg") no-repeat 0 0/100% 100%;
        }
        #msglist{
            height: 80%;
            overflow: auto;
        }
        #content{
            height: 20%;
        }
        #inp,#send{
            vertical-align: top;
            height: 100%;
            border: none;
            outline: none;
        }
        #inp{
            width: 70%;
            font-size:40px;
        }
        #send{
            width: 30%;
            background-color: #e4393c;
            color:white;
            font-size:35px;
        }
        #send:active{
            background-color: #d00000;
        }
        #msglist>div{
            height: 35px;
            padding: 0 20px;
            line-height: 35px;
            font-weight:700;
            border-bottom: 1px dotted hotpink;
        }
        #msglist>.own{
            text-align: right;

            background-color: rgba(255, 255, 255, 0.4);

        }
        #msglist>.robot{
            background-color: rgba(255, 0, 0, 0.4);
            border-bottom: 1px dotted #e4393c;
            color: white;
        }






    </style>
</head>
<body>
<div id="box">
    <div id="msglist">
 <!--       <div class="own">你好</div>
        <div class="robot">我不好</div>-->



    </div>
    <div id="content">
        <input type="text" id="inp"><button id="send">发送</button>


    </div>




</div>
<script>

    var ownChat="own";
    var robotChat="robot";



//    1.获取元素 #send  #inp  #msglist
    var send=document.getElementById("send");
    var inp=document.getElementById("inp");
    var msglist=document.getElementById("msglist");

//    2.按钮点击事件 获取输入框内容
    send.onclick=function () {
        var val=inp.value;
        if(val==""){
            alert("发送的内容不能为空!");
            return;

        }
//        3.创建本次发送的聊天框div 拼接到msglist里面去
        setChat(ownChat,val);
//        每次发送完 都把  输入框清空
        inp.value="";

//        4.将本次发送的聊天 调用ajax发送给服务器
        ajax_tools({
            url:"php/03.chatServerByJson.php",
            type:"post",
            data:"chatcontent="+val,
            success:function (res) {
                // 5.服务器返回机器人说的话
//                console.log(res.responseText);

//                6.根据机器人说的话  创建聊天框  拼接到msglist里面
                   setChat(robotChat,res.responseText);
            }

        })




    }

//    把创建聊天框的功能 封装成方法
    function setChat(className,content) {
        var ownDiv=document.createElement("div");
        ownDiv.setAttribute("class",className);
        ownDiv.innerHTML=content;
        msglist.appendChild(ownDiv)
//        每次新创建出div就要让  msgList显示到最底部
//        手动设置 msglist被卷去的头部 等于  整个内容的高度
        //那就表示始终卷到头  也就是始终显示底部
        msglist.scrollTop=msglist.scrollHeight;


    }

    function ajax_tools(settings) {
        if(!settings.url){
            return;
        }

        var ajaxObj=new XMLHttpRequest();

        if(settings.type && settings.type.toUpperCase()=="POST"){
//            匹配到这 只有这么几个值:  post  POST  Post poSt....

            ajaxObj.open(settings.type,settings.url);
            ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded");
            if(settings.data){
                ajaxObj.send(settings.data);
            }else{
                ajaxObj.send();
            }


        }else{
//            其他一切情况 直接暴力的 把它该成  get方式
            settings.type="get";
            if(settings.data){
                settings.url=settings.url+"?"+settings.data;

            }
            ajaxObj.open(settings.type,settings.url);
            ajaxObj.send();
        }
        ajaxObj.onreadystatechange=function () {
            if(ajaxObj.readyState===4 && ajaxObj.status===200){
                if(typeof settings.success=="function"){
                    settings.success(ajaxObj);

                }

            }
        }


    }
</script>

</body>
</html>

php

<?php
    header('Content-type:text/html;charset=utf-8');
     if(!isset($_POST["chatcontent"])){
            echo "你还未发送你要说的话!";
            return;
     }


     $chatcontent= $_POST["chatcontent"];
//        模拟聊天时间延迟
     //延迟2秒执行 模拟接收信息慢  time()函数获取当前时间
       time_sleep_until(time()+1.5);
//    读取那个整个数据的json文件
      $dataStr= file_get_contents("json/data.json");
//       读取默认回复的那个json文件
        $defaultstr=file_get_contents("json/default.json");

//      把json字符串解码成  PHP变量
/*
        json_decode 第一个参数是要转换的json字符串
        第二个参数是布尔值  true表示转换成数组  false转换成对象
    */

//        json_decode
    $dataArr=json_decode($dataStr,true);
    $defaultArr=json_decode($defaultstr,true);



//    print_r($dataArr);

    //$dataArr 就是相当于原来我们的那个大的关系型数组


     if(array_key_exists($chatcontent,$dataArr)){

        $arr=$dataArr[$chatcontent];

         $ranNum= array_rand($arr);

        echo $arr[$ranNum];
    }else{

        $ranNum= array_rand($defaultArr);

      echo $defaultArr[$ranNum];


    }
?>

实现跟hao123内置的百度搜索候选词一样的效果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        input{
            vertical-align: top;
        }
        form{
            width: 700px;
            height: 40px;
            background-color: #317EF3;
            margin: 150px auto 0;

        }
        #content{
            height: 38px;
            border: none;
            outline: none;
            width: 600px;
            margin-top: 1px;
            margin-left: 1px;
            font-size: 18px;
            text-indent:10px;


        }
        button{
            border: none;
            outline: none;
            width: 99px;
            height: 40px;
            background-color: #317EF3;
            vertical-align: top;
            color: white;
            font-size: 18px;
            cursor: pointer;
        }
        #box{
            /*background-color: red;*/
            overflow: hidden;
        }
        ul{
            list-style: none;
            width: 600px;
            /*margin: 0 auto;*/
            /*background-color: blue;*/
           position: absolute;
            left: 50%;
            margin-left: -350px;
            border: 1px solid #ccc;
            margin-top: -1px;

            display: none;
        }
        ul>li{
            height: 30px;
            text-indent: 10px;
            line-height: 30px;
            cursor: default;

        }
        ul>li:hover{
            background-color: #ccc;
        }



    </style>
</head>
<body>


<div id="box">
    <form action="https://www.baidu.com/s?tn=50000022_hao_pg&ie=utf-8&sc=UWd1pgw-pA7EnHc1FMfqnHRdrjnYP1R1Pj04niuW5y99U1Dznzu9m1YkPWDsrH6LPWfs&ssl_sample=normal&srcqid=3128286942589870639&f=3&rsp=3&H123Tmp=nunew7">
        <input autocomplete="off"  type="text" name="word" id="content"><button>百度一下</button>

    </form>
    <ul id="search">
        <!--<li>模拟百度搜索候选词不知道用什么来凑了</li>-->
        <!--<li>吼吼</li>-->
        <!--<li>模拟白</li>-->
    </ul>


</div>


<script src="jquery-1.11.1.js"></script>
<script>
    /*
        需求:
            实现跟hao123内置的百度搜索候选词一样的效果


            分析:
                oninput事件  调用百度接口 发送要搜索的词
                返回的数据渲染成li标签放到页面上 显示列表

                点击每一个li把内容放到输入框里面

            
            
              作业:
                时间: 半个小时   用JQ的跨域实现  CSS和html和js都要自己写
                  11月4日交

            
     */
//    JQ没有input事件 所以用js原生的
    $("#content").get(0).oninput=function () {

//        获取本次输入框的内容
        var val=$(this).val();
        if(val=="" || /^[A-Z]$/.test(val) || /^[a-z]$/.test(val)){
            //长度不够或者没有内容 有可能是没输入 也有可能 东西删除了

            $("#search").empty().hide();
//            如果当前输入框没有内容或者 内容是一个a字母 那么暂时不往下操作了
            return;

        }

        getData(val);
        
        
        
    }
    
    function getData(val) {
        //    每次要请求新结果之前先把老结果清空
        $("#search").empty();
        $.ajax({
            url:"https://www.baidu.com/sugrec?prod=pc&from=pc_web&wd="+val,
            dataType:"jsonp",
            jsonp:"cb",
            success:function (data) {
              var resultArr=data.g;
              if(!resultArr){
                    return;
              }
//              先把ul显示出来
              $("#search").show();



              for(var i=0;i<resultArr.length;i++){
//                  console.log(resultArr[i].q);
                  $("#search").append("<li>"+resultArr[i].q+"</li>")
                  
              }
            },

        })
        
    }


//    失去焦点把列表隐藏
    $("#content").blur(function () {
//        alert("失去焦点了哟!")
        $("#search").hide();


    })
//    获取焦点时 重新请求
    $("#content").focus(function () {
        //        获取本次输入框的内容
        var val=$(this).val();
        if(val=="" || val.length<2){
//            如果当前输入框没有内容或者 内容是一个a字母 那么暂时不往下操作了
            return;

        }

        getData(val)
    })

//    给每一个li添加点击事件 点击时 li的内容放上去
//    $("#search").on("click","li",function () {
//    因为点击事件 是在输入框的失去焦点事件之后执行 所以 一旦失去焦点li就隐藏了
    //再也无法触发点击事件 所以换成了 鼠标按下   这个事件是在 输入框的 失去焦点之前执行
    $("#search").on("mousedown","li",function () {
//        alert("本次点的内容:"+$(this).html())
        $("#content").val($(this).html())
        $("#search").hide();
    })



</script>


</body>
</html>

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值