Как вызвать контекстное меню браузера на элементе. (Как будто пользователь щелкнул правой кнопкой мыши) - PullRequest
9 голосов
/ 07 августа 2009

У меня есть необходимость запустить контекстное меню браузера (IE, Firefox, Safari и т. Д.) Через javascript. Проблема, которую я пытаюсь решить, заключается в том, что при щелчке правой кнопкой мыши по наложенному элементу отображается элемент контекстного меню под ним. Поэтому, если верхний элемент является меткой, при щелчке правой кнопкой мыши мне нужно показать контекстное меню для элемента ввода ниже.

Я знаю, как не показывать контекстное меню метки, но я не знаю, как произвольно открыть контекстное меню.

Любая помощь приветствуется!

Ответы [ 3 ]

14 голосов
/ 07 августа 2009

Извините, что вы являетесь носителем печальных новостей, но это невозможно сделать с помощью Javascript.

2 голосов
/ 17 января 2010

Я не хочу вас расстраивать, скорее наоборот, тем более что вы ответили на мой собственный вопрос:)

Не думаю, что контекстное меню браузера доступно обычным скриптом на веб-странице.

Если то, что вы просите, действительно выполнимо, то создатели браузера, возможно, сочтут это ошибкой и устранят это поведение. Кросс-браузер, такое поведение вряд ли будет доступно сегодня.

Почему бы вам не захватить события мыши, и когда мышь находится непосредственно в области элемента ниже, для которого вы хотите отобразить контекстное меню, сдвиньте элемент покрытия ниже, в противном случае вернитесь вверх? *

Это одна возможность, о которой я мог подумать, в основном обнаружение / раскрытие скрытого элемента в зависимости от положения мыши. Как вырезать отверстие в оверлее.

Или почему бы не сделать текстовое поле прозрачным и полностью не наложить его под текстовое поле?

Если технически это не сработает, то, по крайней мере, у вас есть смысл сообщать об ошибках или улучшениях против целевых браузеров.

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

1 голос
/ 11 февраля 2010

У меня есть возможное решение, которое может удовлетворить ваши потребности. Это еще не идеально, я только что провел несколько быстрых тестов в нескольких браузерах (Fox 3.6, IE7, IE8, Chrome 4, Safari 3 на xp). Это нужно будет настроить и улучшить, но это только начало. По сути, идея состоит в том, чтобы удалить метку в mousedown правой кнопкой мыши, чтобы событие mouseup ударило по нужному полю и, следовательно, запустило контекстное меню в соответствующем поле.

// Remove the contextmenu from "In-Field" Labels
base.$label.bind("contextmenu",function(e){
    return false;
}); 

// Detect right click on "In-Field" label:
// hide label on mousedown so mouseup will target the field underneath.
base.$label.mousedown(function(e){          
    if ( e.which == 3 ){
        var elLbl = $(this); 
        elLbl.hide();
        var elFid = $(this).attr("for");
        // bind blur event to replace the label when we are done.
        $("#" + elFid ).bind("blur.infieldlabel",function(){                    
            elLbl.show();
            $("#" + elFid ).unbind("blur.infieldlabel");                    
        });             
        return false;
    }
}); 

Браузеры IE и Safari испытывают странную проблему, когда вам нужно дважды щелкнуть, прежде чем метка снова отобразится (я думаю, что это связано с синхронизацией событий). Вы можете легко понять, почему это происходит, посмотрев на код. Также заметил небольшой сбой иногда у лисы после вставки в поле, при размытии метка появлялась на долю секунды, когда не должна была. Это должно быть довольно просто исправить, если вы решите включить этот метод в свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...