Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как исправить раскладку клавиатуры в заданной области textarea (https://javascript.ru/forum/dom-window/30215-kak-ispravit-raskladku-klaviatury-v-zadannojj-oblasti-textarea.html)

Deff 04.08.2012 07:46

<script type="text/javascript">

function LatRus(TxtTrans1,a){TxtTrans1=='lat'? TxtTrans1='rus':TxtTrans1='lat';
lat0='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~[].'.split('');
lat='qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>`~'.split('');
lat.push('\\[');lat.push('\\]');lat.push('\\.');
rus=('йцукенгшщзфывапролджэячсмитьбЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁхъю').split('');
function transF(p){ar1=lat;ar2=rus;if(TxtTrans1=='lat'){ar2=lat0;ar1=rus}for(var i=0; i<ar1.length; i++){trans='/'+ar1[i]+'/gm';p=p.replace(eval(trans), ar2[i])}return p;} return transF(a);
}

var is_chrome = false, chrome_version = false;
if (navigator.userAgent.toLowerCase().indexOf('chrome') > -1) {
        is_chrome = true;
}

function getSelectionStart(o) {
  if (o.createTextRange) {
    // IE, Opera
    var r = document.selection.createRange().duplicate();
    r.moveEnd('character', o.value.length);
    if (r.text == '') {
      return o.value.length;
    }
    return o.value.lastIndexOf(r.text);
  } else { if(is_chrome)return o.selectionStart+1;
    // FF
    return o.selectionStart;
  }
  return true;
}

function setSelectionStart(o,n) {

	if(!document.all) 
	{
		var end = o.value.length;  
		o.setSelectionRange(n,n);  
		o.focus();  
	}
	else
	{      
		var r = o.createTextRange();      
		r.collapse(true);
        r.moveStart("character", n);
        r.moveEnd("character", 0);
        r.select();
	}

  return true;
}

function correctInTag (tx) {
  var Thistext = tx.value;
  var CaretPos = getSelectionStart(tx);

  var rega = /\[math\]([\s\S]*?)\[\/math\]/gm;

function replacer (str, p1, offset, s) {
 var a = '[math]'; var b = '[/math]';
 var St = offset + a.length;
 var End = offset + str.length - b.length;
 if(CaretPos >= St &&CaretPos<=End){
    var Sstr = s.substring(St,End)
    if(Sstr.indexOf(a)!=-1) return str;
    var S = LatRus('rus',Sstr);/*alert(S)*/;
    return a+S+b;
 } else return str;

}
  var str2 = Thistext.replace(rega,replacer)
  tx.value = str2;
  setSelectionStart(tx,CaretPos);
} 
</script>



<textarea oninput="correctInTag (this)" id="abcd" style="width: 300px; height: 100px">
Наберите что-либо на русском внутри
 Наберите что-либо 
на русском внутри [math].

[/math].
И в этом [math].

[/math]
</textarea>
Можно вставлять даже копированием -осталось запретить позицию курсора наезда на теги и запрет их удаления или порчи

Demath 04.08.2012 09:55

Deff, спасибо! Буду разбираться.

Цитата:

Сообщение от Deff
осталось запретить позицию курсора наезда на теги и запрет их удаления или порчи

А разве в Вашем варианте курсор может наехать на теги даже при высокоскоростном наборе?
Вроде бы, с этим нет проблем. Во всяком случае, у меня не получилось наехать на теги.
Или Вы имеете ввиду запретить умышленные наезд, удаление, порчу?

Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках?

А что делать с IE?
Он же не вызывает по событию oninput. Но это не очень важно: в случае чего, сделаю костыль для IE из своего варианта и предупрежу пользователей, чтобы сильно не гнали лошадей.

Deff 04.08.2012 10:15

Цитата:

Сообщение от Demath
Или Вы имеете ввиду запретить умышленные наезд, удаление, порчу?

Да

Цитата:

Сообщение от Demath
Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках?

Ну Вставьте очень длинный текст - по-моему оно работает и сейчас ?

Demath 04.08.2012 16:06

Цитата:

Сообщение от Deff
Ну Вставьте очень длинный текст - по-моему оно работает и сейчас ?

Да, сейчас работает и с разрывами строк внутри тегов. Спасибо!

А скрипт случайно не продублировался?
Вроде, два скрипта с одинаковым количеством строк.

Deff 04.08.2012 16:26

Цитата:

Сообщение от Demath
А скрипт случайно не продублировался?

Да - поправил - наверно не выспался

Demath 04.08.2012 20:39

Цитата:

Сообщение от Deff
Да - поправил

Спасибо. Думал, мало ли что.


Нужно добавить для корректировки ещё три символа: ':', '?', '/'.

Проверьте, пожалуйста, верно дописал?

lat0 = 'qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL;"ZXCVBNM<>`~[].^&|'.split('');

lat = 'qwertyuiopasdfghjkl;\'zxcvbnm\,QWERTYUIOP{}ASDFGHJKL;"ZXCVBNM<>`~'.split('');
lat.push('\\['); lat.push('\\]'); lat.push('\\.');
lat.push('\\^'); lat.push('\\&'); lat.push('\\|');

rus = ('йцукенгшщзфывапролджэячсмитьбЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёЁхъю').split('');
rus.push('\:'); rus.push('\\?'); rus.push('\\/');

Deff 04.08.2012 20:44

Demath,
Это символы на русской раскладке ?
':', '?', '/'.

И чему они соответствуют на латинице ?

Я не вижу их на буквенной клаве в русской раскладке

Demath 04.08.2012 21:04

Цитата:

Сообщение от Deff
Это символы на русской раскладке ?
':', '?', '/'.

И чему они соответствуют на латинице ?
Я не вижу их на буквенной клаве в русской раскладке

Вы правы: их нет на русской буквенной клаве.

Символы ':' и '?', когда включена русская раскладка, набираются с Shift+6 и Shift+7 соответственно, а символ '/' с помощью Shift + клавиша правее 'ъ'. В моей клаве такое расположение, но и чуть с другим.

Deff 04.08.2012 21:44

Demath,
Суть в том - что если вставлять спец символы - будут проблемы при надобности их добавить и в самом деле - экспериментируйте сами

melky 05.08.2012 21:03

http://habrahabr.ru/post/149083/
Автор сего творения, интересно, зарегистрирован на форуме?

P.S. лучше было бы так (min).
P.S.S. devote, :)


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