de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 brandonhilkert
brandonhilkert
Question

Ekstensi Chrome - Mendapatkan konten DOM

I'm mencoba untuk mengakses activeTab DOM konten dari popup. Berikut ini saya menyatakan:

{
  "manifest_version": 2,

  "name": "Test",
  "description": "Test script",
  "version": "0.1",

  "permissions": [
    "activeTab",
    "https://api.domain.com/"
  ],

  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",

  "browser_action": {
    "default_icon": "icon.png",
    "default_title": "Chrome Extension test",
    "default_popup": "index.html"
  }
}

I'm benar-benar bingung apakah latar belakang script (halaman acara dengan ketekunan: palsu) atau content_scripts adalah cara untuk pergi. I've baca semua dokumentasi dan lain SEBAGAINYA posting dan itu masih tidak masuk akal bagi saya.

Seseorang dapat menjelaskan mengapa saya bisa menggunakan salah satu dari yang lain.

Berikut ini adalah background.js aku've telah mencoba:

chrome.extension.onMessage.addListener(
  function(request, sender, sendResponse) {
    // LOG THE CONTENTS HERE
    console.log(request.content);
  }
);

Dan saya'm hanya pelaksana ini dari popup console:

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendMessage(tab.id, { }, function(response) {
    console.log(response);
  });
});

I'm mendapatkan:

Port: Could not establish connection. Receiving end does not exist. 

UPDATE:

{
  "manifest_version": 2,

  "name": "test",
  "description": "test",
  "version": "0.1",

  "permissions": [
    "tabs",
    "activeTab",
    "https://api.domain.com/"
  ],

  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["content.js"]
    }
  ],

  "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",

  "browser_action": {
    "default_icon": "icon.png",
    "default_title": "Test",
    "default_popup": "index.html"
  }
}

content.js

chrome.extension.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.text && (request.text == "getDOM")) {
      sendResponse({ dom: document.body.innertHTML });
    }
  }
);

popup.html

chrome.tabs.getSelected(null, function(tab) {
  chrome.tabs.sendMessage(tab.id, { action: "getDOM" }, function(response) {
    console.log(response);
  });
});

Ketika saya berjalan, saya masih mendapatkan kesalahan yang sama:

undefined
Port: Could not establish connection. Receiving end does not exist. lastError:30
undefined
95 2013-11-03T20:57:05+00:00 3
 brandonhilkert
brandonhilkert
Pertanyaan edit 4 November 2013 в 1:12
Pemrograman
javascript
google-chrome-extension
Solution / Answer
 gkalpak
gkalpak
3 November 2013 в 10:10
2013-11-03T22:10:30+00:00
Lebih
Sumber
Sunting
#22702916

Syarat "latar belakang halaman", "popup", "content script" yang masih membingungkan anda, saya sangat menyarankan lebih mendalam terlihat di Google Chrome Ekstensi Dokumentasi.

Mengenai pertanyaan anda jika konten script atau latar belakang halaman adalah cara untuk pergi:

Isi script: Pasti Isi script ini adalah satu-satunya komponen ekstensi yang memiliki akses ke web-halaman's DOM.

Latar belakang halaman / Popup: Mungkin (mungkin max. 1 dari dua) Anda mungkin perlu untuk memiliki konten script lulus DOM konten ke salah satu latar belakang halaman atau popup untuk diproses lebih lanjut.


Saya ulangi bahwa saya sangat menyarankan untuk lebih berhati-hati studi dokumentasi yang tersedia! Yang mengatakan, di sini adalah contoh ekstensi yang mengambil DOM konten di StackOverflow halaman dan mengirimkannya ke halaman latar belakang, yang pada gilirannya cetakan ini di console:

background.js:

// Regex-pattern to check URLs against. 
// It matches URLs like: http[s]://[...]stackoverflow.com[...]
var urlRegex = /^https?:\/\/(?:[^./?#]+\.)?stackoverflow\.com/;

// A function to use as callback
function doStuffWithDom(domContent) {
    console.log('I received the following DOM content:\n' + domContent);
}

// When the browser-action button is clicked...
chrome.browserAction.onClicked.addListener(function (tab) {
    // ...check the URL of the active tab against our pattern and...
    if (urlRegex.test(tab.url)) {
        // ...if it matches, send a message specifying a callback too
        chrome.tabs.sendMessage(tab.id, {text: 'report_back'}, doStuffWithDom);
    }
});

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.all[0].outerHTML);
    }
});

manifest.json:

{
  "manifest_version": 2,
  "name": "Test Extension",
  "version": "0.0",
  ...

  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "content_scripts": [{
    "matches": ["*://*.stackoverflow.com/*"],
    "js": ["content.js"]
  }],
  "browser_action": {
    "default_title": "Test Extension"
  },

  "permissions": ["activeTab"]
}
 piperchester
piperchester
Jawaban edit 22 Desember 2016 в 4:28
151
0
 Oskar
Oskar
1 Desember 2016 в 9:13
2016-12-01T09:13:02+00:00
Lebih
Sumber
Sunting
#22702917

Anda don't harus menggunakan message passing untuk mendapatkan atau mengubah DOM. Saya menggunakan `chrome.tab.executeScript'instead. Dalam contoh saya, saya hanya menggunakan activeTab izin, oleh karena itu script dijalankan hanya pada tab yang aktif.

bagian dari terwujud.json

"browser_action": {
    "default_title": "Test",
    "default_popup": "index.html"
},
"permissions": [
    "activeTab",
    "<all_urls>"
]

index.html

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <button id="test">TEST!</button>
    <script src="test.js"></script>
  </body>
</html>

test.js

document.getElementById("test").addEventListener('click', () => {
    console.log("Popup DOM fully loaded and parsed");

    function modifyDOM() {
        //You can play with your DOM here or check URL against your regex
        console.log('Tab script:');
        console.log(document.body);
        return document.body.innerHTML;
    }

    //We have permission to access the activeTab, so we can call chrome.tabs.executeScript:
    chrome.tabs.executeScript({
        code: '(' + modifyDOM + ')();' //argument here is a string but function.toString() returns function's code
    }, (results) => {
        //Here we have just the innerHTML and not DOM structure
        console.log('Popup script:')
        console.log(results[0]);
    });
});
56
0
 bxN5
bxN5
7 April 2019 в 1:34
2019-04-07T01:34:39+00:00
Lebih
Sumber
Sunting
#22702918

Bagi mereka yang mencoba gkalpak jawaban dan itu tidak bekerja,

diketahui bahwa chrome akan menambahkan isi script untuk halaman diperlukan hanya jika anda mengaktifkan ekstensi pada chrome peluncuran dan juga ide yang baik restart browser setelah membuat perubahan ini

3
0
Related communities 2
JavaScript Indonesia
JavaScript Indonesia
14 533 pengguna
Grup JavaScript yang membahas JavaScript, framework JS, dan Node JS secara universal. Cek Pinned Message untuk keterangan lebih lanjut. Komunitas ReactJS: https://t.me/react_idn
Buka telegram
Ruang Belajar Google Ads
Ruang Belajar Google Ads
517 pengguna
Buka telegram
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 1 hari yang lalu
2
Akshit Mehta
Terdaftar 4 hari yang lalu
3
me you
Terdaftar 1 minggu yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi