Links in designMode

P

pr

Nik said:
Has anybody worked out how to get a pop up form to display for a link
when designMode is turned on ?

I'm trying to write a WYSIWYG HTML editor for OpenForum Wiki and want
a small helper form to be displayed when an editor clicks on an
existing link.

http://www.onestonesoup.org/ProjectOpenForum

I don't know about IE, but Firefox has a lot of wonderful W3C DOM kit
that makes it quite simple. This basic example (no feature detection of
any sort) detects mouse clicks and keydowns. In the case of the former
it looks for an ancestor <a href="..."> element of the event target. In
the case of the latter (and pressing the enter key), a similar ancestor
of whatever node contains the start of the user selection. Finding
either, it displays an alert message where your 'helper form' would
normally go. This ensures the feature is both mouse and keyboard accessible.

For background see:
http://www.w3.org/TR/DOM-Level-2-Events
http://www.w3.org/TR/DOM-Level-2-Traversal-Range
http://www.w3.org/TR/DOM-Level-3-XPath

Tested in Firefox 2.0.0.13 and 3.0b4.

.....................

function init() {
var d = document;
d.addEventListener("click", clicked, false);
d.addEventListener("keydown", keyed, false);
d.designMode = "on";
}

function clicked(e) {
var n = findAncestorLink(e.target);
if (n) {
e.stopPropagation();
popupWin();
}
}

function keyed(e) {
if (e.keyCode == 13) { // enter
var s = window.getSelection(), r;
if (s && s.rangeCount) {
r = s.getRangeAt(0);
}
var n = findAncestorLink(r.startContainer);
if (n) {
e.preventDefault();
popupWin();
}
}
}

function popupWin() {
window.alert("Your dialog here");
}

function findAncestorLink(n) {
var link =
document.evaluate("ancestor-or-self::a[@href]", n, null,
XPathResult.ANY_UNORDERED_NODE_TYPE, null);
return link.singleNodeValue;
}

....

<body onload="init()">...
 
N

Nik

Nikwrote:
Has anybody worked out how to get a pop up form to display for a link
when designMode is turned on ?
I'm trying to write a WYSIWYG HTML editor for OpenForum Wiki and want
a small helper form to be displayed when an editor clicks on an
existing link.

I don't know about IE, but Firefox has a lot of wonderful W3C DOM kit
that makes it quite simple. This basic example (no feature detection of
any sort) detects mouse clicks and keydowns. In the case of the former
it looks for an ancestor <a href="..."> element of the event target. In
the case of the latter (and pressing the enter key), a similar ancestor
of whatever node contains the start of the user selection. Finding
either, it displays an alert message where your 'helper form' would
normally go. This ensures the feature is both mouse and keyboard accessible.

For background see:
http://www.w3.org/TR/DOM-Level-2-Events
http://www.w3.org/TR/DOM-Level-2-Traversal-Range
http://www.w3.org/TR/DOM-Level-3-XPath

Tested in Firefox 2.0.0.13 and 3.0b4.

....................

function init() {
var d = document;
d.addEventListener("click", clicked, false);
d.addEventListener("keydown", keyed, false);
d.designMode = "on";
}

function clicked(e) {
var n = findAncestorLink(e.target);
if (n) {
e.stopPropagation();
popupWin();
}
}

function keyed(e) {
if (e.keyCode == 13) { // enter
var s = window.getSelection(), r;
if (s && s.rangeCount) {
r = s.getRangeAt(0);
}
var n = findAncestorLink(r.startContainer);
if (n) {
e.preventDefault();
popupWin();
}
}
}

function popupWin() {
window.alert("Your dialog here");
}

function findAncestorLink(n) {
var link =
document.evaluate("ancestor-or-self::a[@href]", n, null,
XPathResult.ANY_UNORDERED_NODE_TYPE, null);
return link.singleNodeValue;
}

...

<body onload="init()">...

Thanks for that. It worked a treat.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,430
Messages
2,571,676
Members
48,796
Latest member
Greg L.

Latest Threads

Top