Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.03 KB | None | 0 0
  1. <div id="editableDiv" contenteditable="true">
  2. I may tweet from @twitter in the near #future
  3. <ul id="suggestUL"></ul>
  4. </div>
  5.  
  6. function getCaretPixelPos($node) {
  7. var offsetx = 0;
  8. var offsety = 0;
  9.  
  10. var nodeLeft = 0,
  11. nodeTop = 0;
  12. if ($node) {
  13. nodeLeft = $node.offsetLeft;
  14. nodeTop = $node.offsetTop;
  15. }
  16.  
  17. var pos = { left: 0, top: 0 };
  18.  
  19. if (document.selection) {
  20. var range = document.selection.createRange();
  21. pos.left = range.offsetLeft + offsetx - nodeLeft + 'px';
  22. pos.top = range.offsetTop + offsety - nodeTop + 'px';
  23. } else if (window.getSelection) {
  24. var sel = window.getSelection();
  25. var range = sel.getRangeAt(0).cloneRange();
  26. try {
  27. range.setStart(range.startContainer, range.startOffset - 1);
  28. } catch (e) { }
  29. var rect = range.getBoundingClientRect();
  30. if (range.endOffset == 0 || range.toString() === '') {
  31. // first char of line
  32. if (range.startContainer == $node) {
  33. // empty div
  34. if (range.endOffset == 0) {
  35. pos.top = '0px';
  36. pos.left = '0px';
  37. } else {
  38. // firefox need this
  39. var range2 = range.cloneRange();
  40. range2.setStart(range2.startContainer, 0);
  41. var rect2 = range2.getBoundingClientRect();
  42. pos.left = rect2.left + offsetx - nodeLeft + 'px';
  43. pos.top = rect2.top + rect2.height + offsety - nodeTop + 'px';
  44. }
  45. } else {
  46. pos.top = range.startContainer.offsetTop + 'px';
  47. pos.left = range.startContainer.offsetLeft + 'px';
  48. }
  49. } else {
  50. pos.left = rect.left + rect.width + offsetx - nodeLeft + 'px';
  51. pos.top = rect.top + offsety - nodeTop + 'px';
  52. }
  53. }
  54. //console.log('pos left : ' + pos.left + ' pos top : ' + pos.top);
  55. //console.log($('#suggestUL'));
  56. $('#suggestUL').css('left', pos.left);
  57. $('#suggestUL').css('top', pos.top);
  58. //console.log('suggestUL left : ' + $('#suggestUL').css('left') + ' suggestUL top : ' + $('#suggestUL').css('top'));
  59. };
  60.  
  61. var event = e || window.event;
  62. var keyCode = event.keyCode || event.which;
  63. if (keyCode == 35 || keyCode == 64)
  64. getCaretPixelPos($('#editableDiv')[0]);
  65.  
  66. var fetchData = false;
  67. var suggestionChar = '';
  68. $('#editableDiv').on('keypress',function(event){
  69. var keyCode = event.which || event.keyCode.
  70. var hashKey; // Set keyCode for #
  71. var atKey; // Set keycode for @
  72. var spaceKey //SpaceKey code
  73. if(keyCode == hashKey || keyCode == atKey){
  74. fetchData = true
  75. suggestionChar = '';
  76. return; //flag is set now look out for next key cod.
  77. }
  78. else if ( keyCode == spaceKey ){
  79. fetchData = false;
  80. suggestionChar = '';
  81. }
  82. if( fetchData){
  83. var data = String.fromCharCode(keyCode);
  84. suggestionChar = suggestionChar + data;
  85. // use "suggestionChar" for fetching the data from server.
  86. // fetch suggestions from Server.
  87. // On success call back create the dynamic list of ul/li which will show the suggestion to user. You need to bind the user click event and/or keypress event for ul/li so that user can select the suggestion using mouse and keyboard along with 'Space' key.
  88. }
  89. })
  90.  
  91. $('textarea').on('click keyup', function isAt() {
  92. var idx = getCaret(this),
  93. text = $(this).val(),
  94. word = getWord(text, idx);
  95. $('p').html([
  96. '"', word, '" ', word.charAt(0) === '@'
  97. ? '<span style="color:blue">is prefixed</span>'
  98. : '<span style="color:red">is not prefixed</span>'
  99. ].join(''));
  100. }).focus();
  101.  
  102. function getWord(s, i) {
  103. var r = /s/g;
  104. if (!i || r.test(s[i - 1])) return '';
  105. while (i && !r.test(s[--i])) {}
  106. r.lastIndex = i && ++i;
  107. return s.slice(i, (
  108. r.exec(s) || { index: s.length }
  109. ).index);
  110. }
  111.  
  112. var str = '';
  113. $('#editableDiv').keyup(function(e){
  114. if($(this).val() == '@' || $(this).val() == "#"){
  115. if(e.keyCode !=32){
  116. str += String.fromCharCode(e.keyCode);
  117. }
  118. }
  119. });
  120. alert(str);
  121.  
  122. var fetchSuggestions = false;
  123. var suggestForString = '';
  124. function fnShowSuggestionUL(e) {
  125. var event = e || window.event;
  126. var keyCode = event.keyCode || event.which;
  127. // KeyCode = 35 -> #
  128. // KeyCode = 64 -> @
  129. // KeyCode = 32 -> space
  130. // KeyCode = 13 -> Enter (Carriage Return)
  131. if (keyCode == 35 || keyCode == 64) {
  132. fetchSuggestions = true;
  133. suggestForString = '';
  134. $('#suggestUL').css('display', 'block');
  135. fnPositionSuggestUL();
  136. }
  137. else if (keyCode == 32 || keyCode == 13) {
  138. fetchSuggestions = false;
  139. suggestForString = '';
  140. $('#suggestUL').css('display', 'none');
  141. return;
  142. }
  143. if (fetchSuggestions == false)
  144. return;
  145. var data = String.fromCharCode(keyCode);
  146. suggestForString = suggestForString + data;
  147. // TODO: bring suggestions from database and append them as list items to "suggestUL"
  148. }
  149.  
  150. function fnPositionSuggestUL() {
  151. var $node = $('#editableDiv')[0]
  152. var offsetx = 0;
  153. var offsety = 0;
  154.  
  155. var nodeLeft = 0,
  156. nodeTop = 0;
  157. if ($node) {
  158. nodeLeft = $node.offsetLeft;
  159. nodeTop = $node.offsetTop;
  160. }
  161.  
  162. var pos = { left: 0, top: 0 };
  163.  
  164. if (document.selection) {
  165. var range = document.selection.createRange();
  166. pos.left = range.offsetLeft + offsetx - nodeLeft + 'px';
  167. pos.top = range.offsetTop + offsety - nodeTop + 'px';
  168. } else if (window.getSelection) {
  169. var sel = window.getSelection();
  170. var range = sel.getRangeAt(0).cloneRange();
  171. try {
  172. range.setStart(range.startContainer, range.startOffset - 1);
  173. } catch (e) { }
  174. var rect = range.getBoundingClientRect();
  175. if (range.endOffset == 0 || range.toString() === '') {
  176. // first char of line
  177. if (range.startContainer == $node) {
  178. // empty div
  179. if (range.endOffset == 0) {
  180. pos.top = '0';
  181. pos.left = '0';
  182. } else {
  183. // firefox need this
  184. var range2 = range.cloneRange();
  185. range2.setStart(range2.startContainer, 0);
  186. var rect2 = range2.getBoundingClientRect();
  187. pos.left = rect2.left + offsetx - nodeLeft;
  188. pos.top = rect2.top + rect2.height + offsety - nodeTop;
  189. }
  190. } else {
  191. pos.top = range.startContainer.offsetTop;
  192. pos.left = range.startContainer.offsetLeft;
  193. }
  194. } else {
  195. pos.left = rect.left + rect.width + offsetx - nodeLeft;
  196. pos.top = rect.top + offsety - nodeTop;
  197. }
  198. }
  199. //Create suggestUL if does not exist or destroyed
  200. fnCreateSuggestUL();
  201.  
  202. $('#suggestUL').css('left', pos.left + 'px').css('top', (pos.top + 18)+'px');
  203. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement