vimperator: plugins: firefox: javascript :: Получить элемент в позиции мыши и имитировать щелчок - PullRequest
3 голосов
/ 21 августа 2011
  • Vimperator V2.4 Pre
  • Firefox V3.6.18
  • Vista Home Basic

Я бы хотел получить элемент в позиции мыши и смоделировать щелчок по нему в плагинах vimperator.

Есть некоторые функции, которые могут симулировать щелчок мыши,

Как смоделировать щелчок мыши с помощью JavaScript?

Имитация мыши в плагине Vimperator

Однако, как их использовать в плагинах vimperator?

Я попробовал следующий код, загрузил его и выполнил в vimperator следующим образом:

:so! click.vimp

:javacript click();

к сожалению это не могло работать.

======================click.vimp===================

js << EOF

click = function () {

    let contents=gBrowser.selectedBrowser.contentDocument;

    let evt=contents.createEvent("MouseEvents");

    evt.initMouseEvent(

        'click',

        true, // canBubble

        true, // cancelable

        window, // view

        1, // detail

        0, // screenX

        0, // screenY

        0, // clientX

        0, // clientY

        false, // ctrlKey

        false, // altKey

        false, // shiftKey

        false, // metaKey

        0, // button

        null //relatedTarget
    );

    gBrowser.selectedBrowser.contentDocument.dispatchEvent(evt);

} 
EOF

=============================================== ===========

Заранее спасибо


я попробовал следующий код. К сожалению, 'elem' имеет значение NULL. Кто-нибудь знает, как правильно получить элемент в текущей позиции мыши?

js<<EOF

var x=0,y=0;
function getMousePosition(e)
{
return e.pageX ? {'x':e.pageX, 'y':e.pageY} : {'x':e.clientX + document.documentElement.scrollLeft + document.body.scrollLeft, 'y':e.clientY + document.documentElement.scrollTop + document.body.scrollTop};
}

function showMousePos(e)
{
if (!e) e = event; // make sure we have a reference to the event
var mp = getMousePosition(e);
x=mp.x;
y=mp.y;
//x = e.clientX;
//y = e.clientY;
//alert('x:'+x+'y:'+y);
}
function init()
{
document.onmousemove = showMousePos;
}

document.onmousemove=init; 

simulateClick = function ()
{

    let evt=document.createEvent("MouseEvents");
    evt.initMouseEvent(
        'click',
        true, // canBubble
        true, // cancelable
        window, // view
        1, // detail
        0, // screenX
        0, // screenY
        0, // clientX
        0, // clientY
        false, // ctrlKey
        false, // altKey
        false, // shiftKey
        false, // metaKey
        0, // button
        null //relatedTarget
    );
    let elem = document.elementFromPoint(x, y);
    elem.dispatchEvent(evt);
}
EOF

=============================================== ==

Ну, сегодня у меня неловкий обходной путь.

Шаг1. Измените Vimpeator-modes.js следующим образом

set: function (mainMode, extendedMode, silent, stack) {
    silent = (silent || this._main == mainMode && this._extended == extendedMode);
    // if a this._main mode is set, the this._extended is always cleared
    let oldMain = this._main, oldExtended = this._extended;
    if (typeof extendedMode === "number")
        this._extended = extendedMode;
    if (typeof mainMode === "number") {
        this._main = mainMode;
        if (!extendedMode)
            this._extended = modes.NONE;

        if (this._main != oldMain)
            this._handleModeChange(oldMain, mainMode, oldExtended);
    }
    liberator.triggerObserver("modeChange", [oldMain, oldExtended], [this._main, this._extended], stack);

    options.titlestring = mainMode;
    if (!silent)
        this.show();
},

Шаг 2: Запустить ниже сценария AutoHotkey

d::

WinGetActiveTitle, title
StringRight, whichmode, title, 1
if ( whichmode = "1" or whichmode = "6")
{
    Send, {Click}
}
else
{
    Send, d
}
return

=============================================== ==============

Таким способом можно сопоставить 'd' с щелчком мыши и ввести необработанный символ 'd', как в режиме вставки / command_line и т. Д.

Мой вопрос, кто-нибудь знает более лучший метод? спасибо

...