Есть ли способ перехватить / переопределить Ctrl-R или F5 в IE, используя Javascript? - PullRequest
8 голосов
/ 09 сентября 2009

Я хочу перехватить ярлык Ctrl - R или F5 в браузере, чтобы запретить ему выполнять обновление браузера, но вместо этого выполнить пользовательское обновление ,

Мне удалось захватить Ctrl - R в Safari и FF, используя:

document.onkeypress = function(e){
      if ((e.ctrlKey || e.metaKey) && e.keyCode == 114) // Ctrl-R
    e.preventDefault();
}

Но это не работает в IE. Есть ли способ сделать это на IE?

Обновление: для людей, которые спрашивают, почему я делаю это в первую очередь: я просто хотел обновить пользовательское приложение, но хотел избежать использования кнопки "обновить", потому что я не рекомендую использовать обновление (У нас есть полное приложение Flex страницы). В итоге мы переключились на F8, потому что F5 было слишком сложно, чтобы работать во всех браузерах.

Ответы [ 8 ]

8 голосов
/ 09 сентября 2009

Открыть JavaScript

http://www.openjs.com/scripts/events/keyboard_shortcuts/

Для определенных клавиш (F1, F4) вы должны открыть новое окно браузера без адресной строки.

Пример

Открыть в новом окне, без украшений:

window.open( 'webpage.html', 'TLA', 
'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=800,height=665' );

JavaScript для использования библиотеки:

var FALSE_FUNCTION = new Function( "return false" );

/**
 * Called to disable F1, F3, and F5.
 */
function disableShortcuts() {
  // Disable online help (the F1 key).
  //
  document.onhelp = FALSE_FUNCTION;
  window.onhelp = FALSE_FUNCTION;

  // Disable the F1, F3 and F5 keys. Without this, browsers that have these
  // function keys assigned to a specific behaviour (i.e., opening a search
  // tab, or refreshing the page) will continue to execute that behaviour.
  //
  document.onkeydown = function disableKeys() {
    // Disable F1, F3 and F5 (112, 114 and 116, respectively).
    //
    if( typeof event != 'undefined' ) {
      if( (event.keyCode == 112) ||
          (event.keyCode == 114) ||
          (event.keyCode == 116) ) {
        event.keyCode = 0;
        return false;
      }
    }
  };

  // For good measure, assign F1, F3, and F5 to functions that do nothing.
  //
  shortcut.add( "f1", FALSE_FUNCTION );
  shortcut.add( "f3", FALSE_FUNCTION );
  shortcut.add( "f5", FALSE_FUNCTION );
}

Внутри webpage.html:

<body onload="disableShortcuts();">
4 голосов
/ 09 сентября 2009

Нет надежного способа переопределить функциональные клавиши в браузерах.

Internet Explorer имеет определенные ключи, которые нельзя переопределить, и определенные ключи, которые - даже при переопределении - по-прежнему выполняют поведение по умолчанию - например, клавиша F11, которая переключается в полноэкранный режим, и клавиша F1, открывающая окно справки.

Chrome вообще не позволяет использовать события клавиш.

FireFox - самый мягкий, но все же отрывочный - как Internet Explorer; все еще есть некоторые ключи и поведение по умолчанию, которое вы не можете переопределить.

И наконец .. Opera .. Что примерно так же сложно, как Internet Explorer.

И поведение по умолчанию отличается от версии к версии. Это как ходить в минное поле .. С завязанными глазами .. :)

Попытка переопределить CTRL + R / F5 пахнет плохим дизайном.

Какую проблему вы пытаетесь решить?

2 голосов
/ 09 сентября 2009

Поскольку «как» уже было рассмотрено, я подумал, что должен упомянуть, что вы должны знать об ограничениях использования Javascript для чего-то подобного.

Например, в Safari (и, возможно, в других), если вы можете попасть в поле ввода Поиск браузера, вы все равно можете выполнять комбинации клавиш, но это выходит за рамки вашего Javascript. Если пользователь сделает это, то любой код, который вы поедаете, не будет вызываться, и нажатие клавиши будет проходить очень хорошо.

Так что решения, которые вы найдете, могут работать, но почти повсеместно будут побеждены, просто используя основные функции браузера.

1 голос
/ 09 сентября 2009

Я верю document.body.onbeforeunload это путь. Вы даже можете запретить пользователю покинуть страницу с этим. Просто не уверен, как определить, является ли это обновлением, или он действительно работает в другом месте (возможно, document.location?)

1 голос
/ 09 сентября 2009

YUI имеет ключевой обработчик, который будет работать во всех браузерах

http://developer.yahoo.com/yui/examples/container/keylistener.html

Я думаю, что проблема с приведенным выше кодом заключается в том, что IE не передает событие в функцию. Он помещает его в глобальную переменную с именем window.event.

Я предлагаю попробовать прослушиватель ключей YUI, это будет довольно чистое решение, и вам не нужно будет использовать всю библиотеку, только нужные вам кусочки.

0 голосов
/ 16 декабря 2015

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

Определение

/**
 * addKeyActions takes an array of objects that looks like this:
 * 
 * {
 *  keyCodes: [120], //F9
 *  modifiers: ['ctrlKey', 'shiftKey', 'altKey', 'altGraphKey', 'metaKey'], //Only legal modifiers
 *  callback: function(event){};
 * }
 * 
 * A good resource to find the keycodes you are looking for is:
 * http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes
 * 
 * However, there are more keycodes than written on this page, so if you can't find what you are looking for, 
 * I have provided a function that you can call to display the keycode for the current button pressed - alertKeyCodes
 * 
 * 
 * @Version 1.01
 */


/*
 * --HOW TO USE--
 * 
var allModifiersKeys = {
  keyCodes: [120, 121], //F9, F10
  modifiers: ['ctrlKey', 'shiftKey', 'altKey'],
  callback: function(event){alert("All modifiers pressed + Function-button!");}
};

var altKeys = {
  keyCodes: [122, 123], //F11, F12
  modifiers: ['altKey'],
  callback: function(event){alert("ALT pressed + Function-button!");}
};

var shiftCtrlKeys = {
  keyCodes: [116, 117], //F5, F6
  modifiers: ['ctrlKey', 'shiftKey'],
  callback: function(event){alert("CTRL+SHIFT+Function-button pressed!");}
};

var noModifierKeys = {
  keyCodes: [118, 119], //F7, F8
  callback: function(event){preventDefaultEventPropagation(); alert("Function-button!");} //Do not forget to also declare the preventDefaultEventPropagation-function 
  //that is listed below for this example to work
};

addKeyActions([allModifiersKeys, altKeys, shiftCtrlKeys, noModifierKeys]);

*/

function addKeyActions(key){

    document.onkeydown = function(){
        var matchingKeyCode = findMatchingKeyCode();
        var match = matchModifiers(matchingKeyCode);
        if(match){
            matchingKeyCode.callback(event);
        }
    };

    function findMatchingKeyCode(){
        var eventKeyCode = event.keyCode || event.which || event.charCode;
        var returnVal;
        for(var i=0; i<key.length; i++){
            var tempKey = key[i];
            var containsKeyCode = isValueInArray(eventKeyCode, tempKey.keyCodes);
            if(containsKeyCode){
                returnVal = tempKey;
            }
        }
        return returnVal;
    }

    function isValueInArray(value, array){
        var hasValue = false;
        for(var i=0; i < array.length; i++){
            var tempValue = array[i];
            if(tempValue === value){
                hasValue = true;
            }
        }
        return hasValue;
    }

    function matchModifiers(key){
        var match = false;
        if(key != undefined){
            match = true;
            if(key.modifiers instanceof Array){
                for(var i=0; i<key.modifiers.length; i++){
                    var modifier = key.modifiers[i];
                    match = match && event[modifier];   
                }
            }
        }
        return match;
    }
}

/**
 * Useful callbacks/functions are listed below 
 */
function preventDefaultEventPropagation(){

    if(event.cancelBubble) event.cancelBubble = true;
    if(event.stopPropagation) event.stopPropagation();
    if(event.preventDefault) event.preventDefault();

    event.returnValue = false;
    event.keyCode = 0;
    return false;
}

/**
 * Useful methods during developement 
 */
function alertKeyCodes(){
    document.onkeydown = function(){
        alert(event.keyCode || event.which || event.charCode);
        if(event.cancelBubble) event.cancelBubble = true;
        if(event.stopPropagation) event.stopPropagation();
        if(event.preventDefault) event.preventDefault();

        event.returnValue = false;
        event.keyCode = 0;
        return false;
    };
}

Осуществление

$(document).ready(function() {
        var SingleKeys = {
            keyCodes: [114, 116, 121, 122], //F3, F5, F10, F11
            callback: function(event){return preventDefaultEventPropagation();}
        };

        var BackspaceKeys = {
            keyCodes: [8], //Backspace
            callback: function(event){
                var sourceOfEvent = event.target || event.srcElement;
                if(sourceOfEvent.tagName == "BODY"){
                    return preventDefaultEventPropagation();
                }
            }
        };
        var EnterKeys = {
                keyCodes: [13], //Enter
                callback: function(event){
                    var sourceOfEvent = event.target || event.srcElement;
                    if(sourceOfEvent.tagName == "BODY"){
                        return preventDefaultEventPropagation();
                    }
                    if(sourceOfEvent.tagName == "INPUT" && sourceOfEvent.type == "text"){
                        return preventDefaultEventPropagation();
                    }
                }
        };

        var AltKeys = {
            keyCodes: [36, 37, 39], //Home, Left, Right
            modifiers: ['altKey'],
            callback: function(event){return preventDefaultEventPropagation();}
        };

        var CtrlKeys = {
            keyCodes: [66, 68, 69, 72, 73, 76, 78, 79, 82], //B, D, E, H, I, L, N, O, R
            modifiers: ['ctrlKey'],
            callback: function(event){return preventDefaultEventPropagation();}
        };

        addKeyActions([SingleKeys, BackspaceKeys, EnterKeys, AltKeys,CtrlKeys]);
}); 

Просто добавьте ключевой код, который вы хотите перехватить, и соответственно отредактируйте обратный вызов

0 голосов
/ 26 марта 2014

Вы пробовали keyCode == 82, а не 114? Коды клавиш не совпадают с кодами ASCII / charCodes, поэтому не следует рассматривать верхний / нижний регистр.

Это сработало для меня (ну, технически я использовал его с обработчиком клавиш JQuery, а не document.onkeypress):

document.onkeypress = function(e){
  if ((e.ctrlKey || e.metaKey) && e.keyCode == 82) // Ctrl-R
  e.preventDefault();
}

И для всех тех, кто кричит «плохой дизайн» - я создаю эмулятор терминала и хочу, чтобы CTRL-R соответствовал Bash CTRL-R для истории поиска, а не для обновления страницы. Всегда есть варианты использования.

0 голосов
/ 04 октября 2010

для f11 в IE добавить флажок на событие onkeydown для тела (onkeydown='return checkKey(event)' )

function checkKey(e) {
 var alt =  e.altKey;
 var key = e.keyCode;
 var type = e.srcElement.type;
 ctrl = event.ctrlKey

 if ( alt || ((key == 8)&&(type != "text" && type != "textarea" && type != "password")) || (ctrl&&(key == 82)) || (key == 122) ) {
     event.keyCode = 0;
     e.keyCode = 0;
  event.returnValue = false;
                return false;
            }

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