2009-11-03 8 views
6

J'ai un CDHTMLDialog, avec lequel j'ai 2 pages HTML et un fichier .js avec quelques fonctions assez simples.Appelez une fonction JavaScript à partir de C++

J'aimerais pouvoir appeler une des fonctions JS de mon programme avec un simple type de données passé avec. par exemple. MyFunc (int). Rien n'a besoin d'être retourné.

Je vous serais reconnaissant toute conseils sur la façon que je vais à ce sujet,

merci.

Modifier: Merci à CR pour sa réponse, et tous ceux qui ont soumis des idées aussi.

Quelque chose un peu comme cela a fonctionné à la fin (dépouillé une petite erreur de manipulation de celle-ci pour plus de clarté):

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

voulez-vous dire jscript? Comment cela se fait dépend de quel moteur javascript vous utilisez: spidermonkey, v8, nitro- Mais vous dites dialogue chtml donc je suppose que vous utilisez jscript? – Breton

+0

Je crois que c'est Jscript oui. J'ai aussi corrigé ma faute de frappe, ça devrait être CDHTMLDialog. – Andrew

+0

Juste pour le plaisir de garder le tout ensemble, je viens de poster mon interprétation de ceci sur [ce fil] (http://stackoverflow.com/questions/2000371/return-value-from-execscriptihtmlwindow2/23319042#23319042). – c00000fd

Répondre

3

approche la plus simple serait pour utiliser la méthode execScript() dans l'interface IHTMLWindow2.

Ainsi, vous pouvez obtenir le IHTMLDocument2 l'interface de votre CDHtmlDialog en appelant GetDHtmlDocument, puis obtenir le parentWindow de IHTMLDocument2. La fenêtre parent aura l'interface IHTMLWindow2 qui prend en charge execScript().

Il existe peut-être un moyen plus simple d'obtenir l'interface IHTMLWindow2 à partir de CDHTMLDialog, mais je suis habitué à travailler à un niveau inférieur.

+0

Merci, cela a bien fonctionné. Je vais poster un extrait de code dans ma question afin que les gens puissent voir ma solution brute. Merci encore. – Andrew

+0

bonne solution - Je ne savais pas à propos de cette approche – JohnIdol

1

Pour vous donner une idée - javascript injection dans des technologies côté-serveur est généralement effectuée par chargement en masse au démarrage (GWT) ou injecté lorsque le code HTML est généré et servi post-retour (ASP.NET). Le point important des deux approches est qu'elles injectent les appels javascript quelque part dans la page (ou dans un fichier .js séparé lié dans le code HTML en cas de GWT) lorsquegénérer la page HTML.

Même si vous êtes en phase de développement (vous y ressemblez puisque vous êtes sur des MFC), il se peut que vous deviez insérer votre appel de méthode js dans le code HTML, puis charger (ou recharger si vous le souhaitez interagir avec le code HTML de votre application MFC) le fichier HTML dans votre CHTMLDialog.

Je ne vois pas d'autre moyen d'y parvenir (peut-être que je ne suis pas au courant de fonctionnalités prêtes à l'emploi) autre que d'éditer votre HTML et de le (re) charger - ce qui est plutôt pratique et réalisable si vous devez appeler votre méthode js une fois ou simplement injecter une sorte de logique de gestion d'événements. Cela peut être un peu pénible si vous devez interagir avec la page de votre application MFC. Dans ce cas, vous devez générer à nouveau votre code HTML et le recharger dans votre CHTMLDialog.

De toute façon, vous pouvez simplement avoir une sorte d'espace réservé dans votre fichier HTML, recherchez cela et remplacer par votre code javascript, puis chargez la page dans votre CHTMLDialog:

onclick="__my_Javascript_Call_HERE__"

Questions connexes