2012-03-05 25 views
16

Tengo un control WebBrowser en mi aplicación C#. El webbrowser está bajo el control del usuario, es decir, puede cargar cualquier página web a la que su computadora pueda acceder en la web (por supuesto, limitada por proxy, archivo de hosts, etc.).Cómo detectar la ejecución de javascript en el control WebBrowser

Necesito saber y ser notificado cuando hay una llamada javascript dentro de la página cargada en el componente webbrowser.

Primer ejemplo: dado un enlace como este

<a href="javascript:void(0)" onclick="jsFunct();">test</a> 

Cuando el usuario hace clic en el enlace que necesito saber que la función "jsFunct" ha sido llamado.

Segundo ejemplo: dada una llamada como

<script type="text/javascript"> 
    window.setTimeout("jsFunct()", 1000); 
</script> 

Necesito saber que, 1 segundo después de la ejecución del script, la función jsFunct ha sido llamado.

Lo mejor sería tener un evento disparado cuando se llama a la función. También sería genial si el evento pudiera obtener el código de JavaScript ejecutado, o al menos el nombre de la función en los argumentos.

EDIT:

Incluso si la pregunta está relacionada con el componente de navegador web, lo que permite al usuario detectar Javascript activación (incluso a través de JS) estaría bien, ser capaz de inyectar un js que controla el evento javascript y lo pasa al control wb activando algún evento que pueda manejar.

Respuesta

8

Puede usar window.external para llamar a un método C# cuando se activa una función global en JavaScript. Consulte WebBrowser Control Overview para obtener detalles sobre window.external.

Tendrá que establecer ObjectForScripting: Webbrowser control's window.external is ALWAYS null. para que esto funcione.

Take @ respuesta de Krishna para añadir el Javascript (jQuery, pero deje caer, ya que no será necesario):

private void addScript(HtmlElement head, string scriptSource) 
{ 
HtmlElement lhe_script = head.Document.CreateElement("script"); 
IHTMLScriptElement script = (IHTMLScriptElement)lhe_script.DomElement; 
script.src = scriptSource; 
head.AppendChild(lhe_script);    
} 

addScript(WebBrowser.Head, @"InjectMonitor.js"); 

El Javascript a continuación (InjectMonitor.js) encontrarán todas las funciones globales y conectar el controlador especificado :

function augment(withFn) { 
    var name, fn; 
    for (name in window) { 
     fn = window[name]; 
     if (typeof fn === 'function') { 
      window[name] = (function(name, fn) { 
       var args = arguments; 
       return function() { 
        withFn.apply(this, args); 
        fn.apply(this, arguments); 

       }; 
      })(name, fn); 
     } 
    } 
} 

augment(function(name, fn) { 
    console.log("calling " + name, fn); 

    // window.external.yourC#method 
}); 

En este ejemplo, tomado de Adding Console Log to Every Function, sólo se registra la llamada a la consola; pero usando window.external puede enviar algún mensaje a su aplicación C# con detalles de qué función fue llamada desde el cliente.

Por último, aquí hay un ejemplo JS Bin (ejecutarlo y no se olvide de la consola): JS Bin Example

+1

Por el momento no tengo mucho tiempo para probar esto, ¿podría explicar cómo puedo detectar una llamada a una función js específica en la página web con 'window.external'? También se apreciaría un pequeño ejemplo de código – Gabber

+0

actualizado, agregué el JS relevante y, con suerte, la solución completa. – Jeff

+0

Todo lo que necesitaba, realmente feliz de premiar la recompensa y resolver este problema, ¡gracias! – Gabber

8

En el evento de carga de navegador web,

  1. Inyectar Jquery guiones
  2. Inyectar Seguir el

,

private void addScript(HtmlElement head, string scriptSource) 
{ 
HtmlElement lhe_script = head.Document.CreateElement("script"); 
IHTMLScriptElement script = (IHTMLScriptElement)lhe_script.DomElement; 
script.src = scriptSource; 
head.AppendChild(lhe_script);    
} 

addScript(Webbrowser.Head, @"<Change File Path here>jquery.min.js"); 
addScript(WebBrowser.Head, @"InjectMonitor.js"); 

sus InjectMonitor.js archivo debería ser algo como esto

$(document).ready(function() { 
     //Add click event for every anchor on the page loaded- note this merely alerts text on click. you can however add your own function 
     $("a").click(function (e) { alert($(this).text()); return false;}) 
    }); 
+0

1 por señalarme en la dirección correcta, vamos a hacer un poco más de trabajo para conseguir que una respuesta – Gabber

+0

házmelo saber cómo te llevas bien. si estás atascado en algún lugar, intentaré configurar este proyecto también a mi lado. esta es una buena idea y creo que es muy posible – Krishna

+0

¿Podría explicar mejor qué quiere decir con "Supervisar scripts"? gracias – Gabber

1

Bueno, lo que Krishna ha respondido son interms de javascript puro vinculado a eventos, sin embargo, veo que puede necesitar adjuntarlo a todas las etiquetas (a, p, div, entrada), etc. ya todos los eventos adjuntos a cada uno etiqueta.

Creo que la otra forma es jugar con el BHO (objeto de ayuda del navegador) disponible para su en .NET, y si no y usted es bueno en VC++ y MFC también puede jugar con Windows Hooks.

+0

El problema con adjuntar javascript a eventos es que no detecta la ejecución de javascript ejecutado con funciones como 'setTimeout'. Además, ¿qué pasa si un clic no desencadena una llamada javascript? No es bueno. Necesito detectar la ejecución de una función de JavaScript cada vez que suceda, si se llama en un controlador de eventos, desencadenada por un tiempo de espera o de cualquier otro modo. – Gabber

Cuestiones relacionadas