首次迭代后禁用window.ondeviceorientation

时间:2014-08-19 20:30:24

标签: javascript

我有一个事件处理程序,只有在满足特定条件后才会执行,如下面的伪代码所示:

if(condition)
{
    window.ondeviceorientation = function(e){
        //my code
    }
}

我只需要运行一次来​​捕获陀螺仪值并设置一些sessionStorage值。

如何在第一次迭代后禁用ondeviceorientation循环?这是我目前正在做的事情,但不确定它是最好的解决方案:

if(condition)
{
    var stop_event_loop;
    window.ondeviceorientation = function(e){
        if(stop_event_loop) break;
        //my code

        stop_event_loop = true;
    }
}

2 个答案:

答案 0 :(得分:1)

只需清除事件处理程序,如下所示:

if(condition)
{
    window.ondeviceorientation = function(e){
      //my code
      window.ondeviceorientation = null;
    };
}

答案 1 :(得分:0)

根据您的目标浏览器,我建议使用适当的DOM规范实现来将事件挂钩到事件,然后确保您停止在其他地方处理事件。

因此对于DOM 2规范,您将使用EventTarget.addEventListener();函数添加类似:

window.addEventListener('deviceorientation',eventHandler,onCapture);

然后从事件处理程序中,如果“stop_event_loop”标志已设置为true,则应检查并使用“e.preventDefault()”函数来停止执行代码,并返回false以处理特定于浏览器的事件传播实现。

尽管如此,请记住,“stop_event_loop”变量的范围意味着每次进入该条件代码块时它都会被实例化,因此当该函数与事件绑定时,它将始终为false。如果这与您当前的实现非常接近,那么每次触发事件时都会触发您的代码。您需要将该变量声明移动到更加永久的位置。我建议不使用全局范围,但是在该条件块之外的任何地方都应该阻止每次该函数触发时重新实例化。

所以你的代码看起来像是:

//elsewhere in your code
var stop_event_loop;

//your event loop
if(condition)
{
    window.addEventListener('deviceorientation', eventHandler, onCapture);

    var eventHandler = function (e) {
        if (stop_event_loop) {
            if (e.preventDefault) {
                e.preventDefault();
            }
            return false;
        } else {
           //your code
        }
    }
}