2010-06-20 3 views
2

사용자가 링크를 클릭 할 때 맛있는 북마크를 만드는 사파리 확장 프로그램 (주로 학습 목적)을 빌드하려고합니다. WWDC 사파리 확장 비디오 만들기를 지켜 봤는데 모든 것이 잘 작동합니다.Safari 확장 프로그램에서 contextmenu 이벤트에 대한 링크를 확인하십시오.

사용자가 링크 (또는 일부 텍스트)를 클릭했는지 알아내는 방법을 찾지 못했다면 URL과 제목을 얻으십시오. 내가 지금까지 가지고있는 것은 이것이다 :

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

그러나 이것은 분명히 나에게 선택의 문자열을 준다. 이제 Safari Reference Library getSelection()에 따르면 DOMSelection object을 반환합니다. 그러나 거기에서도 선택된 링크에 대한 핸들을 제공하는 메서드를 발견 할 수 없습니다. 당신은 알 수 있듯이

, 난이 명백한 질문 :

챠오, 간단한 오른쪽에 스벤

+0

약간의 후속 : 을 내가 더 이상 상황에 맞는 정보를 추출 할 수 아니에요으로 선택보다 내가 선택한 텍스트와 일치하는 모든 링크를 찾기 위해 jQuery를 사용하려고 시도했다. '$ ("a : contains"(""+ getSelection() + ")") ", 이것은 매우 퍼지, 단어 'a'를 클릭 할 때 매우 높은 가능성이 있음 링크 텍스트에 해당 단어가 포함될 수 있습니다. – sschober

답변

3

인 경우 그렇게 용서하십시오,이 모든 자바 스크립트와 DOM 물건에 비교적 새로운 해요 클릭하면 선택이 안에 설정되고 앵커 링크가 표시됩니다. 즉, 텍스트 노드를 선택하게되지만 링크 노드 자체는 선택되지 않습니다. 따라서 선택 영역 안에 링크를 찾으려고하면 유용하지 않습니다.

DOMSelectionfocusNode을 사용하면 마지막으로 선택된 텍스트 노드를 가져 와서 <a> 요소까지 감아 올릴 때까지 해당 조상을 검사 할 수 있습니다. 그것은 당신이 원하는 것에 대해해야합니다.

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

zneak의 대답은 나를 위해 작동하지 않았다, 그래서 대신 선택 event.target와 함께 일 :

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 
} 
관련 문제