From ce43c86e893a6e6f9dd2f99fb4675ed51a40a80c Mon Sep 17 00:00:00 2001 From: Vladimir Kryukov Date: Tue, 4 Mar 2014 15:29:16 +0200 Subject: [PATCH] Update jquery-fieldselection.js Callback function support and some bug fix --- jquery-fieldselection.js | 106 ++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 57 deletions(-) diff --git a/jquery-fieldselection.js b/jquery-fieldselection.js index b5a9ca1..60f623d 100644 --- a/jquery-fieldselection.js +++ b/jquery-fieldselection.js @@ -1,79 +1,71 @@ /* - * jQuery plugin: fieldSelection - v0.1.1 - last change: 2006-12-16 + * jQuery plugin: fieldSelection - v0.1.2 - last change: 2006-12-16 * (c) 2006 Alex Brem - http://blog.0xab.cd + * (c) 2014 Vladimir Kryukov */ (function() { - var fieldSelection = { getSelection: function() { - var e = (this.jquery) ? this[0] : this; - return ( - /* mozilla / dom 3.0 */ - ('selectionStart' in e && function() { - var l = e.selectionEnd - e.selectionStart; - return { start: e.selectionStart, end: e.selectionEnd, length: l, text: e.value.substr(e.selectionStart, l) }; - }) || - - /* exploder */ - (document.selection && function() { - - e.focus(); - - var r = document.selection.createRange(); - if (r === null) { - return { start: 0, end: e.value.length, length: 0 } - } - - var re = e.createTextRange(); - var rc = re.duplicate(); - re.moveToBookmark(r.getBookmark()); - rc.setEndPoint('EndToStart', re); - - return { start: rc.text.length, end: rc.text.length + r.text.length, length: r.text.length, text: r.text }; - }) || - - /* browser not supported */ - function() { return null; } - - )(); - + ('selectionStart' in e && function() { + var l = e.selectionEnd - e.selectionStart; + return { start: e.selectionStart, end: e.selectionEnd, length: l, text: e.value.substr(e.selectionStart, l) }; + }) || + /* exploder */ + (document.selection && function() { + + e.focus(); + + var r = document.selection.createRange(); + if (r === null) { + return { start: 0, end: e.value.length, length: 0 } + } + + var re = e.createTextRange(); + var rc = re.duplicate(); + re.moveToBookmark(r.getBookmark()); + rc.setEndPoint('EndToStart', re); + + return { start: rc.text.length, end: rc.text.length + r.text.length, length: r.text.length, text: r.text }; + }) || + /* browser not supported */ + function() { return null; } + )(); }, replaceSelection: function() { - - var e = (typeof this.id == 'function') ? this.get(0) : this; + var e = (this.jquery) ? this[0] : this; var text = arguments[0] || ''; - return ( + // Support for callback function + if(text instanceof Function) { + var selectedText = fieldSelection.getSelection.call(e); + text = text.call(this, selectedText.text); + } + return ( /* mozilla / dom 3.0 */ - ('selectionStart' in e && function() { - e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length); - return this; - }) || - - /* exploder */ - (document.selection && function() { - e.focus(); - document.selection.createRange().text = text; - return this; - }) || - - /* browser not supported */ - function() { - e.value += text; - return jQuery(e); - } - - )(); - + ('selectionStart' in e && function() { + e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length); + return this; + }) || + /* exploder */ + (document.selection && function() { + e.focus(); + document.selection.createRange().text = text; + return this; + }) || + /* browser not supported */ + function() { + e.value += text; + return jQuery(e); + } + )(); } - }; jQuery.each(fieldSelection, function(i) { jQuery.fn[i] = this; });