I'm working on a regex-analyzer that has syntax highlighting as a feature.
My site uses an overlay of two contenteditable divs.
Because of the difficulty in getting the cursor position and maintaining that even as tags are added and subtracted, I decided the best route was to have two contenteditable divs, one on top of the other. The first (#rInput
) is pretty plain. If not for some nuisance problems that made me switch from a textarea, it could be a textarea. The second (#rSyntax
) gets its value from rInput
and provides syntax highlighting. I make sure that both are always scrolled to the same position so that the overlay is perfect (However, I also use a transparent (rgba(...)
) font on rSyntax
, so that if a momentary sync-delay should occur, the text is still legible.)
In the lower portion snapshot above, the code of the contenteditable rSyntax
is this:
<span class="cglayer">(test<span class="cglayer">(this)</span>string)</span>
While rInput
, positioned exactly on top, contains only this
(test(this)string)
The problem with this method is that I want to offer some alt-tooltips (or a javascript version) when a user mouses over. When the user mouses over rInput
, I would like to pass the mouseover event to elements of rSyntax
.
I'd like mousing over (test ... string)
to show "Capturing group 1", while mousing over (this)
would show "Capturing group 2", or if it were (?:test)
, it would say "Non-capturing group".
The terminology is a little tough because searching for things like "above" and "below" pulls up a lot of results that have nothing to do with z-index
.
I did find the css property pointer-events
which sounded ideal for the briefest moment but doesn't allow you to filter pointer events (set rInput
to receive clicks, scrolls, but pass mouseover
through to rSyntax
and its child-elements.
I found document.elementFromPoint
which may offer a solution but I'm not really sure how. I thought I would try document.getElementById('rInput').getElementFromPoint(mouseX,mouseY)
, but this function is not available to child elements.
Theoretically, I could hide the rInput
on mousemove, using a setTimeout to put it back quickly, and then a tooltip should appear when mousing over child elements of rSyntax
, but that doesn't seem like the best solution because I don't want rSyntax
to be clickable. Clicks should always go to rInput
.
It's possible to disable the mouseover wizardry while rInput
has the focus, but then tooltips from rSyntax
won't work, and though I haven't tried this method, I'm not sure if passing a click event from rSyntax
to rInput
would position the cursor properly.
Is there a method to make this work?
Aucun commentaire:
Enregistrer un commentaire