ffmmx's Blog

Happy coding

vimperator ffmmx的插件屋

最近在用vimperator,被它的可以完全自定义扩展特性吸引了,再加上现在的ff支持很多HTML5的新功能,基本上可以通过JAVASCRIPT代码做到很多以前做不到的事情,比如文件系统操作。但是默认提供的功能还是很有限,所以为了方面还是需要自己扩展一些功能或者插件(这里说的这些东西只是给自己做一个备忘,没有什么特别的含义

插件项目地址https://github.com/firefoxmmx2/vimperatorPlugins ,使用了github,速度比较快。

虽然vimperator 的; extend hint 已经提供很多功能,例如复制匹配的链接地址等功能,但是目前还没有 触发鼠标事件的功能,所以我自己写了一个作为补充。

文件 simlateMouseEvents.js

代码:

//
// simulate mouse events
// 
//
(function(){
    let self=liberator.plugins.simulateMouseEvents=(function(){

        var fireMouseEvt=function(elem,evtString){
            var doc=content.document.wrappedJSObject;

            if(doc.createEvent){
                var evt=doc.createEvent('MouseEvents');
                evt.initEvent(evtString,true,false);
                elem.dispatchEvent(evt);
            }
            else if(doc.createEventObject){
                elem.fireEvent('on'+evtString);
            }
        };

        var PUBLICS={
            mouseover:function(elem){
                if(elem){
                    fireMouseEvt(elem,'mouseover');
                    elem.setAttribute('isMouseover',true);
                }
                else{
                    var activeElement=content.document.wrappedJSObject.activeElement;
                    fireMouseEvt(activeElement,'mouseover');
                    activeElement.setAttribute('isMouseover',true);
                }
                
                    
            },
            mouseout:function(elem){
                if(elem){
                    fireMouseEvt(elem,'mouseout');
                    elem.setAttribute('isMouseover',false);
                }
                else{
                    var activeElement=content.document.wrappedJSObject.activeElement;
                    fireMouseEvt(activeElement,'mouseout');

                    activeElement.setAttribute('isMouseover',false);
 
                }
            }
        };

        //registe extend hint command like ;m
        hints.addMode(
                'm',
                'active element trigge mouseover/mouseout',
                function(node){
                    if(node.getAttribute('isMouseover') && node.getAttribute('isMouseover') == 'true'){
                        self.mouseout(node);
                    }
                    else{
                        self.mouseover(node);
                        //全局的上一个触发过over事件的元素
                        if(self.overElem && self.overElem!=node){
                            try{
                                self.overElem.setAttribute('isMouseover',false);
                            }
                            catch(e){}
                        }
                        self.overElem=node;
                    }


        });
        return PUBLICS;
    })();
})();