2010-06-20 3 views
2

J'essaye de construire une extension de safari (principalement à des fins d'apprentissage) qui crée un signet délicieux, lorsque l'utilisateur clique droit sur un lien. J'ai regardé la vidéo WWDC Création d'une extension Safari et tout fonctionne correctement. Sauf que je n'ai aucune idée de la façon de savoir si l'utilisateur a cliqué sur un lien (ou seulement du texte) et si c'est le cas, obtenez son URL et son titre. Ce que j'ai obtenu jusqu'ici est le suivant:Identifier le lien sur l'événement contextmenu dans l'extension safari

document.addEventListener("contextmenu", handleContextMenu, false); 
function handleContextMenu(event){ 
    safari.self.tab.setContextMenuEventUserInfo(event,getSelection().toString()); 
} 

Mais cela ne me donne évidemment qu'une chaîne de la sélection. Maintenant, selon la bibliothèque de référence Safari getSelection() renvoie un DOMSelection object. Mais même là, je ne suis pas en mesure de repérer une méthode qui me donne un contrôle sur le lien sélectionné.

Comme vous pouvez le remarquer, je suis assez nouveau dans toute cette substance javascript et DOM, donc s'il vous plaît excuse si cela est une question évidente :)

Ciao, Sven

+0

Un peu de suivi: Comme je ne suis pas en mesure d'extraire plus d'information contextuelle que la sélection j'ai essayé d'utiliser jQuery pour trouver un lien correspondant au texte sélectionné, comme ceci: '$ (" a: contains ('"+ getSelection() +"') ");' Mais c'est très flou, comme lorsqu'on clique sur le mot 'a' il y a un probab Un texte de lien peut contenir ce mot. – sschober

Répondre

3

Sur simple droite cliquez, la sélection sera définie à l'intérieur le lien d'ancrage. Cela signifie que votre noeud de texte sera sélectionné, mais le noeud de lien lui-même ne le sera pas. Par conséquent, il est inutile d'essayer de trouver un lien dans une sélection.

Vous pouvez utiliser le focusNode de DOMSelection pour obtenir le dernier nœud de texte sélectionné et vérifier ses ancêtres jusqu'à ce que vous obteniez un élément <a>. Cela devrait faire ce que vous voulez.

var link = null; 
var currentElement = event.getSelection().focusNode; 
while (currentElement != null) 
{ 
    if (currentElement.nodeType == Node.ELEMENT_NODE && currentElement.nodeName.toLowerCase() == 'a') 
    { 
     link = currentElement; 
     break; 
    } 
    currentElement = currentElement.parentNode; 
} 
// link is now an <a> element if the user selected a link's contents 
0

réponse de zneak ne fonctionnait pas pour moi, donc je travaille avec event.target au lieu de la sélection:

var link = evt.target; 
// get parent node in case of text nodes (old safari versions) 
if(link.nodeType == Node.TEXT_NODE) { 
    link = link.parentNode; 
} 
    // if for some reason, it's not an element node, abort 
if(link.nodeType != Node.ELEMENT_NODE) { 
    return; 
} 

// try to get a link element in the parent chain 
while(link != null && 
     currentElement.nodeType == Node.ELEMENT_NODE && 
     link.nodeName.toLowerCase() != "a") { 
    link = link.parentNode; 
} 
if(link) { 
    // do stuff 
}