Горячие клавиши полезны, но не всегда спасают

Недавно работал над SEO-оптимизацией одного из последних проектов.. Честно сказать - новая свернутая панель от Битрикс 12 мне не нравится:

Горячие клавиши для кнопок Битрикс

Эта «свернутая» панель (которая по размерам похожа на развернутую панель Битрикс 11) абсолютно не компактная, невзрачная. Несмотря на это, существует более неудобная вещь - развернутая панель управления. С ней работать возможно только на больших экранах, мой же стандартный ноутбук к таковым не относится.

Несмотря на все неудобства, вызванные развернутой панелью, пользоваться ею приходится, т.к. только на ней есть кнопка «Оптимизация». В очередной раз поработав в режиме постоянного переключения «свернуть»/«развернуть» пришла в голову идея открывать окошко «Оптимизация» по горячей клавише. Кстати, никогда не настраивал горячие клавиши в Битрикс. Мало того, даже не любил их раньше, но статья не об этом.

Собственно, не нашел возможности назначить горячую клавишу этой кнопке. А отступать уже поздно, даже в условиях нехватка времени. В итоге двухчасовой работы решил свою задачу, назначил клавишу Alt-S для быстрого открытия окошка SEO-оптимизации, работает даже при свернутой панели. Мои решение (на jQuery и без него) расписаны ниже.

Быстрое решение - за 1 минуту, на jQuery. Решение удобное, легкое, кроссбраузерное. Проблема в том, что если на проекте не загружен jQuery, то загружать его отдельно для горячих клавиш - не всегда удобно. Хотя, конечно, возможно, делается это так:

$('.bx-panel-seo-icon').eq(0).parent().click();

Здесь алгоритм прост: для начала смотрим на HTML-разметку кнопок на панели управления (удобно через Firebug или в хроме из панели «Инструменты разработчика»), затем получаем SPAN с соотв. классом ("bx-panel-seo-icon"), определяем родителя и имитируем клик по нему. Выбор 1го элемента из выборки eq(0) здесь - на всякий случай - все-таки, в панели теоретически могут быть кнопки с одинаковым классом. Одновременное нажатие на несколько кнопок - не наш вариант.

JavaScript-код, ответственный за выполнение действий по горячим клавишам, находится в админке (Настройки - Настройки продукта - Горячие клавиши). Нажимаем «Добавить», указываем наименование (напр., «Открытие SEO-окошка»), указываем jQuery-код, приведенный выше. Сохраняем. После этого в развернутой панели управления нажимаем иконку настройки горячих клавиш (справа; если такой иконки нет, нужно в настройках главного модуля включить функционал горячих клавиш). В окошке ищем только что созданный код, и назначаем его клавише. У меня это Alt-S. Сохраняем, пробуем. Работает.

Дело осталось за малым - настроить то же самое без jQuery. Для нетерпеливых сразу код:

var C='bx-panel-seo-icon',D=document.getElementsByTagName('*'),i=-1,E,O;while(E=D[++i]){if((' '+(E['class']||E.className)+' ').indexOf(' '+C+' ')>-1){E=E.parentNode;O=document.createEvent('Events');O.initEvent('click',1,0);E.dispatchEvent(O);}}

Сразу оговорюсь, что данный код не работает в IE8. Сделать, чтобы работало в IE8 - легко, но у меня не получилось объединить весь функционал в одном блоке кода. Дело в том, что для горячих клавиш можно указать JavaScript-код длиной не более 255 символов (т.к. за это отвечает поле типа varchar(255) в БД). Поэтому весь код после 255 символа просто обрезается. Поэтому и в решении я сделал попытку сжать код по максимуму.

Первым делом нашел и доработал функцию, которая находит элементы по классу:

function WD_getElementByClass (className, parent) {
	parent || (parent = document);
	var descendants= parent.getElementsByTagName('*'), i=-1, e, result=[];
	while (e=descendants[++i]) {
		((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e);
	}
	return result;
}

Затем нашел функцию, позволяющую имитировать события:

function WD_eventFire(el, etype){
	if (el.fireEvent) {
		(el.fireEvent('on' + etype));
	} else {
		var evObj = document.createEvent('Events');
		evObj.initEvent(etype, true, false);
		el.dispatchEvent(evObj);
	}
}

Последняя функция ищет нужный элемент по классу и выполняет клик на его родителе:

function WD_Click_Btn(C) {
	var WD_Element = WD_getElementByClass(C);
	if (WD_Element[0]) {
		WD_Element = WD_Element[0];
		WD_eventFire(WD_Element.parentNode, 'click');
	}
}

Почти все, казалось - дело за малым, но нет. Ввиду ограничения в 255 символов, над кодом пришлось изрядно потрудиться. Из второй функции пришлось «выкинуть» проверку fireEvent, из-за чего в IE8 скрипт потерял работоспособность. Работаете в IE8? Тогда верните fireEvent, а блок кода по else - удалите.

В итоге получилась такая функция:

function wd_hk() {
	var C='bx-panel-seo-icon',D=document.getElementsByTagName('*'), i=-1, E, O;
	while (E=D[++i]) {
		if((' '+(E['class']||E.className)+' ').indexOf(' '+C+' ') > -1) {
			E=E.parentNode;
			O = document.createEvent('Events');
			O.initEvent('click',1,0);
			E.dispatchEvent(O);
		}
	}
}

Собственно, остается только убрать переносы, пробелы, и «вытащить» исполнение кода из функции. Вот что получается:

var C="bx-panel-seo-icon",D=document.getElementsByTagName("*"),i=-1,E,O;while(E=D[++i])if((" "+(E["class"]||E.className)+" ").indexOf(" "+C+" ")>-1){E=E.parentNode;O=document.createEvent("Events");O.initEvent("click",1,0);E.dispatchEvent(O)};

Вот и все!

Остается только добавить правило для горячей клавиши (в Битрикс с 12й по 14ю версии это в меню «Настройки» - «Настройки продукта» - «Горячие клавиши», в 14й версии - «Настройки» - «Настройки продукта» - «Интерфейс» - «Горячие клавиши») - указать имя правила (напр., «SEO») и сжатый JavaScript-код. После этого в панели управления Битрикс (над сайтом) нажать иконку горячих клавиш, и в строке «SEO» указать горячую клавишу, по которой будет открываться окошко. Если этой иконки нет, значит нужно открыть настройки главного модуля и установить опцию «Использовать горячие клавиши».

Отмечу, что указанным кодом можно «нажимать» и другие кнопки. Просто укажите соответствующий класс в переменной «C». Например, я протестировал для кнопок создания раздела (хотя для этого есть готовая горячая клавиша в Битрикс) и открытия окошка структуры.

Upd.: для jQuery появилась возможность просто указать:

$('#bx_topmenu_btn_seo').click();

Автор: Денис Сон
Дата публикации: 18.06.2013
Просмотров: 1848


Статья Вам помогла? Вы можете поблагодарить нас!

Комментарии

Сергей Колков
11.10.2014 05:44:24
Интересный блог! Статей немного, если убрать рекламные - то почти все интересно.
Про горячие клавиши - была такая проблема, прям аж бесило, но решения так и не нашел. Если будет нужна - попробую сделать так, как написано.





По всем вопросам обращайтесь по нашим контактным данным:

Наверх