Comunidad de diseño web y desarrollo en internet online

Código javascript no accesible usando greasemonkey

Citar            
MensajeEscrito el 29 Dic 2007 06:15 pm
Buenas, he buscado por todas partes y no he logrado encontrar solución a este problema.

Se trata de insertar código javascript a una página usando el greasemonkey, lo que sucede es que quiero asignarle una función al evento "onclick" de un botón.

He probado y esto sí funciona, al hacer click sobre el botón me muestra un mensaje que dice "funciona":

var body = document.body.innerHTML;
body = "<center><input type='button' value='enviar' id='benviar' onClick=\"alert('funciona')\"></center>" + body;
document.body.innerHTML = body;

Lo que no funciona es esto, realizar una llamada a una función definida previamente.
function prueba()
{
alert("funciona");
}

var body = document.body.innerHTML;
body = "<center><input type='button' value='enviar' id='benviar' onClick=\"prueba()\"></center>" + body;
document.body.innerHTML = body;

Es como si la función fuera no accesible, porque también he intentando asignarle al evento: alert(variable_definida_previamente) y tampoco funciona.
Si alguien sabe cómo hacer accesibles los datos, sería de gran ayuda.

Muchas gracias de antemano.

Por wakamole

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Dic 2007 04:48 pm

wakamole escribió:

function prueba() {alert("funciona");}
var body = document.body.innerHTML;
body = "<center><input type='button' value='enviar' id='benviar' onClick=\"prueba()\"></center>" + body;
document.body.innerHTML = body;

Desde donde estoy ahora, no tengo instalado el greasemonkey, lo miraré en casa dentro de unos días si no te han ayudado antes.

Lo que sí recuerdo, es de haber tenido el mismo problema (o parecido)
Lo que creo recordar, es que el código que inyectas en la página desde GREASEMONKEY, no reconoce las funciones del propio user.script...
Es decir...
El userscript que ejeecuta el greasemonkey, es una cosa, y la página que lee el navegador, otra.
Así que si tu script, le dice al navegador que sobre la página, inserte un formulario:
"document.body.innerHTML = body"
Le estás diciendo SOLAMENTE ESO. Así que el resultado de todo, será la página inicial, más el "body" que has insertado.
No se si me explico.

Si quieres inyectar también variables y funciones en la página... desde greasemonkey, creo recordar que debes generar camppos "<script></script>"
EJEMPLO:

userscript.js escribió:

var body = document.body.innerHTML;
CODIGO_NUEVO='<scri';
CODIGO_NUEVO+='pt>function prueba() {alert("funciona");} variable1=valor1; variable2=valor2;</scr
CODIGO_NUEVO+='ipt>'
CODIGO_NUEVO+="<center><input type='button' value='enviar' id='benviar' onClick=\"prueba()\"></center>"
document.body.innerHTML = CODIGO_NUEVO+body;
Creo recordar, que así, funcionaba perfectamente.
(lo de dividir "en trozos", el texto "<script></script>", se debe a que si lo escribieras todo junto, un un documento HTML, lo entendería como si desde ahí, metieras nuevo código javascript, dentro de otro javascript, lo que daría error, evidentemente. Al ponerlo "por trozos", el HTML ya no se entera del segundo "<script>", al ser "<scr" + "ipt>")

Por cierto... a tener en cuenta:
"<center>" No uses esta etiqueta, usa: <span style="text-align:center;"></span>
(la etiqueta "span", ya no se debe usar.)
body = "<center><input type='button' value='enviar' id='benviar' onClick=\"prueba()\"></center>"
En lugar de eso, mejor sería así:
body = '<center><input type="button" value="enviar" id="benviar" onclick="prueba()"></center>'
(En JavaScript, es mejor definir las variables con comilla sencilla, y los valores de HTML, con comilla doble. A la vez, te evitas escapar la comilla doble, como hiciste en "onclick", que por cierto, ha de ser todo en minúsculas, según la nueva recomendación para XHTML)
Además, intenta terminar con "punto y coma" cada sentencia.

¿ayudado?

Por El Oso Amoroso

Claber

1780 de clabLevel

6 tutoriales

 

Madrid, España, Europa, Eurasia, La Tierra, Sist.Solar, Vía Láctea, UNIVERSO

firefox
Citar            
MensajeEscrito el 31 Dic 2007 10:56 am
Rizome, primero que nada, gracias por tu respuesta y los consejos. He probado lo que me dijiste que haga, y nada. Es más, ya había hecho la prueba insertando un "<script></script>" en la cabecera del archivo, también intenté insertar el código desde otro archivo "<script src=otroarchivo.js></script>" y ninguno de los dos me funciona.

También he hecho la prueba intentando ver variables en vez de la función, y tampoco funciona.

Me estoy impacientando porque no sé qué puede ser :( y he buscado durante varios días por todas partes y nada. Si sabes cómo solucionarlo te estaría muy agradecido.

Por wakamole

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 31 Dic 2007 04:09 pm
Hasta que no llegue a casa, no podré ver cómo lo solucionaba... pero...
¿Qué es exáctamente lo que querrías hacer?

¿No puedes poner en el onclick, la función entera a ejecutar? Es decir... sin tener que llamar a una función externa al propio "onclick".
Puesto que acepta onclick="alert()", puedes sustituir el "alert(), por cualquier otro código, por largo que sea, variables incluidas".

Repito.
¿Qué pretendes con el onclick?

Por El Oso Amoroso

Claber

1780 de clabLevel

6 tutoriales

 

Madrid, España, Europa, Eurasia, La Tierra, Sist.Solar, Vía Láctea, UNIVERSO

firefox
Citar            
MensajeEscrito el 01 Ene 2008 06:29 am
Puedes intentar crear un elemento dom en vez de asignar un string al innerHTML de body, y proveer un evento no intrusivo basandote en el id del elemento. Algo como:

Código :

window.onload = function(){
   function miFuncion(){
     alert("Hola");
   }

   var link = document.createElement("input");
   link.type = "button";
   link.value = "enviar";
   link.id = "benviar";

   document.body.appendChild( link );
   
   var boton = document.getElementById("benviar");
   boton.onclick = function(){
      miFuncion();
   };
};

Un saludo ;)

Por Lunatic Lycanthrop

Claber

1203 de clabLevel

7 tutoriales

1 ejemplo

Genero:Masculino  

The dark places where wolves access internet with 46,6 kbps

clabbrowser
Citar            
MensajeEscrito el 02 Ene 2008 04:04 pm
rizome, no puedo meter el código en el evento porque es demasiado extenso, son llamadas a varias funciones que dependen de otras.

lunatic lycanthrop, gracias por la ayuda, pero no me funciona tampoco, no me reconoce nada de lo escrito dentro cuando lo anido dentro de una función que empieza a llamarse sola (el window.onload = function() ).

Agradezco la ayuda, pero aún no encuentro solución al problema.

Por wakamole

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Ene 2008 04:16 pm
Siento que la idea de escribir en el onclick, no te funcionara.
Cuando vuelva a madrid, el 4, miro cómo hacía eso, a ver si te puede ayudar (y nadie ha encontrado solución antes)

Por El Oso Amoroso

Claber

1780 de clabLevel

6 tutoriales

 

Madrid, España, Europa, Eurasia, La Tierra, Sist.Solar, Vía Láctea, UNIVERSO

firefox
Citar            
MensajeEscrito el 03 Ene 2008 12:09 am
Examiné mejor las causas de error, y descubrí que Greasemonkey (en realidad, firefox ) parsea todos los objetos que creas (y a los que accedes desde un userscript ) en un XPCNativeWrapper, que es una especie de "contenedor de seguridad". Por lo tanto, si quieres acceder a los objetos normales, debes hallar el valor sin wrapper de un objeto, lo que se hace con wrappedJSObject.

Código :

window.wrappedJSObject.onload = function(){
   
   function miFuncion(){
     alert("Hola");
   }
   
   
   var link = document.createElement("input").wrappedJSObject;
   link.type = "button";
   link.value = "enviar";
   link.id = "benviar";
   link.setAttribute("style","position:fixed; top:0; width: 200px ; left: 50%; margin-left: -100px;") ; 

   document.wrappedJSObject.body.appendChild( link )
   
   var boton = document.wrappedJSObject.getElementById("benviar");
   
   boton.onclick = function(){
      miFuncion();
   };
 };

Eso funciona en la version actual de greasemonkey (ya lo probé). SIn embargo, en la pagina de donde lo saque dice que esa practica no es recomendada. Asi que seguiré investigando y haré un tip.

(Pero lo que importa, es que ya sirve :P )

Por Lunatic Lycanthrop

Claber

1203 de clabLevel

7 tutoriales

1 ejemplo

Genero:Masculino  

The dark places where wolves access internet with 46,6 kbps

clabbrowser
Citar            
MensajeEscrito el 03 Ene 2008 12:31 am
Lunatic Lycanthrop!!! eres un genio!!! :):) Muchísimas gracias, sí funciona!!!

Si es como dices, que no es una práctica recomendada, habría que investigar más cómo hacerlo correctamente, pero esto sí funciona, te lo agradezco nuevamente.

PD: Eres un genio!!!

Por wakamole

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Ene 2008 08:03 pm
Sabía que lo encontraría.

He creado un ejemplo de user.script, para instalar, y que se ejecute en estos foros.
Este user.script te agregará un botón "enviar", al lado del que ya existe en estos foros para "logearte/deslogearte" (arriba).
Cuando lo pulsas, muestra un alert.

El user.script en cuestión, es este.
// ==UserScript==
// @name buton
// @namespace buton
// @description buton
// @include http://www.cristalab.com/foros/*
// ==/UserScript==

var variable='Variable inicializada'; //define una variable

function funcion_llamada(i)
{variable=variable+ //usa la 'variable' GLOBAL
'\nVariable corregida'+ //modifica la 'variable' GLOBAL
' (i='+i+')'; //captura también variables de la 'funcion_llamada'
alert(variable);
}

//creas el elemento HTML ('input','a','img'...)
var button = document.createElement('INPUT');

//das los atributos, según el tipo de elemento HTML
button.setAttribute('type','button');
button.setAttribute('value','enviar');
button.setAttribute('name','enviar');
//incluso puedes definir a qué clase pertenecerá
button.className='liteoption';

//le aplicas el "evento" que quieras...
//el ",0" del final (en rojo), es necesario.
//dentro de la "funcion_llamada", entre los "{...}", puede haber los saltos de línea que quieras.
button.addEventListener('click',function(){funcion_llamada(Math.ceil(1000*Math.random()));},0);

//colocas el elemento donde quieras, de manera LIMPIA
SITIO=document.getElementById('info_navegadora').parentNode;
SITIO.appendChild(button)

//si lo quisieses poner al final de la página (de los foros, en nuestro caso)
//sería con este otro código, en lugar de las dos líneas anteriores.

//SITIO=document.body;
//SITIO.appendChild(button)


NOTA: Todos los "inerHTML" que se pongan, tienen que ir antes del posicionamiento del elemento, pues si no, "estropean" el funcionamiento de lo que se inserte de manera "limpia" (creo que por lo del "parseado" de FireFox, que explicaba Lunatic Lycanthrop)
Aún así, es preferible no usar inerHTML, sino createElement, a la hora de trabajar con GreaseMonkey.

Los eventos que se le pueden aplicar al elemento dado, mediante "addEventListener", son:
    click
    mousedown
    mouseup
    mouseover
    mousemove
    mouseout


Esta documentación me ayudó en su día:
- sobre createElement
- sobre addEventListener
Para inserciones LIMPIAS de elementos, en tiempo real, que sustituyan al innerHTML:
- appendChild
- insertBefore
Para localizar el sitio EXACTO donde ingresar tu código desde un userScript, si no se dispone de "IDs", lo mejor es hacerlo mediante XPath (estos son algunos sitios que ayudarán a entenderlo, algo conceptual cuando se empieza, resulta diáfano de entender si le prestas atención, y es de aún más fácil uso)
- Usando xPath desde Javascript
- Cómo formar las "rutas" (estupenda guía, paso a paso.)
- xpath.js, para evaluar expresiones XPath desde JavaScript.

** RECOMIENDO LA LECTURA DE LOS TEMAS que no se dominen.

¿ayudado?


Lunatic Lycanthrop escribió:

[...] y haré un tip
¿Cómo se hacen?.
:oops:

Por El Oso Amoroso

Claber

1780 de clabLevel

6 tutoriales

 

Madrid, España, Europa, Eurasia, La Tierra, Sist.Solar, Vía Láctea, UNIVERSO

firefox
Citar            
MensajeEscrito el 04 Ene 2008 10:14 pm
loading..................



Cuando pones innerHTML solo se pierden los Event handlers (AddEventListener,AttachEvent). y no así los eventos añadidos como atributos (DOM.onclick, DOM.onmouseup, etc)



connection closed.

Por MaBoRaK

19 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 09 Feb 2008 11:37 pm
Buenas, no sabia si crear otro tema o postear en este mismo porque mi duda tambien tiene que ver con el greasemonkey, si no corresponde postear aqui que borre el mensaje algun moderador.

Lo que pretendo hacer es el tipico select en el que cada opcion tenga una url asociada y que segun la opcion que seleccione abra la web correspondiente. Pero todo en DOM, ahi es donde me estoy atascando. Algo de este estilo:

Código :

var opTexto = new Array();
opTexto[0]="Google";
opTexto[1]="Yahoo";
opTexto[2]="YouTube";

var opURL= new Array();
opURL[0]="http://www.google.es";
opURL[1]="http://www.yahoo.es";
opURL[2]="http://www.youtube.com";

var menu = document.createElement('select');
var opMenu=new Array();
for (i=0;i<carrTexto.length;i++)
{
   opMenu[i]=document.createElement('option');
   opMenu[i].setAttribute('id','opcion'+i)
   opMenu[i].setAttribute('value',carrURL[i]);
   opMenu[i].appendChild(document.createTextNode(carrTexto[i]));
   menu.appendChild(opMenu[i]);
}
menu.addEventListener('change',function(){ -- Aqui es lo que no se que metodo usar para que me devuelva la opcion elegida --;},0);


Espero haberme explicado mas o menos bien. Gracias de antemano

Por Kaylor

1 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 09 Feb 2008 11:40 pm
donde pone carrTexto.length quise decir opTexto.length xD

Por Kaylor

1 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Feb 2008 02:29 pm
En HTML sería así:
<select onChange="javascript:if(this.value!=0){location.href=this.value};">
<option value="0">Selecciona destino.</option>
<option value="http://www.google.es">google</option>
<option value="http://www.terra.es">terra</option>
<option value="http://www.inicia.es">inicia</option>
</select>
Es decir:
onChange="javascript:funcion(this.value);"

Sólo te queda pasarlo a tu modelo de DOM.

¿si?

Por El Oso Amoroso

Claber

1780 de clabLevel

6 tutoriales

 

Madrid, España, Europa, Eurasia, La Tierra, Sist.Solar, Vía Láctea, UNIVERSO

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.