I'm attempting to write a "pure DOM" text editor, i.e. one that doesn't 
make any use of special features that are used (I think) by all of the 
current WYSIWYG in-browser editors. The problem I'm trying to resolve 
right now is; when the user moves the cursor vertically, how do I 
determine where to position it?

For example, let's say they press the up arrow key to move the cursor up 
one line. Assume for the time being that the text will be in a linear 
left to right, top to bottom Western layout. Moving the cursor up should 
leave it in the line that is visually above the line the cursor was 
previously on, with its x-position as near as possible to its previous 
x-position.

However, there doesn't seem in JS to be any way of finding the bounding 
box of individual characters within text nodes. The two solutions I've 
come up with are

1) Using a 0-width SPAN element, successively move it backwards one 
character at a time, testing its coordinates at each position, until a 
suitable position is found. normalize text nodes as the SPAN element 
"leaves" them.
2) Move backwards one text node at a time; at each text node, "explode" 
that node by placing each character into a single SPAN element, and then 
test the bounding box of each character. When leaving a text node, 
"implode" it back to its previous state.

Aside from being a bit of a pain to program, my main concern with these 
methods is that they might be too computationally intensive. The first 
will require a lot of splitting and rejoining of text node contents, 
while the second may require (depending on the size of the text node) 
creating a great many one-character DOM elements.

More importantly, I'm worried about how much rendering time this might 
take; if the browser does a full re-render each time (even though, 
theoretically, neither of the above methods should actually cause any 
visible change in the page (I think), that could chew up some 
significant time. If anyone familiar with the internals of Gecko could 
comment, I'd greatly appreciate it.

And, if anyone knows of a simpler method of doing this, please let me know!


Thanks,
Ken
_______________________________________________
dev-tech-layout mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-layout

Reply via email to