habilitar - Cómo detectar la ejecución de Javascript en el control WebBrowser
enable javascript internet explorer 11 (3)
Tengo un control WebBrowser
en mi aplicación C #. El navegador web 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, está limitada por proxy, archivo de hosts, etc.).
Necesito saber y ser notificado cuando haya una llamada de Javascript dentro de la página cargada en el componente del navegador web.
Primer ejemplo: dado un enlace como este
<a href="javascript:void(0)" onclick="jsFunct();">test</a>
Cuando el usuario hace clic en el enlace, necesito saber que se ha llamado a la función "jsFunct".
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, se ha llamado a la función jsFunct.
Lo mejor sería tener un evento activado cuando se llama a la función. También sería genial si el evento pudiera ejecutar el código Javascript, o al menos el nombre de la función en los argumentos.
EDITAR:
Incluso si la pregunta está relacionada con el componente del navegador web, cualquier cosa que le permita al usuario detectar la activación de javascript (incluso a través de js) estaría bien, pudiendo inyectar un js que maneja el evento de javascript y lo pasa al control de wb y desencadena algún evento que puede manejar.
Bueno, lo que Krishna ha respondido es la combinación de javascript puro que se adjunta a los eventos, sin embargo, veo que es posible que deba adjuntarlo a todas las etiquetas (a, p, div, entrada), etc. y a todos los eventos adjuntos a cada etiqueta.
Creo que la otra forma es jugar con el BHO (objeto de ayuda del navegador) disponible en .net, y si no, y eres bueno en VC ++ y MFC, también puedes jugar con Windows Hooks.
En el evento de carga del navegador web,
- Inyectar jquery
- Inyectar guiones de monitor
,
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");
tu archivo InjectMonitor.js 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;})
});
Puede usar window.external
para llamar a un método de C # cuando se window.external
una función global en JavaScript. Consulte la Descripción general del control WebBrowser para obtener detalles sobre window.external.
Tendrá que configurar ObjectForScripting: el control de la ventana del navegador web.external SIEMPRE es nulo. para que esto funcione
Tome la respuesta de @ Krishna para agregar JavaScript (pero suelte jQuery porque 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 siguiente JavaScript (InjectMonitor.js) encontrará todas las funciones globales y adjuntará su 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 Agregar el registro de la consola a cada función , simplemente registra la llamada a la consola; pero al usar window.external, puede enviar un mensaje a su aplicación de C # con detalles de a qué función se llamó desde el cliente.
Finalmente, aquí hay un ejemplo de JS Bin (ejecútalo y no olvides la consola): JS Bin Example