你可以检测到它,但它并不漂亮。
首先,您需要一个具有更新会话超时操作的新控制器:
class JavascriptController < ApplicationController
def confirm
session[:javascript_updated] = Time.now
end
end
接下来,您需要在所有页面中包含一个 javascript 操作,以便在每次页面加载时调用此控制器操作。最简单的方法是将它包含在布局中包含的“javascript-confirm.js”文件中(在这个特定示例中,我使用了 Prototype 的 Ajax.Request,因此您也需要将它包含在您的 javascripts 中):
function confirmJavascript()
{
// Assuming you are using Prototype
new Ajax.Request('/JavascriptController/confirm');
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 10000); // invoke each 10 seconds
这将在您的所有页面视图中调用确认操作。最后,您必须控制自上次在应用程序控制器中确认以来经过了多长时间。
class ApplicationController < ActionController::Base
JAVASCRIPT_TIME_LIMIT = 10.seconds
before_filter :prepare_javascript_test
private
def prepare_javascript_test
if (session[:javascript_updated].blank? or
Time.now - session[:javascript_updated] > ApplicationController::JAVASCRIPT_TIME_LIMIT)
@javascript_active = true
else
@javascript_active = false
end
end
end
您现在将在所有控制器中拥有一个名为 @javascript_active 的变量。
即使用户激活/停用 javascript,它也应该可以工作,精度为 10 秒。如果您的某些页面加载时间超过 10 个页面(即包含大量图像),它可能无法正常工作。在这种情况下增加时间限制(在 applicationcontroller 和您的 javascript 上)
免责声明:我尚未测试此代码,可能存在一些错误 - 但它应该为您指明正确的方向。