2015-04-27 2 views
1

manifest.jsonQuand popup.js est-il lancé?

{ 
"manifest_version": 2, 

"name": "YouTellMe", 
"description":"FIND AND COMPARE OVER 10.000.000 PRODUCTS AND GET THE BEST PRICES FROM ALL MAJOR INDIAN WEBSHOPS. GET DISCOUNTS TO HAVE THE CHEAPEST PRICE!", 
"version":"0.0", 

"browser_action": 
{ 
    "default_icon":"logoytm.png", 
    "default_popup": "offers.html", 
    "badge" : "YTM" 
}, 

"background" : 
{ 
    "scripts" : ["find_offers.js"], 
    "persistent" : false 
}, 

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

"permissions": 
[ 
    "tabs", 
    "activeTab", 
    "webNavigation", 
    "notifications", 
    "https://ajax.googleapis.com/", 
    "http://localhost/*", 
]} 

find_offers.js

if(! window.jQuery) 
 
{ 
 
\t console.log("importing jquery...") 
 
\t script = document.createElement('script'); 
 
\t script.source = 'http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js'; 
 
\t document.getElementsByTagName("head")[0].appendChild(script) 
 
} 
 

 
chrome.tabs.onUpdated.addListener(tab_activated); 
 
chrome.webNavigation.onCompleted.addListener(load_iframe); 
 

 
var tablink; 
 

 
function tab_activated() 
 
{ 
 
\t chrome.tabs.query({'active': true, 'windowId': chrome.windows.WINDOW_ID_CURRENT}, 
 
     function(tabs) 
 
     { 
 
\t \t \t tablink = tabs[0].url; 
 
     }); 
 
} 
 

 
function load_iframe() 
 
{ 
 
\t console.log("in load iframe"); 
 
\t ytm_product_url = "http://localhost/bookmarklet/product/"; 
 
    console.log("current URL " + tablink); 
 
    if(tablink != undefined) 
 
    { 
 
    \t var uri = ytm_product_url+"?retailer_url="+tablink; 
 
    } 
 
    else 
 
\t { 
 
    \t var uri = ytm_product_url+"?retailer_url="+document.location.href; 
 
\t } 
 
    chrome.extension.sendMessage({url:uri}); 
 
}

offers.html

<html> 
 
<head> 
 
<title></title> 
 
</head> 
 
<link rel="stylesheet" type="text/x-scss" href="bookmark_offers.css" /> 
 
<script src='jquery.min.js'></script> 
 
<script src='load_offers.js'> </script> 
 
<body> 
 
<div id="YTM_offers"> </div> 
 
</body> 
 
</html>

load_offers.js

chrome.runtime.onMessage.addListener 
 
(
 
\t function (request) 
 
    { 
 
\t \t alert("message received"); 
 
     $.ajax 
 
     (
 
      { 
 
       url : request.url, 
 
      } 
 
     ) 
 
     .done 
 
     (
 
      function(data) 
 
      { 
 
      \t notifyUser(); 
 
       console.log($("#YTM_offers")[0]); 
 
//    document.getElementById('YTM_offers').innerHTML += data; 
 
       $("#YTM_offers").html(data); 
 
       console.log($("#YTM_offers")); 
 
      } 
 
     ) 
 
    } 
 
) 
 

 

 
function notifyUser() 
 
{ 
 
\t console.log("notification...") 
 
\t if (! Notification) 
 
\t { 
 
\t \t alert('Notifications are supported in modern versions of Chrome, Firefox, Opera and Firefox.'); 
 
\t  return; 
 
\t } 
 
\t 
 
\t if(Notification.permission !== "granted") 
 
\t \t Notification.requestPermission(); 
 
\t 
 
\t var notification = new Notification("YouTellMe", 
 
\t \t \t { icon : 'logoytm.png', 
 
\t \t \t \t body : "We've got more offers for you." + 
 
\t \t \t \t \t \t "\nClick on extension Icon for more details." 
 
\t \t \t }); 
 
}

maintenant l'énoncé du problème. J'envoie l'URL de la page en cours de find_offers.js à load_offers.js puis load_offers.js tire les offres connexes du serveur, qui est peuplé dans div appelé YTM_offers. J'écoute le message (url) de find_offers.js mais ici envoyer une partie fonctionne parfaitement, mais la réception de la partie ne fonctionne pas jusqu'à ce que j'inspecte popup.html et recharger la page actuelle.

Qu'est-ce que je fais mal? Aide appréciée.Merci

Répondre

2

Vous avez tort de supposer que la fenêtre contextuelle écoute les messages pendant leur fermeture.

En fait, le document HTML qui contient load_offers.js est complètement déchargé lorsque la fenêtre contextuelle est fermée et est à nouveau chargé à partir de zéro à chaque fois. Par conséquent, l'envoi d'un message à un popup est généralement une mauvaise idée, à moins que le popup ne soit demandé en premier.

Vous devez modifier votre logique; soit seulement interroger des informations lorsque la fenêtre s'ouvre, à partir de lui, ou stocker les informations de sorte que le popup puisse le demander lorsqu'il est ouvert. Ce dernier peut être difficile puisque vous avez déclaré votre fond comme persistent: false (chrome.storage est une option, cependant). En regardant votre logique actuelle, il semble improbable que la page en cours change pendant que la fenêtre est ouverte; par conséquent, vous devez simplement interroger des informations sur l'onglet en cours lorsque vous ouvrez la fenêtre contextuelle, et vous n'avez pas vraiment besoin du script d'arrière-plan dans son format actuel.

+0

Merci pour la réponse. oui vous écrivez, je me rends compte qu'après avoir lu l'en-tête de la question. alors maintenant je veux tirer des données du serveur en arrière-plan js, et informer l'utilisateur que les données sont prêtes, cliquez sur l'icône pour les données, comme popup ne peut pas être ouvert de façon pragmatique. –

+0

Donc. Fais le! Tirez les données, s'il y a des informations intéressantes pour l'utilisateur - utilisez 'browserAction.setBadgeText' ou changez l'icône pour indiquer que vous avez des informations à afficher, et stockez ces informations dans' chrome.storage'. Dans la popup, tirez les données de 'chrome.storage' quand il s'ouvre. – Xan

+0

Merci pour l'idée (chrome.storage) –