Подскажите, как определить, находиться ли каретка внутри ббкода?
Навскидку получилась функция
isCaretInBBcode. Можно ли её упростить?
<input onclick="alert( isCaretInBBcode('a1','tag1') )"
type="button" value="Проверить позицию каретки"
style="margin-bottom: 10px; cursor: pointer;" />
<br />
<textarea id="a1" style="width: 400px; height: 100px;">
Lorem x ipsum [tag1]dolor x sit[/tag1] x amet, x and x consectetur [tag1]adipisicing x[/tag1] elit.
[tag1]x amet[/tag1], x and
</textarea>
<script>
function getCaretPosT(obj) //Возвращает индекс текущего положения каретки в <textarea>
{ // (из Сети)
if (typeof obj != "object") obj = document.getElementById(obj);
obj.focus();
if (document.selection) //ie, opera
{ var s = document.selection.createRange();
if (window.opera) //opera
{ s.moveStart("character", -obj.value.length);
return s.text.length;
}
else
{ var e = document.body.createTextRange(); //IE
e.moveToElementText(obj);
for (var p=0; e.compareEndPoints("StartToStart", s)<0; p++)
{ e.moveStart('character', 1); }
return p;
}
}
else if (obj.selectionStart || obj.selectionStart=="0") return obj.selectionStart;
}
function isCaretInBBcode(obj,tag) // Функция, возвращающая true, если каретка (в textarea)
{ // находится внутри ббкода (аргумент tag)
var obj = document.getElementById(obj),
str = obj.value,
Caret = getCaretPosT(obj),
L = tag.length,
reg = "\\["+tag+"\\]([\\s\\S]*?)\\[\\/"+tag+"\\]",
BBcode = obj.value.match( new RegExp(reg,"g") ),
Length = (BBcode) ? BBcode.length : 0,
count = 0;
for (var i=0; i<Length; i++)
{ var a = str.indexOf(BBcode[i]) + count,
b = a + BBcode[i].length;
if (Caret > a+L+1 && Caret < b-L-2) return true;
count += BBcode[i].length;
str = str.replace(BBcode[i],'');
}
return false;
}
</script>