Skip to content

Commit 197837d

Browse files
committed
Merge pull request #130 from htcang/master
Support position fixed for auto complete list
2 parents e55da92 + fca1d76 commit 197837d

1 file changed

Lines changed: 41 additions & 12 deletions

File tree

jquery.mentionsInput.js

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,25 @@
257257
return c = document.createElement("div"), $(c).css(g), $(i).after(c), b = document.createTextNode(i.value.substring(0, i.selectionEnd)), a = document.createTextNode(i.value.substring(i.selectionEnd)), d = document.createElement("span"), d.innerHTML = " ", c.appendChild(b), c.appendChild(d), c.appendChild(a), c.scrollTop = i.scrollTop, f = $(d).position(), $(c).remove(), f
258258
}
259259

260+
//same as above function but return offset instead of position
261+
function textareaSelectionOffset($el) {
262+
var a, b, c, d, e, f, g, h, i, j, k;
263+
if (!(i = $el[0])) return;
264+
if (!$(i).is("textarea")) return;
265+
if (i.selectionEnd == null) return;
266+
g = {
267+
position: "absolute",
268+
overflow: "auto",
269+
whiteSpace: "pre-wrap",
270+
wordWrap: "break-word",
271+
boxSizing: "content-box",
272+
top: 0,
273+
left: -9999
274+
}, h = ["boxSizing", "fontFamily", "fontSize", "fontStyle", "fontVariant", "fontWeight", "height", "letterSpacing", "lineHeight", "paddingBottom", "paddingLeft", "paddingRight", "paddingTop", "textDecoration", "textIndent", "textTransform", "width", "word-spacing"];
275+
for (j = 0, k = h.length; j < k; j++) e = h[j], g[e] = $(i).css(e);
276+
return c = document.createElement("div"), $(c).css(g), $(i).after(c), b = document.createTextNode(i.value.substring(0, i.selectionEnd)), a = document.createTextNode(i.value.substring(i.selectionEnd)), d = document.createElement("span"), d.innerHTML = "&nbsp;", c.appendChild(b), c.appendChild(d), c.appendChild(a), c.scrollTop = i.scrollTop, f = $(d).offset(), $(c).remove(), f
277+
}
278+
260279
//Scrolls back to the input after autocomplete if the window has scrolled past the input
261280
function scrollToInput() {
262281
var elmDistanceFromTop = $(elmInputBox).offset().top; //input offset
@@ -455,18 +474,28 @@
455474
}
456475

457476
function positionAutocomplete(elmAutocompleteList, elmInputBox) {
458-
var position = textareaSelectionPosition(elmInputBox),
459-
lineHeight = parseInt(elmInputBox.css('line-height'), 10) || 18;
460-
elmAutocompleteList.css('width', '15em'); // Sort of a guess
461-
elmAutocompleteList.css('left', position.left);
462-
elmAutocompleteList.css('top', lineHeight + position.top);
463-
464-
//check if the right position of auto complete is larger than the right position of the input
465-
//if yes, reset the left of auto complete list to make it fit the input
466-
var elmInputBoxRight = elmInputBox.offset().left + elmInputBox.width(),
467-
elmAutocompleteListRight = elmAutocompleteList.offset().left + elmAutocompleteList.width();
468-
if (elmInputBoxRight <= elmAutocompleteListRight) {
469-
elmAutocompleteList.css('left', Math.abs(elmAutocompleteList.position().left - (elmAutocompleteListRight - elmInputBoxRight)));
477+
var elmAutocompleteListPosition = elmAutocompleteList.css('position');
478+
if (elmAutocompleteListPosition == 'absolute') {
479+
var position = textareaSelectionPosition(elmInputBox),
480+
lineHeight = parseInt(elmInputBox.css('line-height'), 10) || 18;
481+
elmAutocompleteList.css('width', '15em'); // Sort of a guess
482+
elmAutocompleteList.css('left', position.left);
483+
elmAutocompleteList.css('top', lineHeight + position.top);
484+
485+
//check if the right position of auto complete is larger than the right position of the input
486+
//if yes, reset the left of auto complete list to make it fit the input
487+
var elmInputBoxRight = elmInputBox.offset().left + elmInputBox.width(),
488+
elmAutocompleteListRight = elmAutocompleteList.offset().left + elmAutocompleteList.width();
489+
if (elmInputBoxRight <= elmAutocompleteListRight) {
490+
elmAutocompleteList.css('left', Math.abs(elmAutocompleteList.position().left - (elmAutocompleteListRight - elmInputBoxRight)));
491+
}
492+
}
493+
else if (elmAutocompleteListPosition == 'fixed') {
494+
var offset = textareaSelectionOffset(elmInputBox),
495+
lineHeight = parseInt(elmInputBox.css('line-height'), 10) || 18;
496+
elmAutocompleteList.css('width', '15em'); // Sort of a guess
497+
elmAutocompleteList.css('left', offset.left + 10000);
498+
elmAutocompleteList.css('top', lineHeight + offset.top);
470499
}
471500
}
472501

0 commit comments

Comments
 (0)