项目(img)上鼠标按下后的Javascript鼠标事件未按预期工作

项目(img)上鼠标按下后的Javascript鼠标事件未按预期工作,javascript,drag-and-drop,dojo,mouseevent,mousemove,Javascript,Drag And Drop,Dojo,Mouseevent,Mousemove,我正在努力提高我的鼠标事件知识,所以这个问题是关于为什么我所做的工作不比我是否可以使用拖放模块更有效 我正在使用Dojo,我已经连接到mousedown和mouseup事件。当存在不是右键单击的mousedown事件时,我会为mousemove建立连接。在随后的mouseup事件中,我断开该事件的连接。这是代码的样子: 编辑(制作一个自包含的示例) 编辑:要尝试此方法,请使用控制台在任何页面(带有img)上插入dojo,然后创建此obj并运行obj.init()。注入1.5: document.

我正在努力提高我的鼠标事件知识,所以这个问题是关于为什么我所做的工作不比我是否可以使用拖放模块更有效

我正在使用Dojo,我已经连接到mousedown和mouseup事件。当存在不是右键单击的mousedown事件时,我会为mousemove建立连接。在随后的mouseup事件中,我断开该事件的连接。这是代码的样子: 编辑(制作一个自包含的示例)

编辑:要尝试此方法,请使用控制台在任何页面(带有img)上插入dojo,然后创建此obj并运行obj.init()。注入1.5:

document.documentElement.firstChild
    .appendChild(document.createElement("script"))
    .src='http://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js';
在我看来,它是对称的,如果我单击文档的大部分,它就可以正常工作。但是,如果我单击一个图标并拖动它,“拖动”功能只调用一次(连接应该使光标的每次移动都调用它),释放鼠标时不会调用mouseup事件

然后,下次我鼠标向下移动时,它会用一个新的连接覆盖c,这样我就永远无法断开上一个连接,因此,我只想在拖动时激活的内容将成为一个永久事件

我实现的一个糟糕的解决方案是在“mousedown”连接之前断开连接。这确保了我不会收到永久性的“拖动”调用,但仍然会留下恶意的“拖动”调用,直到我再次单击取消设置为止


有什么提示可以解释为什么会发生这种情况吗?

我最近遇到了一个问题,因为我记得用focus()解决了这个问题

这似乎解决了我在IE和FF中的问题

       function mouseOverActive(e)
            {               
                //attach listener to document 
                e = e || event;
                var who = e.target || e.srcElement;
                       overlayEditor.attachListeners($_(who.id),'mouseout',mouseOutActive);
                $_(who.id).focus();
                     overlayEditor.attachListeners($_(who.id),'keydown',keypress);  
                     overlayEditor.attachListeners($_(who.id),'keyup',keyrelease);  
            }

        function mouseOutActive(e)
            {
                //attach listener to document 
                e = e || event;
                var who = e.target || e.srcElement;
                var o = $_(who.id);

                overlayEditor.removeListener(o,'mouseout',mouseOutActive);  
                overlayEditor.removeListener(o,'keydown',keypress);
                overlayEditor.removeListener(o,'keyup',keyrelease); 

                this.sbc_Aternative = false; 
                    visualTextSwitch(o,'off');

                o.blur();
            }   

找到了答案-显然Firefox和其他浏览器都默认处理img点击,因此在每个事件侦听器中按预期工作时都包含dojo.stopEvent(evt)。

从未使用过dojo库,但听起来可能与事件冒泡有关。Firefox拖动只触发一次,Chrome触发几次。我不认为事件冒泡会影响断开连接是否有效。。。事实上,在mouseup和随后的断开连接之前触发的“drag”对我来说意味着c应该及时建立连接,以便mouseup断开连接。你能为这个添加代码吗?drag?现在应该足够容易测试了
       function mouseOverActive(e)
            {               
                //attach listener to document 
                e = e || event;
                var who = e.target || e.srcElement;
                       overlayEditor.attachListeners($_(who.id),'mouseout',mouseOutActive);
                $_(who.id).focus();
                     overlayEditor.attachListeners($_(who.id),'keydown',keypress);  
                     overlayEditor.attachListeners($_(who.id),'keyup',keyrelease);  
            }

        function mouseOutActive(e)
            {
                //attach listener to document 
                e = e || event;
                var who = e.target || e.srcElement;
                var o = $_(who.id);

                overlayEditor.removeListener(o,'mouseout',mouseOutActive);  
                overlayEditor.removeListener(o,'keydown',keypress);
                overlayEditor.removeListener(o,'keyup',keyrelease); 

                this.sbc_Aternative = false; 
                    visualTextSwitch(o,'off');

                o.blur();
            }