Хотя вы определенно находитесь в правильном направлении (и на самом деле довольно близки к концу), в вашем коде существует несколько (imo) плохих практик (например, для инъекции целой библиотеки (jquery) для такой тривиальной задачи, объявления ненужных разрешений , делая суперплошные вызовы API-методам и т. д.). Я сам не тестировал ваш код, но из краткого обзора считаю, что исправление следующего может привести к рабочему решению (хотя и не очень близкому к оптимальному):
onMessage
. Итак, вот мой предложенный подход:
root-directory/
|_____img
|_____icon19.png
|_____icon38.png
|_____manifest.json
|_____background.js
|_____content.js
|_____popup.js
|_____popup.html
{
"manifest_version": 2,
"name": "Test Extension",
"version": "0.0",
"offline_enabled": true,
"background": {
"persistent": false,
"scripts": ["background.js"]
},
"content_scripts": [{
"matches": ["*://*.stackoverflow.com/*"],
"js": ["content.js"],
"run_at": "document_idle",
"all_frames": false
}],
"page_action": {
"default_title": "Test Extension",
//"default_icon": {
// "19": "img/icon19.png",
// "38": "img/icon38.png"
//},
"default_popup": "popup.html"
}
// No special permissions required...
//"permissions": []
}
chrome.runtime.onMessage.addListener(function (msg, sender) {
// First, validate the message's structure
if ((msg.from === 'content') && (msg.subject === 'showPageAction')) {
// Enable the page-action for the requesting tab
chrome.pageAction.show(sender.tab.id);
}
});
// Inform the background page that
// this tab should have a page-action
chrome.runtime.sendMessage({
from: 'content',
subject: 'showPageAction'
});
// Listen for messages from the popup
chrome.runtime.onMessage.addListener(function (msg, sender, response) {
// First, validate the message's structure
if ((msg.from === 'popup') && (msg.subject === 'DOMInfo')) {
// Collect the necessary data
// (For your specific requirements `document.querySelectorAll(...)`
// should be equivalent to jquery's `$(...)`)
var domInfo = {
total: document.querySelectorAll('*').length,
inputs: document.querySelectorAll('input').length,
buttons: document.querySelectorAll('button').length
};
// Directly respond to the sender (popup),
// through the specified callback */
response(domInfo);
}
});
// Update the relevant fields with the new data
function setDOMInfo(info) {
document.getElementById('total').textContent = info.total;
document.getElementById('inputs').textContent = info.inputs;
document.getElementById('buttons').textContent = info.buttons;
}
// Once the DOM is ready...
window.addEventListener('DOMContentLoaded', function () {
// ...query for the active tab...
chrome.tabs.query({
active: true,
currentWindow: true
}, function (tabs) {
// ...and send a request for the DOM info...
chrome.tabs.sendMessage(
tabs[0].id,
{from: 'popup', subject: 'DOMInfo'},
// ...also specifying a callback to be called
// from the receiving end (content script)
setDOMInfo);
});
});
DOM Info
Total number of elements:
N/A
Number of input elements:
N/A
Number of button elements:
Вы никогда не сбрасываете n
, поэтому, как только вы получите простое число (когда n == (not_prime_numbers.size()-1)
), остальные числа также будут добавлены в основной список.
Почему вы проверяете это условие в цикле? Вам следует установить флаговую переменную, если вы обнаружите, что число не простое, а затем проверьте его после цикла, чтобы, возможно, добавить его в свой список простых чисел.