Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.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 js角按钮保持循环失败_Javascript_Angularjs_Button_Onmousedown - Fatal编程技术网

Javascript js角按钮保持循环失败

Javascript js角按钮保持循环失败,javascript,angularjs,button,onmousedown,Javascript,Angularjs,Button,Onmousedown,我需要一个按钮,可以按下一次,以执行一个单一的命令。但也可以按住按钮,并在按住按钮的同时多次执行命令。我正在使用AngularJs(尽管我认为这与问题无关) 到目前为止我所拥有的: <button type="button" class="btn btn-default" ng-click="ChangeSetPoint('Up')" ng-mousedown="startLoopingUp()" ng-mouseup="

我需要一个按钮,可以按下一次,以执行一个单一的命令。但也可以按住按钮,并在按住按钮的同时多次执行命令。我正在使用AngularJs(尽管我认为这与问题无关)

到目前为止我所拥有的:

<button type="button" 
        class="btn btn-default" 
        ng-click="ChangeSetPoint('Up')"
        ng-mousedown="startLoopingUp()"
        ng-mouseup="stopLoopingUp()"
        ng-mouseleave="stopLoopingUp()">
        +
</button>

在我使用这个“方向”参数之前,它是一种工作。在我使用setTimeout中的arguments.callee之前,但是当我查看如何使用该函数传递参数时,我注意到不鼓励使用
arguments.callee
)。从那时起,我收到了“超过最大调用堆栈大小”错误。

我不久前在指令中使用了以下函数。我创建它时考虑到以下几点:

该函数可以包含三个单独的回调函数。单击一次就调用“short”回调。按住按钮时,会重复调用短回调。当仍然按住按钮时,“长”回调会被反复触发。最后,当用户停止按时,将触发第三个“最终”回调

这可能不是你问题的确切解决办法,但可能会给你一些启发和帮助:)祝你好运

/**
  *
  * @param {Event} evt
  * @param {Function} shortCallback
  * @param {Function} longCallback
  * @param {Function} [finishCallback] optional
  */
var onBtnClick = function (evt, shortCallback, longCallback, finishCallback) {
    //prevent mobile browser from long tap behaviour (simulated right click)
    evt.preventDefault();
    //only react to left mouse button or a touch event
    if (evt.which === 1 || evt.type === "touchstart") {
        //save 'this' context and interval/timeout IDs
        var self = this,
            short = {
                timeout     : null,
                interval    : null,
                callback    : angular.isFunction(shortCallback) ? shortCallback : angular.noop
            },
            long = {
                timeout     : null,
                interval    : null,
                callback    : angular.isFunction(longCallback) ? longCallback : short.callback
            },
            listener = "mouseup mouseleave touchend touchcancel",
            //
            cancelShort = function () {
                $timeout.cancel(short.timeout);
                $interval.cancel(short.interval);
            },
            //
            cancelLong = function () {
                $timeout.cancel(long.timeout);
                $interval.cancel(long.interval);
            };

        //react to a single click
        short.callback();

        //when user leaves the button cancel timeout/interval, lose focus and unbind recently bound listeners
        self.one(listener, function (e) {
            e.preventDefault();
            cancelShort();
            cancelLong();

            if (angular.isFunction(finishCallback)) {
                finishCallback();
            }

            self.blur();
        });

        //on a long click call the callback function within an interval for faster value changing
        short.timeout = $timeout(function () {
            short.interval = $interval(short.callback, 50, 0, false);
        }, 300, false);

        //when pressed even longer, cancel previous callback and fire "long" one
        long.timeout = $timeout(function () {
            cancelShort();
            long.interval = $interval(long.callback, 50, 0, false);
        }, 1500, false);
    }
};
此函数已绑定到具有以下内容的元素:

/**
 *
 * @param {String} selector
 * @param {Function} clickCallback
 * @param {Function} fastCallback
 * @param {Function} [finishCallback] optional
 */
 var bindEvent = function (selector, clickCallback, fastCallback, finishCallback) {
     $element.on("mousedown touchstart", selector, function (evt) {
         onBtnClick.call($(this), evt, clickCallback, fastCallback, finishCallback);
     });
 };

这是造成伤害的参数:

换衣服的时候

setTimeout(循环,1000)
to
setTimeout(循环('Up'),1000)

我不是把函数作为参数,而是执行函数并把返回作为参数

我应该这样做:

promis = setTimeout(function(){ loop('Up') },1000); 

@CoderHawk,我已经看到了这个问题,并启发了我最初的解决方案。但使用指令是另一种方法。
promis = setTimeout(function(){ loop('Up') },1000);