Javascript 如何将JS设置为在后台运行,同时保持低调?
我有一个小的聊天实现,它在下面使用了Javascript 如何将JS设置为在后台运行,同时保持低调?,javascript,ruby-on-rails,unobtrusive-javascript,Javascript,Ruby On Rails,Unobtrusive Javascript,我有一个小的聊天实现,它在下面使用了消息模型。在索引操作中,我以“聊天区”的形式显示所有消息。问题是,我想启动一个后台任务,每X秒轮询服务器一次新消息。 我如何才能做到这一点,让我的JS不引人注目?我不希望在我的index.html.erb中有内联JS,也不希望在我所处的每个页面上都对轮询代码进行评估 使用mootools或jquery这样的库最容易做到这一点。在domready/document.ready上,您应该检查给定的类,如“聊天区容器”。如果找到它,您可以构建一个新的标记并将其注入D
消息模型。在索引
操作中,我以“聊天区”的形式显示所有消息。问题是,我想启动一个后台任务,每X秒轮询服务器一次新消息。
我如何才能做到这一点,让我的JS不引人注目?我不希望在我的index.html.erb
中有内联JS,也不希望在我所处的每个页面上都对轮询代码进行评估 使用mootools或jquery这样的库最容易做到这一点。在domready
/document.ready
上,您应该检查给定的类,如“聊天区容器”。如果找到它,您可以构建一个新的
标记并将其注入DOM中,以便包含聊天区域特定的javascript。这样,它就不会加载到每个页面上。“聊天区容器”的结构可以使其隐藏或显示加载消息,脚本初始化后可以删除该消息
在动态创建的
标记上,添加一个onLoad事件。脚本加载完成后,可以从onLoad事件中调用任何初始化函数
使用这种方法,你可以逐步增强你的页面——没有javascript的用户要么会看到一个没有功能的聊天区,上面有一条正在加载的消息(因为没有js它无论如何都不会工作),要么如果你一开始就把它隐藏起来,他们根本不会知道有一个聊天区。另外,通过使用动态脚本标记,onLoad事件“pseudo threads”将初始化从主javascript过程堆栈中移除。要在固定时间间隔上设置轮询,请使用setInterval或setTimeout。下面是一个示例,使用jQuery并猜测服务器的ajax界面可能是什么样子:
$(function() {
// Look for the chat area by its element id.
var chat = $('#chat-area');
var lastPoll = 0;
function poll() {
$.getJSON('/messages', { since: lastPoll }, function(data) {
// Imagining that data is a list of message objects...
$.each(data, function(i, message) {
// Create a paragraph element to display each message.
var m = $('<p/>', {
'class': 'chat-message',
text: message.author +': '+ message.text;
});
chat.append(m);
});
});
// Schedules the function to run again in 1000 milliseconds.
setTimeout(poll, 1000);
lastPoll = (new Date()).getTime();
}
// Starts the polling process if the chat area exists.
if (chat.length > 0) {
poll();
}
});
$(函数(){
//通过元素id查找聊天区。
var chat=$(“#聊天区”);
var-lastPoll=0;
函数poll(){
$.getJSON('/messages',{since:lastPoll},函数(数据){
//假设数据是一个消息对象列表。。。
$。每个(数据、功能(i、消息){
//创建一个段落元素以显示每条消息。
var m=$(“”{
“类”:“聊天信息”,
text:message.author+':'+message.text;
});
chat.append(m);
});
});
//计划函数在1000毫秒内再次运行。
设置超时(轮询,1000);
lastPoll=(新日期()).getTime();
}
//如果聊天区存在,则启动轮询过程。
如果(chat.length>0){
poll();
}
});