jQuery chatbot insertAfter父div

时间:2017-06-24 20:58:17

标签: jquery html parent chatbot

我有以下HTML

<div class="msg_box">
<div class="msg_head">
Jarvis
<div class="close">
  x
</div>
</div>
<div class="msg_wrap">
<div class="msg_body">
<div class="msg_insert"></div>
</div>
<div class="msg_footer">
<div class="input-group">
<input id="speech" type="text" class="form-control msg_input" 
placeholder="Type a message...">
<button id="rec" class="btn fa fa-microphone btn-custom" aria-hidden="true">
</button>
</div>
</div>
</div>
</div>

我希望在用户输入消息后显示聊天气泡

这是我有的jQuery

  var accessToken = "7f109c1f355c4e62815409938d71594f",
  baseUrl = "https://api.api.ai/v1/",
  $speechInput,
  $recBtn,
  recognition,
  messageRecording = "Recording...",
  messageCouldntHear = "I couldn't hear you, could you say that again?",
  messageInternalError = "Oh no, there has been an internal server error",
  messageSorry = "I'm sorry, I don't have the answer to that yet.";
  $(document).ready(function() {
  $speechInput = $("#speech");
  $recBtn = $("#rec");
  $speechInput.keypress(function(event) {
    if (event.which == 13) {
      event.preventDefault();
      var printmsg = $(this).val();
      send();
      $("<div class='msg_b'>" + printmsg + "
  </div>").insertBefore('.msg_insert');
    }
  });
  $recBtn.on("click", function(event) {
    switchRecognition();
  });
  $(".debug__btn").on("click", function() {
    $(this).next().toggleClass("is-active");
    return false;
  });
  });

  function startRecognition() {
  recognition = new webkitSpeechRecognition();
  recognition.continuous = false;
  recognition.interimResults = false;
  recognition.onstart = function(event) {
    respond(messageRecording);
    updateRec();
  };
  recognition.onresult = function(event) {
    recognition.onend = null;

    var text = "";
    for (var i = event.resultIndex; i < event.results.length; ++i) {
      text += event.results[i][0].transcript;
    }
    setInput(text);
    stopRecognition();
  };
  recognition.onend = function() {
    respond(messageCouldntHear);
    stopRecognition();
  };
  recognition.lang = "es-ES";
  recognition.start();
  }

  function stopRecognition() {
  if (recognition) {
    recognition.stop();
    recognition = null;
  }
  updateRec();
  }

  function switchRecognition() {
  if (recognition) {
    stopRecognition();
  } else {
    startRecognition();
  }
  }

  function setInput(text) {
  $speechInput.val(text);
  send();
  }

  function updateRec() {
  $recBtn.text(recognition ? "Stop" : "Speak");
  }

  function send() {
  var text = $speechInput.val();
  $.ajax({
    type: "POST",
    url: baseUrl + "query",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    headers: {
      "Authorization": "Bearer " + accessToken
    },
    data: JSON.stringify({
      query: text,
      lang: "en",
      sessionId: "yaydevdiner"
    }),
    success: function(data) {
      prepareResponse(data);
    },
    error: function() {
      respond(messageInternalError);
    }
  });
  }

  function prepareResponse(val) {
  var debugJSON = JSON.stringify(val, undefined, 2),
    spokenResponse = val.result.speech;
  respond(spokenResponse);
  debugRespond(debugJSON);
  }

 function debugRespond(val) {
  $("#response").text(val);
 }

function respond(val) {
  if (val == "") {
    val = messageSorry;
  }
  if (val !== messageRecording) {
    var msg = new SpeechSynthesisUtterance();
    msg.text = val;
    window.speechSynthesis.speak(msg);

  }
  var jarvis = msg.text;
  $("<div class='msg_a'>" + jarvis + "</div>").appendTo('.msg_insert');
  $('#speech').val('');
  $('.msg_body').scrollTop($('.msg_body')[0].scrollHeight);
}

问题是它没有添加到父div,我似乎无法找出原因。

JSFiddle here

1 个答案:

答案 0 :(得分:0)

我不知道为什么你使用.msg_insert div作为“系统”回复......

但如果您简单地附加消息,那么用户和系统消息......
它表现得像预期的那样。

所以我刚改变了两行...一个在按键处理程序中:

$speechInput = $("#speech");
$recBtn = $("#rec");
$speechInput.keypress(function(event) {
  if (event.which == 13) {
    event.preventDefault();
    var printmsg = $(this).val();
    send();
    //$("<div class='msg_b'>" + printmsg + "</div>").insertBefore('.msg_insert');
    $(".msg_body").append("<div class='msg_b'>" + printmsg + "</div>");
  }
});

响应函数中的一个:

function respond(val) {
  if (val == "") {
    val = messageSorry;
  }
  if (val !== messageRecording) {
    var msg = new SpeechSynthesisUtterance();
    msg.text = val;
    window.speechSynthesis.speak(msg);

  }
  var jarvis = msg.text;
  //$("<div class='msg_a'>" + jarvis + "</div>").appendTo('.msg_insert');
  $(".msg_body").append("<div class='msg_a'>" + jarvis + "</div>");
  $('#speech').val('');
  $('.msg_body').scrollTop($('.msg_body')[0].scrollHeight);
}

Updated Fiddle