Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 04.08.2012, 07:46
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

<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, 04.08.2012 в 16:25.
Ответить с цитированием
  #22 (permalink)  
Старый 04.08.2012, 09:55
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

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

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

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

А что делать с IE?
Он же не вызывает по событию oninput. Но это не очень важно: в случае чего, сделаю костыль для IE из своего варианта и предупрежу пользователей, чтобы сильно не гнали лошадей.
Ответить с цитированием
  #23 (permalink)  
Старый 04.08.2012, 10:15
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

Сообщение от Demath
Возможно ли ещё учесть случай, когда открывающий и закрывающий теги [math],[/math] на разных строках?
Ну Вставьте очень длинный текст - по-моему оно работает и сейчас ?
Ответить с цитированием
  #24 (permalink)  
Старый 04.08.2012, 16:06
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

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

А скрипт случайно не продублировался?
Вроде, два скрипта с одинаковым количеством строк.
Ответить с цитированием
  #25 (permalink)  
Старый 04.08.2012, 16:26
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Demath
А скрипт случайно не продублировался?
Да - поправил - наверно не выспался
Ответить с цитированием
  #26 (permalink)  
Старый 04.08.2012, 20:39
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

Сообщение от 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('\\/');
Ответить с цитированием
  #27 (permalink)  
Старый 04.08.2012, 20:44
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

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

Я не вижу их на буквенной клаве в русской раскладке
Ответить с цитированием
  #28 (permalink)  
Старый 04.08.2012, 21:04
Аватар для Demath
Профессор
Отправить личное сообщение для Demath Посмотреть профиль Найти все сообщения от Demath
 
Регистрация: 22.06.2012
Сообщений: 168

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

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

Символы ':' и '?', когда включена русская раскладка, набираются с Shift+6 и Shift+7 соответственно, а символ '/' с помощью Shift + клавиша правее 'ъ'. В моей клаве такое расположение, но и чуть с другим.
Ответить с цитированием
  #29 (permalink)  
Старый 04.08.2012, 21:44
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Demath,
Суть в том - что если вставлять спец символы - будут проблемы при надобности их добавить и в самом деле - экспериментируйте сами
Ответить с цитированием
  #30 (permalink)  
Старый 05.08.2012, 21:03
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

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

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

Последний раз редактировалось melky, 05.08.2012 в 21:43.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как взять выделенный текст из textarea? fankiss Общие вопросы Javascript 5 13.02.2016 14:36
Как выполнить javascript из textarea urel Events/DOM/Window 2 08.10.2010 23:21
Как очистить textarea при нажатии на него soniclord Общие вопросы Javascript 12 11.01.2010 08:12
Как округлить число в меньшую сторону с заданной точностью? barcelona Общие вопросы Javascript 2 19.08.2009 12:07
Как можно найти разрешение рабочей области браузера? Влад Общие вопросы Javascript 3 20.07.2009 10:18