Определить, находится ли каретка внутри ббкода
Подскажите, как определить, находиться ли каретка внутри ббкода?
Навскидку получилась функция 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> |
Часовой пояс GMT +3, время: 20:08. |