Pull to refresh

Comments 30

UFO landed and left these words here
О, это идея! Правда, 2 таба (первый — на предпросмотр и не срабатывает на пробеле), но тем же способом идёт и по Enter, и по пробелу.
Я использую скрипт для GreaseMonkey «Tabbable Textarea Plus», который (по крайней мере в Firefox) во всех контролах на странице, в которых есть многострочный ввод текста, перехватывает табы и вместо смены фокуса просто вставляет отступ в текст.
Ну и заодно еще умеет автоотступ после перевода строки.
Вобщем очень удобный плагин особенно при редактировании сообщений с исходным кодом.

userscripts.org/scripts/show/7001
По мне так задача решается с другого конца )
Варианты
1. Разрешить редактирование комментария в течении 15 минут, как на ВaseCamp.
2. В течение 15 секунд не публиковать комментарий на сайте, держа его в статусе unpublished показывая пользователю кнопку «Отменить отправку» как в gmail.
Было бы отлично, но см. абзац про техподдержку. :)
Ну может кто-нибудь прочитает из админов )
Это вполне делается и без техподдержки и действий администрации. Все действия же на стороне пользователя? То есть достаточно написать плагин к браузеру, например, который держит самостоятельно комментарий в течении 15 минут с возможностью редактирования, а потом отсылает его. Но тут есть проблема, что вырубив браузер, мы лишаемся своевременной отсылки этого поста.
Более продвинутый вариант — сохранять этот пост на промежуточном сервере, чтобы он и посылал комментарий через 15 минут. Был же раньше какой-то плагин, который по такой системе позволял незарегистрированным пользователям писать комментарии, которые видны всем при наличии этого плагина? Вот тут по аналогии. Вот только тогда придётся требовать с хабраюзера логин-пароль для авторизации, что не есть гуд.
Нет, в общем, в жизни совершенства)
А я всегда пользуюсь Ctrl+Enter для отправки комментов — мне кажется это очень удобной фичей. Причём я настолько к этому привык, что и на других сайтах пытаюсь делать так же. И, кстати, всё больше сайтов это поддерживает это.
Тогда надо будет в скрипте сделать настройку отключения этой блокировки. Сейчас пишу непереход по табам со своей настройкой, и эта проверка на Ctrl — тоже будет выключаться по настройке (и включена по умолчанию, потому что, думаю, неудобств от неё больше чем людей, использующих).
Да, проблемка актуальна.
Решил для себя так — пишу комменты в каком-нибудь notepad'е(sublime), потом ctrl+A, ctrl+C, ctrl+V.

А самое обидное, что бывает набиваешь какой-то «легкий» коммент (1-2 строки), постишь его, а потом видишь какую-нибудь дурацкую опечатку, а исправить — хрен. Хотя конечно это понятно, что надо бы прочитать то что написал — но часто из-за того что коммент печатается очень быстро, его отправка происходит почти на автомате.
На это тоже можно костыль в скрипте сделать — отправлять всегда в предпросмотр, включать счётчик обратного отсчёта на 15 секунд с предложением проверить, большой кнопкой «Отменить», малым чекбоксом «Отправить немедленно», по которому «Отменить» превращается в «Отправить», и вот — будет прослойка для проверок написанного, уменьшится число кнопок под полем ввода до одной. И будет повод ещё раз подумать, стоит ли это отправлять. (Написал без продумывания деталей за 2 мин. Если кому действительно надо — просьба дать продуманное предложение интерфейса сюда или в личку.) Будет, как предлагал Azy чуть выше, но без нагрузки на техподдержку.
Проблема в том, что предпросмотр не очень корректно работает. Например, у меня не подсвечиваются теги blockquote, code, source, словно их просто нету.
Source-тег работает со своими подсветками (только не пропорциональный шрифт), как на фото, а с другими тегами — есть такое дело, поэтому исправляю ещё одним костылём — стилями ZenComment уже довольно давно.
               
На самом деле проблема очень простая. Это не просто ctrl+enter, т.к. во время печати «ctrl» мы нажимаем довольно редко. Это происходит когда мы в конце строчке переключаем язык, прибилизительно как rtorsten выше. Язык переключается по «ctrl+shift», и одновременно мы нажимаем «enter», чтобы перейти наследующую строчку. Как-то так:
Решил для себя так — пишу комменты в каком-нибудь notepad'е(sublime), потом ctrl+A, ctrl+C, ctrl+V[ctrl-shift][enter]
А самое обидное, что бывает набиваешь

У меня полностью отпала проблема с ложной отправкой комментария после того, как я отказался от дурацкого сочетания «ctrl-shift» и перешёл на переключалку по «caps-lock». Да и вообще — рекомендую себя пересилить и попробовать переключаться именно по капсу — это безумно удобно, потом страшно бесят все эти ctrl+shift и alt+shift.
У меня язык переключался по Ctrl, поэтому случайное срабатывание было ещё более вероятным.
Я сейчас перешёл на Caps Lock (последний месяц), но рядом с ней — Тав, и чудеса, думаю, не прекратятся (по сценарию 1-го комментария).
Ну если оставить переключение по ктрл-ентер, то таб можно и отключить, имхо)
А чем неудобен Shift+Alt? Всю жизнь им пользуюсь, и горя не знаю.
Самое неудобное расположение + проблемы с ненужной активацией меню.
Особенно обидно, когда вставляешь текст комбинацией ctrl+v, потом переходишь на новую строку, и… черновик комментария ушёл. Люди читают неотредактированный текст, отвечают, спорят, ставят минусы… А ты даже ответить не можешь, что «само отправилось», потому что можешь писать комментарии не чаще раза в час :)

Кстати, когда я вставляю комметарии через shift-ins или cmd+v, то случайной отправки не происходит.
api.jquery.com/unbind/
я на всякий случай оставлю здесь, заходите почитайте, посмотрите как анбиндить анонимные функции
Спасибо; этим и отличается академическое знание от реального. Попробуйте взять код и применить знание из API. Тем более, что его всего-то 15 строчек. Когда (и если) получится, можете здесь победно сообщить результат. Предположение о причине неудач — можно в личку. Мне и самому интересно, на чём основано unbind без параметров. В коде jQuery не копался, но removeEventListener(имя, пустая функция, false) же не работает, как хотелось бы?
Вот тут я могу ошибаться, но jquery евенты биндит не совсем так как Вы себе представляете. (опять же напомню что могу ошибаться) jquery вроде как биндит свои функции а ваши хранит отдельно, и когда евенты срабатывают, вызывается функция jquery и она затем ищет что Вы там забиндили и выполняет.
А вот и мои «академические» знания, которые Вы можете проверить и добавить к своим «реальным».
<html>
<body>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
    <script>
        $( function(){
            $('#qwe').click( function(){ 
                alert(1) 
                $('#qwe').unbind('click');
            })
        } )
    </script>
<input type="button" value="click" id="qwe">
</body>
</html>


В том и дело, что нужен не этот, опять-таки, академический пример, а реальный скрипт из статьи или переписанный, применённый к реальной странице так, чтобы он дал результат — неотправку сообщения по Ctrl-Enter. Я всё это уже пробовал до статьи, не стал копать, почему, а написал реально работающий юзерскрипт. Если прокопаете Вы и получится результат — отлично, знания у нас прибавится.
Вы похоже издеваетесь =)
$('#comment_text').unbind('keydown')

Введите это в консоли и попробуйте отправить коментарий с помошью control+enter.
И на бущее: да, я проверил, эта строка работает и коментарий не отправляется.
Вы, наверное, сильно удивитесь, но если попробуете то, что я Вам советовал (дважды), результата не получите. Bы заставляете потратить ещё час на эксперименты, перепроверку и пояснения для одного «Фомы Неверующего» ;).
Ладно, пишу этот неправильный код (академически правильный), который я советовал написать и проверить. Вставьте его как юзерскрипт в браузер (не Chrome). Всё чисто? Переведите, чтобы не отправить пост-запрос с комментарием на Хабр, браузер в «offline».
// ==UserScript==
// @version 1.0-test, 2012-02-05
// @include http://habrahabr.ru/*
// @include http://*.habrahabr.ru/*
// ==/UserScript==
(function(){
var win = (typeof unsafeWindow !='undefined')? unsafeWindow: window;
if(win.$){ //неработающий (!) тест отправки по Ctrl+Enter (не Chrome)
	var comT = win.$('#comment_text');
	if(comT.length==0)
		comT = win.$('#answer_text'); //это для QA
	if(comT){ //если найдена Textarea с вредным действием...
		comT.unbind('keydown'); //пытаемся отменить все обработчики событий
		win.console.log('подтверждение выполненности unbind');
	} //(...и ничего не получаем)
}
})();
(Проверял у себя на Fx9.01,Win32+Scriptish, если что, в Опере то же должно быть.) Или найдите ошибку в этом реальном скрипте (HabrAjax свой отключил на время проверки, но подобное делал изначально в HabrAjax — то же самое), или сообщите, что в Вашей конфигурации это работает.
Кажется, я начинаю догадываться, почему это не работает. Юзерскрипт запускается в конце HTML, но до Ready, а все байнды скрипт на сайте делает по ready. Но ready-событие (DOMContentLoaded) в юзерскрипте работает только в Fx (и не знаю, до или после ready для настоящих скриптов), и нет желания как-то по-особому поддерживать юзерскрипты для Оперы, чтобы начал работать выше написанный скрипт. А этот — срабатывает до байндов. Поэтому из консоли и вообще — unbind, конечно, работает, но для юзерскрипта, написанного так — нет.

На всякий случай, пишу правильный юзерскрипт, решающий задачу (копия из статьи +заголовок):
// ==UserScript==
// @name noCtrlEnter
// @version 1.0, 2012-02-04
// @author spmbt
// @namespace spmbt.kodingen.com
// @description noCtrlEnter
// @include http://habrahabr.ru/*
// @include http://*.habrahabr.ru/*
// ==/UserScript==
(function(){
var win = typeof unsafeWindow !='undefined'? unsafeWindow: window;
if(win.$){ //удалить отправку по Ctrl+Enter (не Chrome)
	var comT = win.$('#comment_text');
	if(comT.length==0)
		comT = win.$('#answer_text');
	if(comT){ //если найдена Textarea с вредным действием...
		comT.constructor.prototype.keydown = function(ha, fKeyD){
			fKeyD == null && (fKeyD = ha, ha = null); //повторяем прототип функции
			var k ='keydown';
			if(this[0].tagName=='TEXTAREA' &&  /^(comment|answer)_text$/.test(this[0].id)){
				fKeyD = function(ev){
					if((ev.ctrlKey || ev.metaKey)&& ev.keyCode == 13) //для демонстрации
						win.console.log('Ctrl-enter не пройдёт', comT.constructor.prototype.click.toString());
				};
			}
			return arguments.length > 0 ? this.bind(k, ha, fKeyD) : this.trigger(k);
		}
	}
}
})();
if( location.href.match(/habrahabr.ru/) )
{
var _init = function(){
var textField = document.getElementById('comment_text');
if( null !== document.getElementById('comment_text') && jQuery )
{
jQuery( function(){
jQuery(textField).unbind('keydown');
});
}
};
document.addEventListener( 'DOMContentLoaded', _init );
}

Если этот код добавить как юзерскрипт в оперу, то он прекрасно анбиндит евент и не отправляет камент по control+enter. Я понимаю что сложно смириться с тем что есть более простое решение которое прекрасно работает, но до которого Вы не дошли по незванию/не чтению документации/не правильному использованию/добавить другое. Но факт остается фактом — этот код прекрасно работает и я это лично проверил именно добавив его как юзерскрипт в опере.
Почему нет? Я, наоборот, прошу его Вас показать, а не академические знания уже целый день :). Теперь дошли до истины.
(По поводу моего знания document.addEventListener( 'DOMContentLoaded', _init ) — в HabrAjax (код) это применяется на 1387-й строке, но там приходится 2 точки загрузки совмещать ради Chrome, срабатывает первая, и это решение не проходит (а 2 точки нужно, потому что первая не работала в Fx3.6). Но в аспекте статьи — самое короткое решение — лучшее.)
Поскольку Вы показали, что в Опере это работает — отлично, можно попробовать написать для Fx/Opera и, может быть, Safari, такой скрипт:
// ==UserScript==
// @name noCtrlEnter
// @version 1.1, 2012-02-05
// @description блокирует отправку комментария по Ctrl+Enter из textarea
// @include http://habrahabr.ru/*
document.addEventListener( 'DOMContentLoaded', function(){
	var win = (typeof unsafeWindow !='undefined')? unsafeWindow: window;
	if(!win.$) return;
	var comT = win.$('#comment_text, #answer_text');
	comT.length && comT.unbind('keydown');
},!1);
В Fiferox проверено, в Опере Вы проверили.
Добавил в статью со ссылкой на Вас, спасибо.
По содержательной части — это решение всё равно временное и неполное, потому что Chrome не охватывает.
Затем, в своём способе я ещё легко применил перехват нажатия «Tab» и Ctrl+пробел" именно за счёт залезания в обработчик, а не отключения его. Хорошо бы ещё несложно интегрировать в Хром, не прибегая к формату расширения *.crx.
Sign up to leave a comment.

Articles