2016-08-23 2 views
1

Google 크롬 확장 프로그램을 작성 중이며 사용자가 부가 기능 아이콘을 클릭하면 현재 페이지에 콘텐츠를 추가하려고합니다.Chrome 확장 프로그램 : 콘텐츠 추가 (아이콘 사용/사용 안함)

확장을 활성화/비활성화하고 모든 페이지에 대해 삽입 된 내용을 표시하거나 숨길 수있는 가능성을 추가하고 싶습니다.

manifest.json을하는

"content_scripts": [ 
    { 
    "matches": [ 
     "http://*/*", 
     "https://*/*" 
    ], 
    "css": ["css/style.css"], 
    "js": [ 
     "js/content.js" 
    ] 
    } 
] 

난 단지 아이콘이 때문에 그와 클릭 한 페이지에 콘텐츠를 추가하는 방법이 표시되지 않습니다, 모든 페이지는 스크립트가 있습니다.

나는 백그라운드 스크립트로 무언가를 시도했지만 성공하지 못했다.

의견이 있으십니까?

감사합니다.

+0

이 아이콘이 페이지에 추가되고, 아니면 당신이 볼 수있는 확장 아이콘을 의미합니까 브라우저 툴바에? – Archer

+0

브라우저 툴바를 생각했습니다. – vermotr

+0

그런 다음 스크립트를 항상 포함해야하지만 버튼을 클릭 할 때 실행하고 싶은 기능 만 호출하면됩니다. 조건부로 무언가를 포함하지 마십시오. 항상 포함 시키십시오. – Archer

답변

1

chrome.tabs.executeScriptchrome.tabs.insertCSS을 사용하여이 작업을 수행해야합니다. 전체 예 :

Background.js

chrome.browserAction.onClicked.addListener(function (tab) { 
    chrome.tabs.insertCSS(tab.id, {file: "content_style.css"}); 
    chrome.tabs.executeScript(tab.id, {file: "content_script.js"}); 
}); 

manifest.json을

{ 
    "name": "Inject js and CSS", 
    "version": "1", 
    "manifest_version": 2, 
    "browser_action": { 
    "default_icon": { 
     "16": "icon16.png", 
     "19": "icon19.png", 
     "32": "icon32.png", 
     "38": "icon38.png" 
    } 
    }, 
    "background": { 
    "scripts": ["background.js"], 
    "persistent": false 
    }, 
    "permissions": [ 
    "activeTab" 
    ] 
} 

편집 : activeTab, 이벤트 페이지와 새로운 아이콘 크기를 사용하도록 업데이트되었습니다.

+0

@wOxxOm 제안에 감사 드리며 답변을 업데이트했습니다. – dan

+0

이 솔루션을 사용하면 사용자가 단추를 클릭 할 때마다 스크립트가 추가됩니다. 따라서 사용자는 여러 번 내용을 주입 할 수 있습니다. -/ – vermotr

+0

@vermotr 예,이 예가 그렇게합니다. 페이지에 삽입하는 콘텐츠 스크립트에서 [메시지 전달] (https://developer.chrome.com/extensions/messaging)을 사용하여 이미 있는지 여부를 감지하고 다시 보내지 않도록 할 수 있습니다. – dan

0

당신은 그것에 대해 어떻게 생각합니까?

manifest.json을

{ 
    "manifest_version": 2, 

    "name": "Extension", 
    "description": "My extension", 
    "version": "0.1", 

    "icons": { 
    "16": "icons/icon_16.png", 
    "48": "icons/icon_48.png", 
    "128": "icons/icon_128.png" 
    }, 

    "browser_action": { 
    "default_title": "Extension", 
    "default_icon": "icons/icon_16_disabled.png" 
    }, 

    "background": { 
    "scripts": ["js/background.js"], 
    "persistent": true 
    }, 

    "permissions": [ 
    "activeTab", 
    "tabs" 
    ] 
} 

background.js

var activedTab = {}; 
var injectedTab = {}; 

chrome.browserAction.onClicked.addListener(function(tab) { 
    if (typeof activedTab[tab.id] === 'undefined') { 
    activedTab[tab.id] = true; 
    chrome.tabs.insertCSS(tab.id, {file: 'style.css'}); 
    chrome.tabs.executeScript(tab.id, {file: 'js/content.js'}); 
    chrome.browserAction.setIcon({path: 'icons/icon_16.png'}); 
    } else if (activedTab[tab.id]) { 
    activedTab[tab.id] = false; 
    chrome.browserAction.setIcon({path: 'icons/icon_16_disabled.png'}); 
    if (injectedTab[tab.id]) { 
     chrome.tabs.sendMessage(tab.id, {greeting: 'hide'}); 
    } 
    } else { 
    activedTab[tab.id] = true; 
    chrome.browserAction.setIcon({path: 'icons/icon_16.png'}); 
    if (injectedTab[tab.id]) { 
     chrome.tabs.sendMessage(tab.id, {greeting: 'show'}); 
    } 
    } 
}); 

chrome.runtime.onMessage.addListener(function(request, sender) { 
    switch (request.greeting) { 
    case 'content_injected': 
     injectedTab[sender.tab.id] = true; 
     if (activedTab[sender.tab.id] == false) { 
     chrome.tabs.sendMessage(sender.tab.id, {greeting: 'hide'}); 
     } 
     break; 
    } 
}); 

chrome.tabs.onUpdated.addListener(function(tabId) { 
    delete activedTab[tabId]; 
    chrome.browserAction.setIcon({path: 'icons/icon_16_disabled.png'}); 
}); 

chrome.tabs.onActiveChanged.addListener(function(tabId) { 
    if (activedTab[tabId]) { 
    chrome.browserAction.setIcon({path: 'icons/icon_16.png'}); 
    } else { 
    chrome.browserAction.setIcon({path: 'icons/icon_16_disabled.png'}); 
    } 
}); 

content.js

console.log('loaded'); 
chrome.extension.sendMessage({greeting: 'content_injected'}); 

chrome.runtime.onMessage.addListener(function(request) { 
    switch (request.greeting) { 
    case 'show': 
     console.log('show'); 
     break; 
    case 'hide': 
     console.log('hide'); 
     break; 
    } 
}); 
0

나는 같은 F를 구축했다 나의 크롬 연장을 위해 성숙해라. (이 :)를 해결하기 위해 구글을 검색 할 때 너무 많은 이름) ​​ 이 나는 ​​다음과 같은 방법으로 응용 프로그램 및 콘텐츠 스크립트의 마사지 사용 를 온/오프 스위치/토글을 생성합니다 :

매니페스트를

모든 페이지 (hover.js)에 내 콘텐츠 스크립트를 삽입하고 내 확장자 스크립트 (background.js)

.... 
"browser_action": { 
    "default_icon": { 
     "19": "icons/icon-active.png" 
    } 
    }, 
"content_scripts": [ 
{ 
    "matches": ["<all_urls>"], 
    "css": ["css/hover.css"], 
    "js": ["js/hover.js"] 
} 
], 
"background" : { "scripts": ["js/background.js"] }, 
.... 

배경을 실행.

  1. : JS 여기

    우리는 당신이 볼 수 있듯이 3 개 기능이있는 배경 (모든 크롬 창에서 실행) 스크립트를 보낼과를 받게되며 확장자 상태

    // start extention as active 
    var status = true; 
    
    // set toggle of extention on browser action click and notify content script 
    chrome.browserAction.onClicked.addListener(function(tabs) { 
        if (status == 'true'){ 
        status = false; 
        chrome.browserAction.setIcon({path: "icons/16x16.png"}); 
        } 
        else{ 
        status = true; 
        chrome.browserAction.setIcon({path: "icons/icon-active.png"}); 
        } 
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
        chrome.tabs.sendMessage(tabs[0].id, {status: status}); 
        }); 
    }); 
    
    // check status on tab update and notify content script 
    chrome.tabs.onActivated.addListener(function() { 
        if (status == 'true'){ 
        chrome.browserAction.setIcon({path: "icons/icon-active.png"}); 
        } 
        else{ 
        chrome.browserAction.setIcon({path: "icons/16x16.png"}); 
        } 
        chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
        chrome.tabs.sendMessage(tabs[0].id, {status: status}); 
        }); 
    }); 
    
    //send extention status on request 
    chrome.runtime.onMessage.addListener(
        function(request, sender, sendResponse) { 
        if (request.status == "getStatus") 
         sendResponse({status: status}); 
    }); 
    

    을 prepering된다 브라우저 동작 버튼 클릭시 상태를 변경하십시오.

  2. 다른 탭으로 이동하여 콘텐츠 스크립트를 알릴 때 상태를 확인하십시오. 각 탭에는 콘텐츠 스크립트의 고유 한 "인스턴스"가 있으므로 하나의 탭에서 비활성화하는 기능은 다른 탭에서 계속 활성화 될 수 있습니다.

  3. 콘텐츠 스크립트에서 요청시 상태에 대한 응답을 보냅니다.

각 컨텐츠 스크립트가 먼저 배경 스크립트에 마사지를 전송하여 확장자의 상태를 확인하고 상태 업데이트를받을해야

// check extention status 
chrome.runtime.sendMessage({status: "getStatus"}, function(response) { 
    if (response.status == 'true'){ 
     // check elements mouse is hover 
     document.addEventListener("mouseover", setLink, true); 
    } 
    else{ 
     document.removeEventListener("mouseover", setLink, true); 
    } 
}); 

// wait for massage from background script 
chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
    if (request.status == 'true'){ 
     // check elements mouse is hover 
     document.addEventListener("mouseover", setLink, true); 
    } 
    else{ 
     document.removeEventListener("mouseover", setLink, true); 
    } 
}); 

콘텐츠 스크립트.

또한 한 탭에서 확장 기능을 해제하면 탭을 변경하면 콘텐츠 스크립트에 변경 사항을 알립니다.

나는이 스크립트의 측면에서 더 나은 수행 할 수 있습니다하지만 난이 도움이되기를 바랍니다 확신 ...

관련 문제