javascript – 从FF / Webkit中的像素位置创建折叠范围

前端之家收集整理的这篇文章主要介绍了javascript – 从FF / Webkit中的像素位置创建折叠范围前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用 JavaScript,我想从像素位置创建一个折叠的范围,以便在此位置标识的范围之后,在文档流中插入新节点.

这可以通过Internet Exporer(moveToPoint(x,y)方法)中的TextRange对象来完成.

我如何在FireFox& WebKit的?

我可以从document.elementFromPoint(x,y)的位置获取容器元素.但是,当位置恰好位于文本节点内时,如何获取有关构建范围所需的文本偏移量的更多信息?

解决方法

以下是我对旧浏览器的caretRangeFromPoint的实现:
  1. if (!document.caretRangeFromPoint) {
  2. document.caretRangeFromPoint = function(x,y) {
  3. var log = "";
  4.  
  5. function inRect(x,y,rect) {
  6. return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;
  7. }
  8.  
  9. function inObject(x,object) {
  10. var rects = object.getClientRects();
  11. for (var i = rects.length; i--;)
  12. if (inRect(x,rects[i]))
  13. return true;
  14. return false;
  15. }
  16.  
  17. function getTextNodes(node,x,y) {
  18. if (!inObject(x,node))
  19. return [];
  20.  
  21. var result = [];
  22. node = node.firstChild;
  23. while (node) {
  24. if (node.nodeType == 3)
  25. result.push(node);
  26. if (node.nodeType == 1)
  27. result = result.concat(getTextNodes(node,y));
  28.  
  29. node = node.nextSibling;
  30. }
  31.  
  32. return result;
  33. }
  34.  
  35. var element = document.elementFromPoint(x,y);
  36. var nodes = getTextNodes(element,y);
  37. if (!nodes.length)
  38. return null;
  39. var node = nodes[0];
  40.  
  41. var range = document.createRange();
  42. range.setStart(node,0);
  43. range.setEnd(node,1);
  44.  
  45. for (var i = nodes.length; i--;) {
  46. var node = nodes[i],text = node.nodeValue;
  47.  
  48.  
  49. range = document.createRange();
  50. range.setStart(node,0);
  51. range.setEnd(node,text.length);
  52.  
  53. if (!inObject(x,range))
  54. continue;
  55.  
  56. for (var j = text.length; j--;) {
  57. if (text.charCodeAt(j) <= 32)
  58. continue;
  59.  
  60. range = document.createRange();
  61. range.setStart(node,j);
  62. range.setEnd(node,j + 1);
  63.  
  64. if (inObject(x,range)) {
  65. range.setEnd(node,j);
  66. return range;
  67. }
  68. }
  69. }
  70.  
  71. return range;
  72. };
  73. }

猜你在找的JavaScript相关文章