Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.12.2008, 18:56
Новичок на форуме
Отправить личное сообщение для Fr0sT Посмотреть профиль Найти все сообщения от Fr0sT
 
Регистрация: 23.12.2008
Сообщений: 4

Отменить обработку события
Всем привет!
Не могу понять, как можно отменить обработку браузером события от клавиатуры. Сочетания клавиш совпадают с хоткеями браузера, и он выполняет оба действия - мою функцию и свою, привязанную к хоткею, что мне совсем не по душе).

function OnKeyPress(ev) 
{     
    if (!ev) ev = window.event; 
     
    if (ev.ctrlKey) 
    { 
        if (ev.keyCode==17) return; 
        switch (key = String.fromCharCode(ev.keyCode).toUpperCase()) 
        { 
            case ... // выбираем свои сочетания, если не то - выходим 
            default: return; 
        } 
        // вот тут пытаемся отменить событие по-всякому 
        ev.returnValue = false; 
        ev.stopPropagation(); 
        ev.preventDefault(); 
        return false; 
    } // if 
}


В основном тестирую под Оперой, но проверял на Лисе, Хроме, Сафари - везде та же ботва. Я уже себе весь мозг сломал ((
Ответить с цитированием
  #2 (permalink)  
Старый 23.12.2008, 19:02
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

keydown до кучи еще отменять не мешало бы. И вообще такие комбинации на keydown ловить надо.
Ответить с цитированием
  #3 (permalink)  
Старый 23.12.2008, 19:12
Новичок на форуме
Отправить личное сообщение для Fr0sT Посмотреть профиль Найти все сообщения от Fr0sT
 
Регистрация: 23.12.2008
Сообщений: 4

Поменял на keydown, ничего не изменилось... до этого обработка стояла на onkeyup, просто название метода не исправил).
Фича точно работает на форуме на движке vBulletin, но там настолько замороченный код... основные моменты я оттуда выцепил, но они почему-то не пашут (кстати, здесь тоже есть такая фича!).
Собственно тестовая страничка в аттаче, если потребуется. Пытаюсь сделать скрипт для быстрой вставки тегов.
Вложения:
Тип файла: txt Untitled2.htm.txt (1.8 Кб, 3 просмотров)

Последний раз редактировалось Fr0sT, 23.12.2008 в 19:19.
Ответить с цитированием
  #4 (permalink)  
Старый 23.12.2008, 20:04
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Смотреть какая клавиша нажата нужно на keydown, а отменять и keydown и keypress.
Ответить с цитированием
  #5 (permalink)  
Старый 24.12.2008, 11:28
Новичок на форуме
Отправить личное сообщение для Fr0sT Посмотреть профиль Найти все сообщения от Fr0sT
 
Регистрация: 23.12.2008
Сообщений: 4

Проблема решилась!

var Handled;

// блокировать обработку, если уже поймали событие в OnKeyDown.
function OnKeyPress(ev)
{
	if (Handled) return false;
}

function OnKeyDown(ev)
{	
	Handled = false;
	if (!ev) ev = window.event;
	if (ev.ctrlKey)
	{
		if (ev.keyCode==17) return;
		var tag = "";
		var tag_param = false;
		// определяем тег в зависимости от нажатой клавиши
		switch (key = String.fromCharCode(ev.keyCode).toUpperCase())
		{
			case "B":
			case "U":
			case "I": tag = key; break;
			
			case "Q": tag = "SPOILER"; tag_param = true; break;
			case "R": tag = "URL"; tag_param = true; break;
			
			default: return;
		}
		
		Handled = true;
		
		var edit = ev.target;
		var opentag = (tag_param) ?  ("["+tag+"=\"\"]") : ("["+tag+"]");
		var closetag = "[/"+tag+"]";

		// вставка тегов вокруг выделенного текста
		edit.focus(); // !  ie?
		if (edit.selectionStart==null) // некий неясный финт ушами
		{
			var rng=document.selection.createRange();
			rng.text=opentag+rng.text+closetag;
		}
		else
		{
			var selStart = edit.selectionStart;
		    edit.value = edit.value.substring(0,selStart)+opentag+
						 edit.value.substring(selStart,edit.selectionEnd)+closetag+
						 edit.value.substring(edit.selectionEnd);
			// поставить курсор после открывающего тега (или между кавычками, если они есть
			edit.selectionStart = selStart + opentag.length - ((tag_param) ? 2 : 0);
			edit.selectionEnd = edit.selectionStart;
		}
		// отменить дальнейшую обработку
		ev.returnValue = false;
		ev.stopPropagation();
		ev.preventDefault();
		return false;
	} // if
}

function init()
{
	document.getElementById("msgedit").onkeydown = MemoOnKeyDown;
	document.getElementById("msgedit").onkeypress = MemoOnKeyPress;
}


Теперь еще осталось найти замену ev.target для осла...
Ответить с цитированием
  #6 (permalink)  
Старый 24.12.2008, 11:37
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

ev.srcElement
Ответить с цитированием
  #7 (permalink)  
Старый 24.12.2008, 11:40
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

window.event.srcElement //target
Ответить с цитированием
  #8 (permalink)  
Старый 24.12.2008, 13:18
Новичок на форуме
Отправить личное сообщение для Fr0sT Посмотреть профиль Найти все сообщения от Fr0sT
 
Регистрация: 23.12.2008
Сообщений: 4

О! Здорово, благодарю). Заработало!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка события Deep Events/DOM/Window 12 29.07.2009 22:58
оброботка события load clgs Общие вопросы Javascript 25 28.10.2008 18:03
отправка файла через обработчик события submit starrich AJAX и COMET 2 13.08.2008 22:29
Dom и события кнопок Гость Events/DOM/Window 4 07.08.2008 18:53
События в javascript для формы. woo_hoo Общие вопросы Javascript 5 17.07.2008 19:13