instalar - javascript definicion
Extensión de Chrome que agrega javascript externo al html de la página actual (3)
Leí este hilo: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-extensions/yc-ouDqfMw0 y encontré que hay un método oficial de Chrome para agregar el script de análisis al página, y no está en los documentos oficiales.
Puede consultar esta extensión para referencia: https://github.com/GoogleChrome/chrome-app-samples/tree/master/analytics y usa esta lib: https://github.com/GoogleChrome/chrome-platform-analytics
básicamente, incluye manualmente el script localmente:
<script src="your_path/google-analytics-bundle.js"></script>
<script src="main.js"></script>
luego llamas a algunas funciones de la biblioteca:
var service, tracker, out;
function initAnalyticsConfig(config) {
document.getElementById(''settings-loading'').hidden = true;
document.getElementById(''settings-loaded'').hidden = false;
var checkbox = document.getElementById(''analytics'');
checkbox.checked = config.isTrackingPermitted();
checkbox.onchange = function() {
config.setTrackingPermitted(checkbox.checked);
};
}
nota: al parecer, debe tener una función de exclusión https://github.com/GoogleChrome/chrome-platform-analytics/wiki#add-privacy-support-aka-opt-out
function startApp() {
// Initialize the Analytics service object with the name of your app.
service = analytics.getService(''ice_cream_app'');
service.getConfig().addCallback(initAnalyticsConfig);
// Get a Tracker using your Google Analytics app Tracking ID.
tracker = service.getTracker(''UA-XXXXX-X'');
// Record an "appView" each time the user launches your app or goes to a new
// screen within the app.
tracker.sendAppView(''MainView'');
}
window.onload = startApp;
Estoy agregando JavaScript externo al final de la página a través de mi extensión de Chrome. El JavaScript externo luego intenta publicar algunos datos en el servidor, sin embargo, eso no está ocurriendo.
El JavaScript desea obtener la URL de la página actual y la referencia y publicarla en el servidor.
¿Puede alguien por favor avisarme qué está mal aquí y cómo puedo si no fuera posible de esta manera puedo publicar datos de la página actual en el servidor?
manifest.json
{
"name": "Website Safety",
"version": "1.0",
"manifest_version": 2,
"description": "The Website Safety Extension.",
"browser_action": {
"name": "View the website information for ",
"default_icon": "icon.png",
"default_popup": "popup.html"
},
"permissions": [
"tabs", "http://*/*", "https://*/*"
],
"background": {
// "scripts": ["refresh.js"]
"page": "background.html"
},
"content_security_policy": "script-src ''self'' https://ssl.google-analytics.com; object-src ''self''",
//"background_page": "background.html"
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["contentScript.js"]
}
]
}
por ahora contentScript.js
var _gaq = _gaq || [];
_gaq.push([''_setAccount'', ''UA-31046309-1'']);
_gaq.push([''_setAllowLinker'', true]);
_gaq.push([''_trackPageview'']);
(function() {
var ga = document.createElement(''script''); ga.type = ''text/javascript''; ga.async = true;
ga.src = (''https:'' == document.location.protocol ? ''https://ssl'' : ''http://www'') + ''.google-analytics.com/ga.js'';
//ga.src = ''https://ssl.google-analytics.com/ga.js'';
var s = document.getElementsByTagName(''script'')[0]; s.parentNode.insertBefore(ga, s);
})();
var _Hasync= _Hasync|| [];
_Hasync.push([''Histats.start'', ''1,1342541,4,0,0,0,00000000'']);
_Hasync.push([''Histats.fasi'', ''1'']);
_Hasync.push([''Histats.track_hits'', '''']);
(function() {
var hs = document.createElement(''script''); hs.type = ''text/javascript''; hs.async = true;
hs.src = (''http://s10.histats.com/js15_as.js'');
(document.getElementsByTagName(''head'')[0] || document.getElementsByTagName(''body'')[0]).appendChild(hs);
})();
Los scripts de contenido no se ejecutan en el alcance de la página ( ver también ), se ejecutan en un contexto entre su extensión y la página web.
Dado que los rastreadores son del tipo "Script inyectado", estos se ejecutan completamente en el contexto de la página web. Pero las variables _gaq
y Hasync
no. Como resultado, las secuencias de comandos de la pista no pueden leer las variables de configuración.
Hay dos (tres) maneras de arreglarlo.
- Inyecte su código (como se publicó en la pregunta) usando este método . No se recomienda usar este método para su propósito, ya que su secuencia de comandos sobrescribe una variable global comúnmente utilizada. La implementación de su secuencia de comandos con este método romperá el seguimiento en muchos sitios web, no lo use .
- Ejecute completamente el código dentro del alcance de un script de contenido:
Dos opciones:- Incluye los archivos externos en la extensión
- Incluya los archivos externos en la extensión, además de implementar una función de actualización automática.
Método 1: copia completamente local
manifest.json
(solo se muestran las partes relevantes):
{
"name": "Website Safety",
"version": "1.0",
"manifest_version": 2,
"description": "The Website Safety Extension.",
"permissions": [
"tabs", "http://*/*", "https://*/*"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["ga-config.js", "ga.js", "js15_as.js"]
}
]
}
En ga-config.js
, defina las variables de la siguiente manera:
var _gaq = _gaq || [];
_gaq.push([''_setAccount'', ''UA-31046309-1'']);
_gaq.push([''_setAllowLinker'', true]);
_gaq.push([''_trackPageview'']);
var _Hasync= _Hasync|| [];
_Hasync.push([''Histats.start'', ''1,1342541,4,0,0,0,00000000'']);
_Hasync.push([''Histats.fasi'', ''1'']);
_Hasync.push([''Histats.track_hits'', '''']);
Descargue https://ssl.google-analytics.com/ga.js y guárdelo como ga.js
Descargue http://s10.histats.com/js15_as.js y guárdelo como js15_as.js
.
Método 2: Inyectar un GA actualizado
Si desea tener una versión actualizada de GA, se debe utilizar una forma complicada de inyectar el código, ya que las secuencias de comandos de contenido no se pueden incluir desde una URL externa .
Una versión anterior de esta respuesta se basó en la página de fondo y chrome.tabs.executeScript
para este propósito, pero desde Chrome 20, se ha disponible un mejor método: use la API chrome.storage
para almacenar en caché el código JavaScript. Para mantener el código actualizado, almacenaré una marca de tiempo "actualizada por última vez" en el almacenamiento; también puedes usar la API chrome.alarms
.
Nota: no olvide incluir una copia local del archivo externo en su extensión, en caso de que el usuario no tenga conexión a Internet, etc. Sin una conexión a Internet, Google Analytics no funcionaría de todos modos.
Script de contenido, activate-ga.js
.
var UPDATE_INTERVAL = 2 * 60 * 60 * 1000; // Update after 2 hour
// Retrieve GA from storage
chrome.storage.local.get({
lastUpdated: 0,
code: ''''
}, function(items) {
if (Date.now() - items.lastUpdated > UPDATE_INTERVAL) {
// Get updated file, and if found, save it.
get(''https://ssl.google-analytics.com/ga.js'', function(code) {
if (!code) return;
chrome.storage.local.set({lastUpdated: Date.now(), code: code});
});
}
if (items.code) // Cached GA is available, use it
execute(items.code);
else // No cached version yet. Load from extension
get(chrome.extension.getURL(''ga.js''), execute);
});
// Typically run within a few milliseconds
function execute(code) {
try { window.eval(code); } catch (e) { console.error(e); }
// Run the rest of your code.
// If your extension depends on GA, initialize it from here.
// ...
}
function get(url, callback) {
var x = new XMLHttpRequest();
x.onload = x.onerror = function() { callback(x.responseText); };
x.open(''GET'', url);
x.send();
}
Archivo de manifiesto mínimo:
{
"name": "Website Safety",
"version": "1.0",
"manifest_version": 2,
"permissions": [
"tabs", "http://*/*", "https://*/*"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["activate-ga.js"]
}
],
"web_accessible_resources": ["ga.js"]
}
El mismo método se puede usar para otros rastreadores. Los requisitos mínimos de permiso:
-
https://ssl.google-analytics.com/ga.js
, por lo que debería agregarse en la sección de permisos.https://*/*
o<all_urls>
también es suficiente. - opcional :
unlimitedStorage
: si desea almacenar una gran cantidad de datos conchrome.storage
.
Actualización 2015
El nuevo fragmento de Universal Analytics definitivamente puede manejar múltiples rastreadores , por lo que, suponiendo que le dé un nombre único y ejecute todos los códigos de Analytics en el contexto de la página , debería estar listo.
// add Universal Analytics to the page (could be made conditional)
runFunctionInPageContext(function () {
(function(i,s,o,g,r,a,m){i[''GoogleAnalyticsObject'']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o);
a.async=1;a.src=g;document.documentElement.appendChild(a)
})(window,document,''script'',''//www.google-analytics.com/analytics.js'',''ga'');
});
// all Google Analytics calls should use our tracker name
// and be run inside the page''s context
runFunctionInPageContext(function () {
ga(''create'', ''UA-12345-6'', ''auto'', {''name'': ''myTracker''});
ga(''myTracker.send'', ''pageview''); // note the prefix
});
// simple helper function
function runFunctionInPageContext(fn) {
var script = document.createElement(''script'');
script.textContent = ''('' + fn.toString() + ''());'';
document.documentElement.appendChild(script);
document.documentElement.removeChild(script);
}
Tenga en cuenta que hay una pequeña modificación en el fragmento de análisis para usar document.documentElement
lugar del primer elemento <script>
. Esto se debe a que Google supone que agrega análisis en un bloque de script en línea, mientras que aquí lo agrega desde un script de contenido.