Обернуть тегами выделенный фрагмент текста (jQuery)

Sanu0074
На сайте с 31.08.2012
Offline
110
1918

Есть такой блок:

<div class="editor-content" id="editor-content" contenteditable="true">

as dd sad as
</div>

кусок плагина в котором проверяю выделение:

            getSel = function(element) {

var start = 0, end = 0;
var sel, range, priorRange;
if (typeof window.getSelection != "undefined") {
range = window.getSelection().getRangeAt(0);
priorRange = range.cloneRange();
priorRange.selectNodeContents(element);
priorRange.setEnd(range.startContainer, range.startOffset);
start = priorRange.toString().length;
end = start + range.toString().length;
} else if (typeof document.selection != "undefined" &&
(sel = document.selection).type != "Control") {
range = sel.createRange();
priorRange = document.body.createTextRange();
priorRange.moveToElementText(element);
priorRange.setEndPoint("EndToStart", range);
start = priorRange.text.length;
end = start + range.text.length;
}
return {
start: start,
end: end
};
},

alertSelection = function() {
var mainDiv = document.getElementById(sett.id);
var sel = getSel(mainDiv);
var val = editor.html();
var text = val.substr(0,sel.start) + "[abcd]" + val.substr(sel.start,sel.end) + "[/abcd]" + val.substr(sel.end,val.length);

alert(text);
}

при выделении символов "dd", alert выводит следующее: "as [abcd]dd sad as[/abcd] sad as"

хотя по логике должно вывести это: "as [abcd]dd[/abcd] sad as"

проверял что возвращает функция getSel(), все правильно работает...

непойму почему так...

помогите разобраться.

и желательно пример где подобная задача решается, именно такая... много перегуглил уже

зараннее спасибо)

p.s. просьба не троллить по поводу BB, т.к. - здесь исключительно для примера

siv1987
На сайте с 02.04.2009
Offline
427
#1

Потому что у substr синтаксис string.substr(start[, length]) - старт - длина, а не старт - енд.

var length = sel.end - sel.start;

var text = val.substr(0, sel.start) + "[abcd]" + val.substr(sel.start, length) + "[/abcd]" + val.substr(sel.start+length);

Sanu0074
На сайте с 31.08.2012
Offline
110
#2

siv1987, спасибо)

тупанул жестко с синтаксисом(

---------- Добавлено 09.04.2014 в 22:41 ----------

siv1987, я вот сделал щас так, работает, выделят как надо:

		var editor = this,


getSel = function(element) {
var start = 0, end = 0;
var sel, range, priorRange;
if (typeof window.getSelection != "undefined") {
range = window.getSelection().getRangeAt(0);
priorRange = range.cloneRange();
priorRange.selectNodeContents(element);
priorRange.setEnd(range.startContainer, range.startOffset);
start = priorRange.toString().length;
end = start + range.toString().length;
} else if (typeof document.selection != "undefined" &&
(sel = document.selection).type != "Control") {
range = sel.createRange();
priorRange = document.body.createTextRange();
priorRange.moveToElementText(element);
priorRange.setEndPoint("EndToStart", range);
start = priorRange.text.length;
end = start + range.text.length;
}
return {
start: start,
end: end
};
},

stripTags = function(text){
if(text.length<3){return;}
var regex = /(<([^>]+)>)/ig;
return text.replace(regex, "");
},

setTag = function(tag) {
var mainDiv = document.getElementById(sett.id),
sel = getSel(mainDiv),
val = editor.html(),
fragment = stripTags(val.substr(sel.start, (sel.end-sel.start)));

text = val.substr(0, sel.start) + "<"+tag+">" + fragment + "</"+tag+">" + val.substr(sel.end);

editor.html(text);
}



editor.bind('keydown','ctrl+b',function(){
setTag("strong");
return false;
});

Теперь как правильно сделать, чтоб когда уже обрамленный текст (в данном случае жирный) выделяеш, нажимаеш ctrl+b, и он теряет выделение (в данном случае теги strong по краям должны пропасть)....

Как правильно сделать?

В этом примере при обратном выделении вставляется такое: "as dd g>sad as"

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий