2009-11-03 16 views
6

Tengo un CDHTMLDialog, con el cual tengo 2 páginas HTML y un archivo .js con algunas funciones bastante simples.Llamar a una función de JavaScript de C++

Me gustaría poder llamar a una de las funciones JS de mi programa con un simple tipo de datos pasado con ella. p.ej. MyFunc (int). Nada necesita ser devuelto.

Le agradecería cualquier orientación sobre cómo voy sobre esto,

gracias.

Edit: Gracias a CR por su respuesta, y a todos los demás que enviaron ideas allí también.

Algo un poco como esto trabajaron en el extremo (pelado un poco de manipulación de ella para mayor claridad de error):

void callJavaScriptFunc(int Fruit) 
{ 
    HRESULT hRes; 
    CString FuncStr; 
    CString LangStr = "javascript"; 
    VARIANT vEmpty = {0}; 

    CComPtr<IHTMLDocument2> HTML2Doc; 
    CComPtr<IHTMLWindow2> HTML2Wind; 

    hRes = GetDHtmlDocument(&HTML2Doc); 
    hRes = HTML2Doc->get_parentWindow(&HTML2Wind); 

    if(Fruit > 0) 
    { 
     FuncStr = "myFunc(808)"; // Javascript parameters can be used 
     hRes = HTML2Wind->execScript(FuncStr.AllocSysString(), LangStr.AllocSysString(), &vEmpty); 
    } 
} 
+0

¿te refieres a jscript? Cómo se hace esto depende de qué motor de JavaScript estés usando: spidermonkey, v8, nitro- Pero dices chtml dialogar así que supongo que estás usando jscript? – Breton

+0

Creo que es JScript sí. También he corregido mi error tipográfico, debería ser CDHTMLDialog. – Andrew

+0

Solo por el bien de mantener todo junto, acabo de publicar mi interpretación de esto en [este hilo] (http://stackoverflow.com/questions/2000371/return-value-from-execscriptihtmlwindow2/23319042#23319042). – c00000fd

Respuesta

3

enfoque más fácil sería para usar el método execScript() en la interfaz IHTMLWindow2.

Por lo que podría obtener la interfaz IHTMLDocument2 de su CDHTMLDialog llamando GetDHtmlDocument, a continuación, obtener la parentWindow de IHTMLDocument2. La ventana principal tendrá la interfaz IHTMLWindow2 que admite execScript().

Puede haber una manera más fácil de obtener la interfaz IHTMLWindow2 desde su CDHTMLDialog, pero estoy acostumbrado a trabajar en un nivel inferior.

+0

Gracias, esto funcionó muy bien. Publicaré un fragmento de código en mi pregunta para que la gente pueda ver mi solución aproximada. Gracias de nuevo. – Andrew

+0

buena solución - No sabía acerca de este enfoque – JohnIdol

1

Para darle un toque - Javascript inyección en el lado del servidor-tecnologías por lo general se lleva a cabo a través carga masiva al inicio (GWT) o inyectada cuando se genera el HTML y se sirve cada post-back (ASP.NET). El punto importante de ambos enfoques es que inyectan las llamadas javascript en algún lugar de la página (o en un archivo .js separado vinculado en el HTML en caso de GWT) cuandogeneración de la página HTML.

Incluso si está en el desarrollo de victorias (parece que ya que está en MFC) podría ser el caso que tiene que insertar su llamada al método js en el HTML y luego cargar (o volver a cargar si desea interactuar con el html desde su aplicación MFC) el archivo HTML en su CHTMLDialog.

No veo ninguna otra forma de lograr esto (quizás no conozco alguna funcionalidad lista para usar) que no sea editar el código HTML y (re) cargarlo, lo cual es bastante conveniente y viable si tiene que llamar al método js una vez o simplemente inyectar algún tipo de lógica de manejo de eventos. Podría ser un poco molesto si tiene que interactuar con la página desde su aplicación MFC. En este caso, debe volver a generar su HTML y volver a cargarlo en su CHTMLDialog.

De cualquier manera usted puede simplemente tener algún tipo de marcador de posición en el archivo HTML, buscar ese y reemplazar con su código Javascript, a continuación, cargar la página en su CHTMLDialog:

onclick="__my_Javascript_Call_HERE__"

Cuestiones relacionadas