Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Отменить обработку события (https://javascript.ru/forum/events/2426-otmenit-obrabotku-sobytiya.html)

Fr0sT 23.12.2008 18:56

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

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 
}


В основном тестирую под Оперой, но проверял на Лисе, Хроме, Сафари - везде та же ботва. Я уже себе весь мозг сломал ((

Kolyaj 23.12.2008 19:02

keydown до кучи еще отменять не мешало бы. И вообще такие комбинации на keydown ловить надо.

Fr0sT 23.12.2008 19:12

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

Kolyaj 23.12.2008 20:04

Смотреть какая клавиша нажата нужно на keydown, а отменять и keydown и keypress.

Fr0sT 24.12.2008 11:28

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

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 для осла...

Kolyaj 24.12.2008 11:37

ev.srcElement

Octane 24.12.2008 11:40

window.event.srcElement //target

Fr0sT 24.12.2008 13:18

О! Здорово, благодарю). Заработало!


Часовой пояс GMT +3, время: 07:53.