Bir Firefox uzantısındaki arka plan komut dosyasından içerik komut dosyalarının işlevini çağırmanın en iyi yolu nedir?

0

Soru

Bir uzantının içerik komut dosyasında uygulanan, seçilen metni web sayfalarından, daha sonra bir menü öğesine bağlı bir dinleyicide çağrılacak olan arka plan komut dosyasındaki bir işlevden alan bir işlevi çağırmak istiyorum.

Bu mümkün mü ve bunu yapmanın en kısa yolu ne olurdu?

İşte ilgili kod parçacıkları:

manifesto.jsonname

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

içerik.js

var text = "";
    
function highlightedText() {
  text = content.getSelection();
}

arka plân.js

function listenerFunction() {

    highlightedText();
    
    /* Doing various stuff that have to use the text variable */
  }
  
    browser.menus.onClicked.addListener((info, tab) => {
    highlightedText();
  });

Açıkçası, yukarıdaki kod çalışmıyor, çünkü "vurgulanan" işlev artık arka plan komut dosyasından görülebilir.

Peki, kodun çalışmasını sağlamanın en hızlı / en kısa yolu nedir?

1

En iyi cevabı

1

tamam. Bunu kendi özel uzantılarımdan birinden almak zorundayım ama özü şu:

Arka plan komut dosyasında menüyü ayarlayın ve onclick prop'a bir işlev atayın:

browser.menus.create({
  id: 'images',
  title: 'imageDownload',
  contexts: ['all'],
  onclick: downloadImages
}, onCreated);

Yine de aynı komut dosyasında geçerli sekme bilgilerini alın ve içerik komut dosyasına bir mesaj gönderin.

function getCurrentTab() {
  return browser.tabs.query({ currentWindow: true, active: true });
}

async function downloadImages() {
  const tabInfo = await getCurrentTab();
  const [{ id: tabId }] = tabInfo;
  browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' });
}

İçerik komut dosyası iletiyi dinler:

browser.runtime.onMessage.addListener(({ trigger }) => {
  if (trigger === 'downloadImages') doSomething();
});

Ve işlem tamamlandıktan sonra arka plan komut dosyasına yeni bir mesaj iletin.

function doSomething() {
  const data = [1, 2, 3];
  browser.runtime.sendMessage({ trigger: 'downloadImages', data });
}

Ve ayrı bir arka plan komut dosyasında aşağıdaki gibi bir şey var:

browser.runtime.onMessage.addListener(function (data) {
  const { trigger } = data;
  if (trigger === 'downloadImages') ...
});
2021-10-29 12:40:02

Sekmeleri yapar.getCurrent() kodunuzdaki arka plan komut dosyasında mı çalışıyor? Yakalanmamış (söz) bir TypeError alıyorum: tabInfo tanımlanmamış bir hatadır. Sekmelerde okudum.getCurrent () belgeleri: Not: Bu işlev yalnızca seçenekler sayfası gibi bir tarayıcı sekmesinin bulunduğu bağlamlarda kullanışlıdır. Bir arka plan komut dosyasından veya bir açılır pencereden çağırırsanız, geri döner undefined.
Costas

Kodum sadece nasıl çalışması gerektiğine dair bir örnektir ve bu benim arka plan komut dosyamla çalışır. Hangi verilerden alıyorsunuz tabs.getCurrent()?
Andy

@Costas Eksik olan kodumun bir kısmını ekledim ( getCurrentTab işlev). Umarım bu yardımcı olur.
Andy

I was getting undefined belli ki, çünkü tabs.getCurrent() oldu dönen undefined. Kodunuz hatayı düzeltti. Şimdi bir tane alıyorum. Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist kodun bu satırından: browser.tabs.sendMessage(tabId, { trigger: 'downloadImages' }); Bu kod var : browser.runtime.onMessage.addListener(({ trigger }) => { if (trigger === 'downloadImages') doSomething(); }); içerik komut dosyasında, ancak açıkça arka plan komut dosyasından görülmüyor.
Costas

Sen örnek istedin, ben verdim. İstediğiniz mesajlaşmanın temellerini gösterir. Bu kod gereksinimlerinize özel olarak uymayabilir-yalnızca kodunuza uyması için biraz geçici çözüm bulmanız gerekir. Sadece kodu bu cevaptan kaldırmayın ve çalışmasını beklemeyin. Kodu gereksinimlerinize uyacak şekilde uyarlayabileceğinizi düşünün.
Andy

Ben sadece vardı bir göz at uzantısı daha bir kaç dakika önce... Hata ayıklayıcıda, Devtools'ta yalnızca arka plan komut dosyasının yüklendiğini görüyorum! Demek sorun bu. İçerik komut dosyası hiç yüklenmiyor. Yine de nedenini anlamıyorum, çünkü herhangi bir sorun görmüyorum. manifest.json dosya.
Costas

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................