async function startIdleDetection(threshold = 60000) {
if (!window.IdleDetector) {
console.error('浏览器不支持 IdleDetector API');
return { success: false, error: 'API_NOT_SUPPORTED' };
}
try {
// 至少要60秒, 任何小于 60 秒的设置会导致 start() 抛出 DOMException
const validatedThreshold = Math.max(threshold, 60000);
const state = await IdleDetector.requestPermission();
if (state !== 'granted') {
console.error('用户拒绝了空闲检测权限');
return { success: false, error: 'PERMISSION_DENIED' };
}
const detector = new IdleDetector();
// 添加更健壮的事件处理
const handleStateChange = () => {
const now = new Date().toISOString();
console.log(`[${now}] 用户状态: ${detector.userState}, 屏幕状态: ${detector.screenState}`);
// 实际业务逻辑可以在这里添加
if (detector.userState === 'idle') {
// 用户闲置处理
}
};
detector.addEventListener('change', handleStateChange);
// 添加错误处理
detector.addEventListener('error', (err) => {
console.error('检测器错误:', err);
});
await detector.start({ threshold: validatedThreshold });
return { success: true, detector }; // 返回检测器实例以便后续控制
} catch (err) {
console.error('空闲检测初始化失败:', err);
return { success: false, error: err.message };
}
}
// 正确用法示例(必须在用户交互中调用):
document.getElementById('startBtn').addEventListener('click', async () => {
const result = await startIdleDetection(90000); // 90秒阈值
if (!result.success) {
// 处理失败情况
}
});