2011-09-23 93 views
3

是否可以直接從(Safari)工具欄訪問網頁內容?我現在可以從contextmenu訪問它,但不知道我如何獲得相同的功能到工具欄。Safari擴展,直接從工具欄訪問頁面/內容?

這是我得到:

// injected 
document.addEventListener("contextmenu", handleMessage, false); 
function handleMessage(msgEvent) { 
    var sel = ''; 
    sel = window.parent.getSelection()+''; 
    safari.self.tab.setContextMenuEventUserInfo(msgEvent, sel); 
} 

// global 
safari.application .addEventListener("command", performCommand, false); 
function performCommand(event) { 
console.log('performCommand'); 
    if (event.command == "abc") { 
      var query = event.userInfo; 
      console.log(query); 
      alert(query); 
    } 
} 

但我怎麼這樣的內容直接從工具欄?

回答

6

OK,基本上它的工作原理是這樣的:

    全球
  • 的performCommand被調用(通過點擊工具欄上的),分派事件
  • 此事件陷入handleGextText
  • 在handleGextText,你做你需要做的事,然後打電話給safari.self.tab.dispatchMessage這個事件發回全球
  • 在全球你遇到的事件被handleEvent捕獲

>

// Global Script 
safari.application.addEventListener("command", performCommand, false); 
safari.application.addEventListener("message", handleEvent, false); 

// send message 
function performCommand(event) { 
    console.log('command:' + event.command); 

    if (event.command == "abc") { 
     console.log("msg: my message"); 
     safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("msg", "do-something");   
    }  
} 

function handleEvent(event) { 
    var messageName = event.name; 
    console.log("evenname:" + event.name);  
    if (messageName === "did-something") { 

     var msg = event.message; 

     // do something 
    }  
} 


// Injected Script 
if (window.top === window) { // inject only once! 
    console.log("add event listners [injected.js]"); 
    safari.self.addEventListener("message", handleGextText, false); 
} 

function handleGextText(event) { 
    console.log("evenname:" + event.name); 
    console.log("evenmsg :" + event.message); 

    var messageName = event.name; 
    var messageData = event.message; 
    if (messageName === "msg") { 
     if (messageData === "do-something") {   
      console.log('msg received: ' + event.name); 
      var sel = ''; 

      // do what you need to do and dispatch message back to Global 
      console.log("send message to toolbar");    
      safari.self.tab.dispatchMessage("did-something", sel);   
     } 
    } 
} 
1

好的,很好的發現它。我用消息解決了它。

我發送'全局'消息,該消息由注入的腳本捕獲。該函數獲取選定的文本(將其放入userinfo中),並將消息發送回全局。

就是這樣。

+0

任何機會你可以張貼代碼? –