Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在第一次迭代后禁用window.ondeviceorientation_Javascript - Fatal编程技术网

Javascript 在第一次迭代后禁用window.ondeviceorientation

Javascript 在第一次迭代后禁用window.ondeviceorientation,javascript,Javascript,我有一个仅在满足特定条件后才执行的事件处理程序,如下面的伪代码所示: if(condition) { window.ondeviceorientation = function(e){ //my code } } 我只需要运行一次就可以捕获陀螺仪值并设置一些会话存储值 如何在第一次迭代后禁用ondeviceoritation循环?以下是我目前正在做的,但不确定这是否是最佳解决方案: if(condition) { var stop_event_loop;

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

if(condition)
{
    window.ondeviceorientation = function(e){
        //my code
    }
}
我只需要运行一次就可以捕获陀螺仪值并设置一些会话存储值

如何在第一次迭代后禁用
ondeviceoritation
循环?以下是我目前正在做的,但不确定这是否是最佳解决方案:

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

        stop_event_loop = true;
    }
}

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

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

根据您的目标浏览器,我建议使用适当的domspec实现将函数挂接到事件,然后确保在其他地方停止处理事件

因此,对于DOM 2规范,可以使用EventTarget.addEventListener();函数可添加以下内容:

addEventListener('deviceorientation',eventHandler,onCapture)

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

尽管如此,请记住,“stop\u event\u 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
        }
    }
}

谢谢当我重新加载页面时,该函数似乎不会再次运行,这是为什么?!