dom.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. function getCaretPosition(element: HTMLInputElement | HTMLTextAreaElement, x: number, y: number) {
  2. const text = element.childNodes[0]
  3. const range = element.ownerDocument.createRange();
  4. const start = 0;
  5. const end = element.value.length;
  6. let caretPosition = start;
  7. range.setStart(text, 0);
  8. range.setEnd(text, end);
  9. range.setStart(text, 0);
  10. for (let i = start; i <= end; i++) {
  11. range.setEnd(text, i);
  12. console.log(range.getBoundingClientRect())
  13. if (range.getBoundingClientRect().left >= x && range.getBoundingClientRect().top >= y) {
  14. caretPosition = i;
  15. break;
  16. }
  17. }
  18. return caretPosition;
  19. }
  20. function setCaretPosition(element: any, position: number) {
  21. element.focus();
  22. if (element.setSelectionRange) {
  23. element.setSelectionRange(position, position);
  24. } else if (element.createTextRange) {
  25. const range = element.createTextRange();
  26. range.collapse(true);
  27. range.moveEnd('character', position);
  28. range.moveStart('character', position);
  29. range.select();
  30. }
  31. }
  32. export const focusToMouse = (element: HTMLInputElement | HTMLTextAreaElement, event: MouseEvent) => {
  33. const caretPosition = getCaretPosition(element, event.clientX, event.clientY);
  34. setCaretPosition(element, caretPosition);
  35. }