聊天机器人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>