2011-01-23 8 views
0

私は、ユーザーのブックマークのコンテキストメニューを作成するJavaScriptスクリプトを作成しようとしています。私はChrome拡張ギャラリーで利用できるさまざまな拡張機能のコードを見てきましたが、それらはすべて非常に複雑で、ある程度までは欠陥があります(ほとんどの場合、特定の数のサブフォルダ内を見て停止します)。私はすべての可能な項目(非常に深いフォルダ階層内に埋まっていても)で動作する簡単なスクリプトを作成しようとしています。Google Chrome拡張機能でブックマークのリストを作成する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値に自動的に設定します。

誰でも助けてもらえますか?

EDIT:私はモハメド・マンスールのデモスクリプトごとに変化のかなりの数を作って、次のスクリプト作ってみた:限り

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) { 

}); 

各ノードにブックマークのリストがあるので、その結果を解析する必要があります。あなたは再帰的に行うことができます(必要であれば反復することもできます)。ここで

は、私はすべてのブックマークを取得し、(私は、ユーザーを支援するために使用私の内部の例ライブラリーから取られた)ポップアップ上でそれらを表示する方法である:

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では、あなたの質問を別のものに更新することはそれほど重要ではありません。他の人がそれから学びたいなら、あまりにも混乱させます。より多くの質問が必要な場合は、そのために新しい質問を作成するのが最善です。 –

関連する問題