好吧,这是我的问题。下面的代码按预期工作,但我有一种唠叨的感觉,认为我应该能够更简洁地解决问题。我正在编写一个脚本,允许一个人使用html页面上的自定义控件来平移/倾斜/缩放IP摄像机。我把方向图标放置在一个数字垫式的排列中,表示向上、向下、左向上等.就像这样:
1 2 3
4_6
7 8 9
当用户在图标上按住鼠标时,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')
}
});
}); 发布于 2013-09-09 16:56:14
绝对:
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 .只有在存在单个对象时,才能使用对象名。
这些选项中的任何一个都会让你走上正确的轨道。
https://stackoverflow.com/questions/18703144
复制相似问题