2011-07-29 10 views
11

Estoy tratando de leer el valor de una variable de Javascript que se carga y llama desde un control WebBrowser en mi formulario.Leer la variable de Javascript desde el control del navegador web

Ejemplo:

index.html se refiere a un javascript llamada 'Test.js' En Test.js, varias variables se crean y poblada.

index.html luego realiza una llamada a este JS.

Index.html se carga y se muestra en el control WebBrowser.

He encontrado mucha ayuda sobre cómo llamar/invocar funciones que residen en el control del navegador web. ¿Cómo puedo leer fácilmente un valor variable?

Respuesta

-4

Creo que esta es realmente una pregunta de alcance. Si se incluye un archivo llamado Test.js y en ese archivo que tiene esta línea:

var myVariable; 

Entonces esa variable se crea con alcance global y es accesible desde cualquier lugar de la página y también en cualquier otro archivo JavaScript que se incluir. Si declara una variable como esa, fuera de una función, se creará con alcance global.

Una idea. Si no puede acceder a su variable en su página principal, asegúrese de que su script que la declara y asigna un valor esté incluida antes de que el JavaScript en su página intente usarla. Podría tener un orden de problema de ejecución.

+0

Entonces, ¿cómo podría acceder myVariable desde dentro de mi aplicación C# después de que mi control WebBrowser haya cargado la página web? – AllStar11

+0

Si esa es la pregunta que está haciendo, es posible que desee volver y editar su pregunta original. No está muy claro. –

1

No creo que puedas obtener el valor de tu variable de tu JS porque tu C# se ejecutará antes de que tu js var exista. He tenido este mismo problema con la obtención de valores de mis variables js y no he podido hacerlo directamente. Lo que puedes hacer es usar un método HtmlTextWriter para obtener los valores. Esto le permitirá usar una llamada js renderizada C# que le dará acceso a sus valores variables.

Por ejemplo:

protected override void RenderContents(HtmlTextWriter writer) 
    { 
     EnsureChildControls(); 
     base.RenderContents(writer); 

writer.BeginRender(); 
     writer.RenderBeginTag(HtmlTextWriterTag.Script); 
     writer.AddAttribute(HtmlTextWriterAttribute.Type, "text/javascript"); 

     writer.Write("myJavaScriptVar = (\" + myC#Var + \")"); 
writer.RenderEndTag(); 

No es 100% que va a trabajar, pero sé que se puede acceder a las variables de js esta manera. Lo he hecho con otros proyectos. Espero que esto ayude.

0

Eche un vistazo a HtmlWindow Class. Puede obtener una instancia del mismo llamando al WebBrowser.Document.Window. Si sus variables js tienen alcance global, pertenecerán al objeto Window, y deberían ser accesibles desde WebBrowser.Document.Window.DomWindow en C#.

+1

¿Cómo accedería a la variable después de hacer esto? – AllStar11

2

Puede usar IHTMLDocument :: Script para recuperar la interfaz de automatización del motor de scripts. Si usa el control del navegador web de Windows Forms en C#, esto significa convertir la propiedad HtmlDocument.DomDocument en mshtml.IHTMLDocument. Para WPF, transfiere el documento directamente.

Las variables globales se agregan al motor de scripts como propiedades y funciones globales como métodos. Hasta IE9, puede usar la interfaz IDispatch para acceder a esas funciones/variables si conoce sus nombres. HtmlDocument.InvokeScript y WebBrowser.InvokeScript de WPF lo envuelve de una manera agradable, pero solo para System.Reflection.BindingFlags.InvokeMethod. Para acceder a las variables, necesita pasar DISPATCH_PROPERTYGET cuando llama a Invoke, es decir, usa BindingFlags.GetProperty en el código administrado.

El encuadernado manual no es divertido, en caso de que desee saber qué tan laborioso es el encuadernado tardío, marque Binding for Office automation servers with Visual C# .NET.

There is a problem in IE9 that the variables/functions are not accessible via IDispatch, pero todavía se puede acceder a las variables/funciones a través de IDispatchEx de una manera similar.

+0

De acuerdo, InvokeScript es la forma más correcta para obtener/configurar variables JS globales (que son propiedades personalizadas HTMLWindow por fin). Ver mi comentario en otro hilo: http://stackoverflow.com/questions/11242482/c-sharp-get-variable-from-webbrowser-generated-by-javascript#comment18867034_11317873 – RReverser

7

que podría hacer:

Document.InvokeScript("eval", new object[] { "my_var_name" }); 
1

Para acceder a las variables de ámbito global JavaScript, he usado un método personalizado incluido aquí se llama GetGlobalVariable(). (Se utiliza Document.InvokeScript de Juan's answer 1.)

Digamos que sus variables JavaScript creadas en el ámbito global como esto:

var foo = "bar"; 
var person = {}; 
var person.name = "Bob"; 

A continuación, se puede acceder a estos valores utilizando el método C# GetGlobalVariable() como tal. (Es posible que necesite configurar una timer a comprobar continuamente si las variables son pobladas.)

var foo = GetGlobalVariable(webBrowser, "foo"); 
var name = GetGlobalVariable(webBrowser, "person.name"); 

Aquí es el método GetGlobalVariable(). Observe que verifica cada parte de la referencia de variable para evitar una excepción.

private object GetGlobalVariable(WebBrowser browser, string variable) 
{ 
    string[] variablePath = variable.Split('.'); 
    int i = 0; 
    object result = null; 
    string variableName = "window"; 
    while (i < variablePath.Length) 
    { 
     variableName = variableName + "." + variablePath[i]; 
     result = browser.Document.InvokeScript("eval", new object[] { variableName }); 
     if (result == null) 
     { 
      return result; 
     } 
     i++; 
    } 
    return result; 
} 
Cuestiones relacionadas