I am writing a script to insert presaved html content into Gmail’s editable iframe in the compose page mentioned below. This script is only to be used in Greasemonkey on Firefox. So I don’t need to consider any other browser.
Currently it inserts the text once and then gets bugged. I guess because range.setStart() expects first parameter is a node, which createContextualFragment() does not return.
Is there any other way to add html at current cursor’s position and then move cursor to the end of the added html (not to the end of all content)?
https://mail.google.com/mail/?view=cm&fs=1&tf=1&source=mailto&to=example@example.com
function insertTextAtCursor(text) {
var sel, range, html, textNode;
if (window.frames[3].window.frames[0].getSelection()) {
sel = window.frames[3].window.frames[0].getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
textNode = range.createContextualFragment(text);
//textNode = document.createTextNode(text);
range.insertNode( textNode );
range.setStart(textNode, textNode.length);
range.setEnd(textNode, textNode.length);
sel.removeAllRanges();
sel.addRange(range);
window.frames[3].window.frames[0].focus();
}
}
}
Update 1:
If i comment the code to move the cursor after inserting html then its no longer bugged, but the cursor stays in the same place.
//range.setStart(textNode, textNode.length);
//range.setEnd(textNode, textNode.length);
sel.removeAllRanges();
//sel.addRange(range);
got you something.
with the help from this answer, i wrote this:
save this as test.html to test it locally
or click here to test it online: http://jsfiddle.net/RASG/Vwwm4/
Now all you have to do is change it according to your needs (gmail or any other site)
EDIT
I forgot that you wanted a GM script 🙂
Here it is
Just create an html file with this content to test it