I'm working on a Google Chrome extension that takes all the paragraphs (p tag content) and places each words in them up into a button. It's a part of a larger program I'm working on. I have a working copy of that part of the app on JSFiddle.
Now, I'm trying to port that code into a Chrome Extension. But, I'm having trouble accessing the DOM from my background script, so that I can manipulate it with my code (in my function FormatText()
). I haven't even called the function yet, because I can't figure out how I'm supposed to edit the DOM in the first place within 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's 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 pardon my ignorance as I am very new to working with the DOM in general, especially in a Chrome extension.