.InFo
Вечно пьян, вечно в бреду

Получение выделенного текста

Январь 16th, 2008 by mAd

Столкнулся с такой задачей, нужно получить координаты выделенного текста в textarea.

В Mozilla всё проще простого selectionStart и selectionEnd. В IE это, как и ожидалось, не работает. Но нужна кросбраузерность.

Порыскав немного по нету, нашёл подходящий код (свой собственный мне не понравился).

function Selection(textareaElement) {
this.element = textareaElement;
}
Selection.prototype.create = function() {
if (document.selection != null && this.element.selectionStart == null) {
return this._ieGetSelection();
} else {
return this._mozillaGetSelection();
}
}
Selection.prototype._mozillaGetSelection = function() {
return {
start: this.element.selectionStart,
end: this.element.selectionEnd
};
}
Selection.prototype._ieGetSelection = function() {
this.element.focus();
var range = document.selection.createRange();
var bookmark = range.getBookmark();
var contents = this.element.value;
var originalContents = contents;
var marker = this._createSelectionMarker();
while(contents.indexOf(marker) != -1) {
marker = this._createSelectionMarker();
}
var parent = range.parentElement();
if (parent == null || parent.type != "textarea") {
    return { start: 0, end: 0 };
}
range.text = marker + range.text + marker;
contents = this.element.value;
var result = {};
result.start = contents.indexOf(marker);
contents = contents.replace(marker, "");
result.end = contents.indexOf(marker);
this.element.value = originalContents;
range.moveToBookmark(bookmark);
range.select();
return result;
}
Selection.prototype._createSelectionMarker = function() {
return "###SM_" + Math.random() + "###";
}

Юзается очень просто:


var selection = new Selection(document.getElementById("textArea"));
var sel = selection.create();
sel.start;// начало выделения
sel.end;//конец выделения

Работает в IE 6 Mozilla 2.x Oper9.2 и выше. Как с остальными, не проверял.

Да, ещё, следите за тем чтобы при event не терялось выделение (например <span onclick=”sel()”>click<span> в IE начало и конец выделения будут одинаковы);

PS. код класса не мой. я его нашёл в инете, к сажеленью адрес ресурса и контакты автора не сохранились :(

Posted in javascript

One Response

  1. Colt

    Спасиб, очень помогла статейка

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.

rss RSS