I am working on a Google Chrome extension that accepts all paragraphs (the contents of the p tag) and puts each word in them in one button. This is part of a larger program I'm working on. I have a working copy of this part of the application on JSFiddle .
Now I am trying to port this code to the Chrome extension. But I am having trouble accessing the DOM from my background script, so that I can manipulate it with my code (in my FormatText() function). I haven't named the function yet because I can't figure out how I should edit the DOM in the first place in background.js.
Here is my code:
manifest.json
{ "manifest_version": 2, "name": "Test Extension", "version": "1", "background": { "persistent": false, "scripts": ["background.js","jquery-3.0.0.min.js","TextSplitter.js"] }, "content_scripts": [{ "matches": ["<all_urls>"], "js": ["content.js"] }], "browser_action": { "default_title": "Test Extension" }, "permissions": ["activeTab","tabs"] }
content.js
// Listen for messages chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) { // If the received message has the expected format... if (msg.text === 'report_back') { // Call the specified callback, passing // the web-page DOM content as argument sendResponse(document); } });
background.js
// A function to use as callback function doStuffWithDom(domContent) { console.log('I received the following DOM content:\n'); console.log(JSON.stringify(domContent)); var domAccess = $(domContent); var myText = $(domAccess).find("p").text(); console.log("THIS IS MY TEXT: " + myText); } chrome.tabs.onUpdated.addListener(function (tabID, info, tab) { console.log("Status: " + info.status); if (info.status == "complete") { chrome.tabs.sendMessage(tab.id, { text: 'report_back' }, doStuffWithDom); } });
TextSplitter.js
function FormatText(domObject) { var pElements = []; // Holds the split paragraphs for each p tag var pElementIndex = 0; //Loop through each p tag in web page $("p").each(function (webPElementIndex, webPElement) { var jQObjWebPElement = $(webPElement);// Convert p element to jQuery Obj // split current paragraph element text into an array of seperate words pElements[webPElementIndex] = jQObjWebPElement.text().split(" "); }); //Clear text out of all p elements $("p").empty(); //Loop through p elements in the webpage to add back text with spans around each word $("p").each(function (webPElementIndex, webPElement) { // convert current web page element to jQuery Obj var jQObjWebPElement = $(webPElement); // Loop through each word stored in each stored paragraph element $.each(pElements[pElementIndex], function (pElementWordIndex, pElementWord) { var jQObjPElementWord = $(pElementWord); // convert element to jQuery object jQObjWebPElement.append($("<button>") .text(pElements[pElementIndex][pElementWordIndex])); }); pElementIndex = pElementIndex + 1; }); }
Please forgive my ignorance, as I am very new to working with the DOM in general, especially in the Chrome extension.