функция выделения текста в textarea, не работает в IE
Здравствуйте, есть функция для заключения выделенного текста в ббкод, но она не работает в IE.
Помогите пожалуйста:) function tag_add(obj, str1, str2){ obj.focus(); if (typeof(obj.selectionStart) == "number") { if (obj.selectionStart != obj.selectionEnd) { var start = obj.selectionStart; var end = obj.selectionEnd; s = obj.value.substr(start,end-start); obj.value = obj.value.substr(0, start) + str1 + s + str2 + obj.value.substr(end); } else { obj.value = obj.value + str1 + str2; } return true; } return false; } |
// Startup variables var txt = ''; var form_name = 'post'; var text_name = 'req_message'; var Capspos = false; var theSelection = false; // Check for Browser & Platform for PC & IE specific bits // More details from: [url]http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html[/url] var clientPC = navigator.userAgent.toLowerCase(); // Get client info var clientVer = parseInt(navigator.appVersion); // Get browser version var is_ie = ((clientPC.indexOf('msie') != -1) && (clientPC.indexOf('opera') == -1)); var is_win = ((clientPC.indexOf('win') != -1) || (clientPC.indexOf('16bit') != -1)); var baseHeight; // window.onload = initInsertions; // Fix a bug involving the TextRange object. From // [url]http://www.frostjedi.com/terra/scripts/demo/caretBug.html[/url] function initInsertions() { var doc; if (document.forms[form_name]) { doc = document; } else { doc = opener.document; } var textarea = doc.forms[form_name].elements[text_name]; if (is_ie && typeof(baseHeight) != 'number') { textarea.focus(); baseHeight = doc.selection.createRange().duplicate().boundingHeight; if (!document.forms[form_name]) { document.body.focus(); } } } // Apply bbcodes. Code from phpBB // [url]http://phpbb.com/[/url] function bbcode(bbopen, bbclose) { theSelection = false; var textarea = document.forms[form_name].elements[text_name]; textarea.focus(); if ((clientVer >= 4) && is_ie && is_win) { // Get text selection theSelection = document.selection.createRange().text; if (theSelection) { // Add tags around selection document.selection.createRange().text = bbopen + theSelection + bbclose; document.forms[form_name].elements[text_name].focus(); theSelection = ''; return; } } else if (document.forms[form_name].elements[text_name].selectionEnd && (document.forms[form_name].elements[text_name].selectionEnd - document.forms[form_name].elements[text_name].selectionStart > 0)) { mozWrap(document.forms[form_name].elements[text_name], bbopen, bbclose); document.forms[form_name].elements[text_name].focus(); theSelection = ''; return; } //The new position for the cursor after adding the bbcode var caret_pos = getCaretPosition(textarea).start; var new_pos = caret_pos + bbopen.length; // Open tag insert(bbopen + bbclose); // Center the cursor when we don't have a selection // Gecko and proper browsers if (!isNaN(textarea.selectionStart)) { textarea.selectionStart = new_pos; textarea.selectionEnd = new_pos; } // IE else if (document.selection) { var range = textarea.createTextRange(); range.move("character", new_pos); range.select(); storeCaret(textarea); } textarea.focus(); return; } // Insert text at position. Code from phpBB // [url]http://phpbb.com/[/url] function insert(text, spaces, popup) { var textarea; if (!popup) { textarea = document.forms[form_name].elements[text_name]; } else { textarea = opener.document.forms[form_name].elements[text_name]; } if (spaces) { text = ' ' + text + ' '; } if (!isNaN(textarea.selectionStart)) { var sel_start = textarea.selectionStart; var sel_end = textarea.selectionEnd; mozWrap(textarea, text, '') textarea.selectionStart = sel_start + text.length; textarea.selectionEnd = sel_end + text.length; } else if (textarea.createTextRange && textarea.caretPos) { if (baseHeight != textarea.caretPos.boundingHeight) { textarea.focus(); storeCaret(textarea); } var caret_pos = textarea.caretPos; caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text; } else { textarea.value = textarea.value + text; } if (!popup) { textarea.focus(); } } // From [url]http://www.massless.org/mozedit/[/url] function mozWrap(txtarea, open, close) { var selLength = txtarea.textLength; var selStart = txtarea.selectionStart; var selEnd = txtarea.selectionEnd; var scrollTop = txtarea.scrollTop; if (selEnd == 1 || selEnd == 2) { selEnd = selLength; } var s1 = (txtarea.value).substring(0,selStart); var s2 = (txtarea.value).substring(selStart, selEnd) var s3 = (txtarea.value).substring(selEnd, selLength); txtarea.value = s1 + open + s2 + close + s3; txtarea.selectionStart = selEnd + open.length + close.length; txtarea.selectionEnd = txtarea.selectionStart; txtarea.focus(); txtarea.scrollTop = scrollTop; return; } // Insert at Caret position. Code from // [url]http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130[/url] function storeCaret(textEl) { if (textEl.createTextRange) { textEl.caretPos = document.selection.createRange().duplicate(); } } // Caret Position object. Code from phpBB // [url]http://phpbb.com/[/url] function caretPosition() { var start = null; var end = null; } // Get the caret position in an textarea. Code from phpBB // [url]http://phpbb.com/[/url] function getCaretPosition(txtarea) { var caretPos = new caretPosition(); // simple Gecko/Opera way if(txtarea.selectionStart || txtarea.selectionStart == 0) { caretPos.start = txtarea.selectionStart; caretPos.end = txtarea.selectionEnd; } // dirty and slow IE way else if(document.selection) { // get current selection var range = document.selection.createRange(); // a new selection of the whole textarea var range_all = document.body.createTextRange(); range_all.moveToElementText(txtarea); // calculate selection start point by moving beginning of range_all to beginning of range var sel_start; for (sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++) { range_all.moveStart('character', 1); } txtarea.sel_start = sel_start; // we ignore the end value for IE, this is already dirty enough and we don't need it caretPos.start = txtarea.sel_start; caretPos.end = txtarea.sel_start; } return caretPos; } function smile(code, popup) { return insert(code, true, popup); } |
Alexander333,
Просто кроссбраузерно она несколько длиннее вставка BB кода function bbcode(bbopen, bbclose) Пример: bbcode('[b]', '[/b]') - должно обернуть выделенное в textarea при клике на что-то, вызывающего данную функцию |
да точно))) Спасибо буду разбираться!
|
Deff,
подскажите какие данные вводить в переменные, а то введу не то и не буду знать из-за чего не работает) var txt = ''; var form_name = 'post'; var text_name = 'req_message'; var Capspos = false; var theSelection = false; |
var form_name = 'post';
var text_name = 'req_message'; Воть эти две - id формы и её имя остальное не трогаем(прост начальная инициализация при загрузке страницы |
Deff,
Еще раз большое спасибо! Все отлично работает)) |
Часовой пояс GMT +3, время: 19:59. |