<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>Можно вставлять даже копированием -осталось запретить позицию курсора наезда на теги и запрет их удаления или порчи |
Deff, спасибо! Буду разбираться.
Цитата:
Вроде бы, с этим нет проблем. Во всяком случае, у меня не получилось наехать на теги. Или Вы имеете ввиду запретить умышленные наезд, удаление, порчу? Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках? А что делать с IE? Он же не вызывает по событию oninput. Но это не очень важно: в случае чего, сделаю костыль для IE из своего варианта и предупрежу пользователей, чтобы сильно не гнали лошадей. |
Цитата:
Цитата:
|
Цитата:
А скрипт случайно не продублировался? Вроде, два скрипта с одинаковым количеством строк. |
Цитата:
|
Цитата:
Нужно добавить для корректировки ещё три символа: ':', '?', '/'. Проверьте, пожалуйста, верно дописал? 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('\\/'); |
Demath,
Это символы на русской раскладке ? ':', '?', '/'. И чему они соответствуют на латинице ? Я не вижу их на буквенной клаве в русской раскладке |
Цитата:
Символы ':' и '?', когда включена русская раскладка, набираются с Shift+6 и Shift+7 соответственно, а символ '/' с помощью Shift + клавиша правее 'ъ'. В моей клаве такое расположение, но и чуть с другим. |
Demath,
Суть в том - что если вставлять спец символы - будут проблемы при надобности их добавить и в самом деле - экспериментируйте сами |
http://habrahabr.ru/post/149083/
Автор сего творения, интересно, зарегистрирован на форуме? P.S. лучше было бы так (min). P.S.S. devote, :) |
Часовой пояс GMT +3, время: 02:05. |