原生EventSource +打字机效果

EventSource

	let url="请求地址?message="+str
			let content="";
            let text="";
			// 检查浏览器是否支持原生EventSource
			if (typeof EventSource !== "undefined"){
				var source = new EventSource(url);
			} else {
				// 如果不支持,则使用polyfill
				var source = new EventSourcePolyfill(url);
			}
			source.onmessage = function(event) {
				if (event.data.endsWith('[DONE]')) {
					source.close();
					console.log('connection is closed');
                    list.push({
                        role:"assistant",
                        content:content
                    })
				}else{
					let obj=JSON.parse(event.data).choices[0];
                    if(obj.delta.role){
                        $("#znfw").append(`<div class="znfw_item znfw_ans"><div></div></div> `)
                    }
					if(obj.delta.content){
                        content+=obj.delta.content;
                        displayText(content);  // 开始显示文本
					}
				}
			};
			source.onerror = function(event){
				console.log("Error occurred in EventSource.");
				source.close();
			};

全部代码

        let flag=true;
        let list=[
            {role:"assistant",content:"Hi,我是机器人,可以解答您的问题"}
        ]
        function displayText(data) {
            let str_ = '';
            let i = 0;
            const content = $(".znfw_ans").find(">:first-child")[$(".znfw_ans").length-1];
            const timer = setInterval(() => {
                if (str_.length < data.length) {
                    str_ += data[i++];
                    content.html(str_);
                } else {
                    clearInterval(timer);
                    content.innerHTML =str_;
                }
            }, 100);
        }
        function sendMessage(str){
            let url=ajaxUrl+"/ls-ai/chatFlux?message="+str
			let content="";
            let text="";
			// 检查浏览器是否支持原生EventSource
			if (typeof EventSource !== "undefined"){
				var source = new EventSource(url);
			} else {
				// 如果不支持,则使用polyfill
				var source = new EventSourcePolyfill(url);
			}
			source.onmessage = function(event) {
				if (event.data.endsWith('[DONE]')) {
					source.close();
					console.log('connection is closed');
                    list.push({
                        role:"assistant",
                        content:content
                    })
				}else{
					let obj=JSON.parse(event.data).choices[0];
                    if(obj.delta.role){
                        $("#znfw").append(`<div class="znfw_item znfw_ans"><div></div></div> `)
                    }
					if(obj.delta.content){
                        content+=obj.delta.content;
                        displayText(content);  // 开始显示文本
					}
				}
			};
			source.onerror = function(event){
				console.log("Error occurred in EventSource.");
				source.close();
			};
        }

        $('.search_btn').off('click').on('click',function(){
            if(!flag){return}
            let text = $('.search_input').val();
            if(text.trim().length===0){return}
            if(text == '') return;
            $('.znfw').append(`<div class="znfw_item znfw_que"><div>${text}</div></div>`);
            //请求答案
            //清空
            $('.search_input').val('');
            //滚动到底部
            $('.znfw').scrollTop($('.znfw')[0].scrollHeight);
            //聚焦
            $('.search_input').focus();
            sendMessage(text)
        });
        $('.search_input').off('keyup').on('keyup',function(e){
            if(!flag){return}
             if(e.keyCode===13){
            let text = $(this).val();
            if(text.trim().length===0){return}
            if(text == '') return;
            $('.znfw').append(`<div class="znfw_item znfw_que"><div>${text}</div></div>`);
            //请求答案
            //清空
            $('.search_input').val('');
            //滚动到底部
            $('.znfw').scrollTop($('.znfw')[0].scrollHeight);
            //聚焦
            $('.search_input').focus();
            sendMessage(text)
           }
           
        });  
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
eventsource-polyfill.js是一个用于支持EventSource API的JavaScript库。EventSource API是HTML5中定义的一种浏览器与服务器之间实现服务器发送事件的机制。 EventSource API允许服务器以文本格式发送事件到浏览器,而无需浏览器通过轮询或长轮询等方式不停地发送请求。浏览器可以通过注册事件处理程序来监听这些事件,并根据需要进行操作。 eventsource-polyfill.js的作用就是为不支持原生EventSource API的浏览器提供兼容性支持。它实现了EventSource API的核心功能,并在不支持原生EventSource API的浏览器中模拟这一功能。 使用eventsource-polyfill.js可以使得旧版本的浏览器也能够使用EventSource API,从而实现服务器发送事件到浏览器的实时更新。这对于一些需要实时更新数据的应用场景非常有用,比如实时聊天、实时股票行情等。 eventsource-polyfill.js的主要功能包括连接服务器、接收事件数据、处理事件类型以及处理错误等。它可以通过建立一个与服务器的长连接,并监听服务器发送的事件数据。当有新的事件数据到达时,它会触发相应的事件并将数据传递给注册的事件处理程序。 总之,eventsource-polyfill.js是一个用于兼容旧版本浏览器的JavaScript库,为不支持原生EventSource API的浏览器提供了实现服务器发送事件机制的功能。它使得开发人员可以使用统一的代码来处理浏览器与服务器之间的实时数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值