2011-01-23 2 views
0

사용자의 북마크에 대한 컨텍스트 메뉴를 만들 JavaScript 스크립트를 만들려고합니다. Chrome 확장 갤러리에서 사용할 수있는 다양한 확장 프로그램 코드를 살펴 봤지만 모두 매우 복잡하며 어느 정도까지는 결함이 있습니다 (대부분 특정 하위 폴더를보고 멈추게됩니다). 난 가능한 모든 항목 (비록 그들이 매우 깊은 폴더 계층 구조 안에 묻혀있다)에 대한 작동합니다 간단한 스크립트를 만들려고 해요.Google 크롬 확장 프로그램에서 북마크 목록을 만들기위한 JavaScript 스크립트를 만드는 데 발생하는 문제

다음 스크립트가 작동하지 않지만, 내가 생각 가능한 솔루션을 보여줍니다 나는 모든 항목들이 Id 값이있는 경우 (OBJECT_NUMBER) 스크립트에서 변수로 설정하는 것이 생각

bookmarkObject = ITEM_FROM_ARRAY_OF_ALL_BOOKMARK_OBJECTS; 
var OBJECT_NUMBER = chrome.contextMenus.create({ 
    "contexts": ["all"], 
    "onclick": function() { 
     return function() { 
      if (bookmarkObject.url) { 
       chrome.tabs.create({ 
        "url": bookmarkObject.url 
       }); 
      } 
      else { 
       return null; 
      }; 
     }; 
    }(bookmarkObject), 
    "parentId": bookmarkObject.parentId, 
    "title": bookmarkObject.title, 
    "type": "normal" 
}); 

을의 스크립트는 해당 변수를 가능한 모든 하위 항목에 대해 bookmark.parentId 값으로 자동으로 사용해야하며 자동으로 적절한 방식으로 트리를 중첩합니다. (이것은 단지 추측이며 잘못 되었다면 알려주세요.)

그러나 모든 북마크 객체의 배열을 가져 오는 방법을 찾지 못합니다. 북마크 객체의 배열 만 검색 할 수 있습니다. 특정 폴더에 있음). 또한 검색된 모든 항목에 대해 게시 한 코드를 동적으로 실행하는 방법을 배제하여 OBJECT_NUMBER를 관련 개체의 Id 값으로 자동 설정합니다.

누구에게 도움을 줄 수 있습니까?

편집 : 나는 모하메드 만수르의 데모 스크립트에 따라 변화의 좋은 번호를 만들고, 다음 스크립트 왔어요 : 정도에

window.addEventListener("load", function() { 
    init(); 
}, false); 

function init() { 
    chrome.bookmarks.getTree(function(children) { 
     addBookmarks(children); 
    }); 
}; 

function addBookmarks(bookmarks, parent) { 
    bookmarks.forEach(function(bookmarkObject) { 
     var bookmarkObject = chrome.contextMenus.create({ 
      "contexts": ["all"], 
      "onclick": function() { 
       return function() { 
        if (bookmarkObject.url && bookmarkObject.url.length) { 
         chrome.tabs.create({ 
          "url": bookmarkObject.url 
         }); 
        }; 
       }; 
      }(bookmarkObject), 
      "parentId": parent, 
      "title": function() { 
       if (bookmarkObject.url && bookmarkObject.url.length) { 
        return bookmarkObject.title; 
       } 
       else { 
        return chrome.i18n.getMessage("contextmenu_label"); 
       }; 
      }(bookmarkObject), 
      "type": "normal" 
     }); 
     if (bookmarkObject.children) { 
      addBookmarks(bookmarkObject.children, bookmarkObject); 
     }; 
    }); 
}; 

를, 그것으로, 작동하는 것 같군 JavaScript 콘솔에서 오류를 반환하지 않습니다. 그러나 루트 요소가 컨텍스트 메뉴 (이름은 chrome.i18n.getMessage("contextmenu_label") 명령으로 검색 됨)로 나타나지만 하위 요소는 중첩되지 않으며 전혀 표시되지 않습니다. 아무도 내가 잘못했는지 판단하는 데 도움이 될 수 있습니까?

답변

0

북마크 API getTree를 보셨습니까? http://code.google.com/chrome/extensions/bookmarks.html#method-getTree

전체 계층 구조에서 모든 책갈피를 가져올 수 있습니다.

chrome.bookmarks.getTree(function(children) { 

}); 

그런 다음 각 노드에 책갈피 목록이 있으므로 그 결과를 구문 분석해야합니다. 재귀 적으로 그렇게 할 수 있습니다 (원하는 경우 반복 할 수도 있음). 나는 모든 북마크를 얻을 팝업에 그들을 표시 방법은 다음과

이다 (I 사용자를 돕기 위해 사용하는 내 내부 예제 라이브러리에서 가져온) :

var prefix = 'bookmark_'; 

function addBookmark(bookmark, parent) { 
    var child = document.createElement('li'); 
    child.className = 'bookmark'; 
    child.id = prefix + bookmark.id; 
    if (bookmark.url && bookmark.url.length) { 
    var link = document.createElement('a'); 
    link.href = bookmark.url; 
    link.innerHTML = bookmark.title; 
    link.className = 'bookmark_title'; 
    link.onclick = function() { 
     chrome.tabs.create({url: bookmark.url}); 
     return false; 
    }; 

    child.appendChild(link); 
    } else { 
    var title = document.createElement('div'); 
    title.innerHTML = bookmark.title; 
    title.className = 'bookmark_title'; 
    child.appendChild(title); 
    } 
    parent.appendChild(child); 
} 

function addBookmarks(bookmarks, parent) { 
    var list = document.createElement('ul'); 
    parent.appendChild(list); 
    bookmarks.forEach(function(bookmark) { 
    addBookmark(bookmark, list); 
    if (bookmark.children) 
     addBookmarks(bookmark.children, list); 
    }); 
} 

function loadBookmarks() { 
    var container = document.getElementById('container'); 
    var rootElement = document.createElement('div'); 

    var rootId = 0; 
    rootElement.id = prefix + rootId; 

    container.appendChild(rootElement); 
    chrome.bookmarks.getTree(function(children) { 
    console.log(children); 
    addBookmarks(children, rootElement); 
    }); 
} 

당신은 당신의 상황에 맞는 메뉴의 요구를 해결하기 위해 그것을 수정할 수 있습니다 .

+0

고마워요! 나는 당신의 것을 바탕으로 한 스크립트를 만들어서 질문에 다시 게시했습니다. 질문에 언급 된 것처럼 몇 가지 문제가 더 있습니다. –

+0

부모 ID는 어떻게 받습니까? 본보기로 부모 ID가 어떻게되는지보세요. Stackoverflow에서 다른 사람에게 당신의 질문을 크게 업데이트하지 않으면, 다른 사람들이 그것을 배우고 싶다면 너무 혼란스러워 할 것입니다. 더 많은 질문을 원한다면 새로운 질문을 만드는 것이 가장 좋습니다. –

관련 문제