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(); } });