Javascript js角按钮保持循环失败
我需要一个按钮,可以按下一次,以执行一个单一的命令。但也可以按住按钮,并在按住按钮的同时多次执行命令。我正在使用AngularJs(尽管我认为这与问题无关) 到目前为止我所拥有的: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="
<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)
tosetTimeout(循环('Up'),1000)
我不是把函数作为参数,而是执行函数并把返回作为参数
我应该这样做:
promis = setTimeout(function(){ loop('Up') },1000);
@CoderHawk,我已经看到了这个问题,并启发了我最初的解决方案。但使用指令是另一种方法。
promis = setTimeout(function(){ loop('Up') },1000);