好的,这是我的问题。下面的代码按预期工作,但我有这种唠叨的感觉,我应该能够更简洁地解决问题。我正在编写一个脚本,允许一个人使用html页面上的自定义控件来平移/倾斜/缩放IP摄像机。我已经用数字键盘式排列了方向图标,分别代表向上,向下,向左等等......就像这样:
1 2 3
4 _ 6
7 8 9
当用户将mousedown保持在图标上时,img将换出活动版本,并且开始操作的命令将被发送到php cURL脚本以及相应的方向(图标id)。释放鼠标后,图像将再次换成非活动版本,命令将发送到cURL脚本以停止向同一方向移动。
只要鼠标悬停在最初选择的相同图标上,就可以正常工作。如果此人让鼠标离开图标然后将其释放,则第二个功能会检查当前是否有任何路线被激活,将它们取消激活并向cURL脚本发送相应的停止命令。
有没有办法用一个功能实际完成这个?
// PTZ MOVEMENT / IMAGE SWAP
$('.nav-control').on('mousedown mouseup', '.ptz-cmd', function(e){
var thisCmd = $(this).attr('id'); // 1 - 9, designating numberpad style of movement
var thisAction = $(this).attr('action') // pantilt or zoom
if (e.type == 'mousedown') {
$(this).attr('src','img/' + thisCmd + 'h.png'); // example: 1h.png = active icon, 1b.png = inactive icon
$('#ptz').load("ptz.php?action=" + thisAction + "&cmd=" + thisCmd); // movement is handled by php cURL script and 'loaded' into a hidden div
} else {
$(this).attr('src','img/' + thisCmd + 'b.png');
$('#ptz').load("ptz.php?action=" + thisAction + "&cmd=stop"); // stop the movement or zoom for this direction...
}
});
// CANCEL MOVEMENT AND REPLACE IMAGE IF MOUSE LEAVES ICON AND IS RELEASED
$('.nav-control').on('mouseleave', '.ptz-cmd', function(e){
$('#ptz').load("ptz.php?action=pantilt&cmd=stop");
$('.ptz-cmd:not([action=preset])').each(function(){
if($(this).attr('src').substring(5) == "h.png"){
var whichDirection = $(this).attr('src').substring(0,5);
$(this).attr('src',whichDirection + 'b.png')
}
});
});
答案 0 :(得分:0)
绝对:
var $ptz = $('#ptz');
$('.nav-control').on({
mousedown:function(){
var self = this,
thisCmd = self.id,
thisAction = self.action;
self.src = 'img/' + thisCmd + 'h.png';
$ptz.load("ptz.php?action=" + thisAction + "&cmd=" + thisCmd);
},
mouseup:function(){
var self = this,
thisCmd = self.id,
thisAction = self.action;
self.src = 'img/' + thisCmd + 'b.png';
$ptz.load("ptz.php?action=" + thisAction + "&cmd=stop");
},
mouseleave:function(){
$ptz.load("ptz.php?action=pantilt&cmd=stop");
$('.ptz-cmd').filter(':not([action=preset])').each(function(){
var self = this,
src = self.src;
if(src.substring(5) === 'h.png'){
self.src = src.substring(0,5) + 'b.png';
}
});
}
},'.ptz-cmd');
的变化:
.on()
的对象形式,您可以将这三个事件合并为一个绑定mousedown
和mouseup
,可以减少运行时解析(没有检查事件,每次运行的代码更少等)src
,id
和action
等项目。===
代替==
更严格,因此更符合标准$('#ptz')
将节省额外的DOM擦除这还没有经过测试,但其背后的理论是合理的。即使您只取走了第一点,您也可以将所有事件绑定合并为一个调用,并进行适当的委派。
替代:
var $ptz = $('#ptz');
$('.nav-control').on({
'mousedown mouseup':function(e){
var self = this,
cmdImg = self.id,
thisAction = self.action,
img = 'h',
thisCmd = cmdImg;
if(e.type === 'mouseup'){
img = 'b';
thisCmd = 'stop';
}
self.src = 'img/' + cmdImg + img + '.png';
$ptz.load("ptz.php?action=" + thisAction + "&cmd=" + thisCmd);
},
mouseleave:function(){
$ptz.load("ptz.php?action=pantilt&cmd=stop");
$('.ptz-cmd').filter(':not([action=preset])').each(function(){
var self = this,
src = self.src;
if(src.substring(5) === 'h.png'){
self.src = src.substring(0,5) + 'b.png';
}
});
}
},'.ptz-cmd');
这只是维护mouseup
和mousedown
组合,检查事件type
以查看它是什么。它的速度稍慢,但将代码库整合到一个功能中,使维护更容易一些。请注意,如果您有两个不同的事件,则需要将此选项设为字符串,例如'mouseup mousedown'
vs mouseup mousedown
...如果只有一个对象,则只能使用对象名称。
这些选项中的任何一个都应该让你走上正轨。