结合mouseleave和mousedown / mouseup功能?

时间:2013-09-09 16:50:06

标签: php jquery

好的,这是我的问题。下面的代码按预期工作,但我有这种唠叨的感觉,我应该能够更简洁地解决问题。我正在编写一个脚本,允许一个人使用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')
        }
    });
}); 

1 个答案:

答案 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');

的变化:

  1. 通过使用.on()的对象形式,您可以将这三个事件合并为一个绑定
  2. 通过拆分mousedownmouseup,可以减少运行时解析(没有检查事件,每次运行的代码更少等)
  3. 使用vanilla JS vs jQuery更快,用于srcidaction等项目。
  4. 使用===代替==更严格,因此更符合标准
  5. 在顶部缓存$('#ptz')将节省额外的DOM擦除
  6. 这还没有经过测试,但其背后的理论是合理的。即使您只取走了第一点,您也可以将所有事件绑定合并为一个调用,并进行适当的委派。

    替代:

    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');
    

    这只是维护mouseupmousedown组合,检查事件type以查看它是什么。它的速度稍慢,但将代码库整合到一个功能中,使维护更容易一些。请注意,如果您有两个不同的事件,则需要将此选项设为字符串,例如'mouseup mousedown' vs mouseup mousedown ...如果只有一个对象,则只能使用对象名称。

    这些选项中的任何一个都应该让你走上正轨。