首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >把鼠标和鼠标/鼠标功能组合在一起?

把鼠标和鼠标/鼠标功能组合在一起?
EN

Stack Overflow用户
提问于 2013-09-09 16:50:06
回答 1查看 660关注 0票数 0

好吧,这是我的问题。下面的代码按预期工作,但我有一种唠叨的感觉,认为我应该能够更简洁地解决问题。我正在编写一个脚本,允许一个人使用html页面上的自定义控件来平移/倾斜/缩放IP摄像机。我把方向图标放置在一个数字垫式的排列中,表示向上、向下、左向上等.就像这样:

1 2 3

4_6

7 8 9

当用户在图标上按住鼠标时,img将被替换为活动版本,并将开始操作的命令发送到php cURL脚本以及相应的方向(图标id)。当鼠标被释放时,图像将再次被替换为非活动版本,并将命令发送到cURL脚本以停止向该方向移动。

只要鼠标一直在最初被选中的图标上盘旋,就可以工作。如果用户让鼠标离开图标,然后释放图标,第二个函数将检查当前是否激活了任何方向,禁用它们并向cURL脚本发送相应的停止命令。

是否有一种方法可以使用一个函数来实际完成这一任务?

代码语言:javascript
复制
// 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')
        }
    });
}); 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-09 16:56:14

绝对:

代码语言:javascript
复制
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. 使用普通JS与jQuery的速度更快,用于srcidaction等项目。
  4. 使用===而不是==更严格,因此更符合标准。
  5. 在顶部缓存$('#ptz')将节省额外的DOM擦伤

这没有经过检验,但背后的理论是合理的。即使只删除第一点,也会将所有事件绑定合并到一个调用中,并适当地委派。

备选方案:

代码语言:javascript
复制
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 .只有在存在单个对象时,才能使用对象名。

这些选项中的任何一个都会让你走上正确的轨道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18703144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档