Comment puis-je exécuter une balise <script> que je viens d'insérer dynamiquement à partir d'une BHO

Je suis complètement nouveau dans le développement d'extensions IE avec les Objets Helper Navigateur.

J'ai réussi à créer un BHO qui insère avec succès une étiquette de script qui fait référence à un fichier javascript dans la tête de la page HTML (voir le code ci-dessous).

Mais la balise de script se trouve juste dans le DOM et le fichier javascript externe n'est pas exécuté.

Existe-t-il un moyen de dire au navigateur d'exécuter le fichier javascript externe?

Merci!

Détails du code: j'appelle la méthode suivante sur l'événement OnDocumentComplete:

void CHelloWorldBHO::InsertScriptTag(IDispatch* pDispDoc) { HRESULT hr = S_OK; // query for an HTML document. CComQIPtr<IHTMLDocument3> pDocument3 = pDispDoc; CComQIPtr<IHTMLDocument2> pDocument2 = pDispDoc; if (pDocument2 != NULL && pDocument3 != NULL) { // ********************** create our script tag Element (pHtmlElem) **************************** IHTMLElement* pHtmlElem; CComVariant vAlert="http://www.gnpcb.org/esv/share/js/?action=getDailyVerse"; // example referencing external JS code CComVariant vJavascript="text/javascript"; hr = pDocument2->createElement(_T("script"), &pHtmlElem); if (SUCCEEDED(hr) && pHtmlElem != NULL) { hr = pHtmlElem->setAttribute(_T("type"), vJavascript); hr = pHtmlElem->setAttribute(_T("src"), vAlert); } // ********************** insert Element (pHtmlElem) in HTML Head **************************** // Get the head from the DOM. static const CComBSTR sbstrHead(L"head"); CComPtr<IHTMLElementCollection> objects; hr = pDocument3->getElementsByTagName(sbstrHead, &objects); if(SUCCEEDED(hr) && objects != NULL) { // Get the number of elements in the collection. long nElements = 0; hr = objects->get_length(&nElements); if (hr == S_OK && nElements > 0) { CComVariant svarItemIndex(0); // we will get the first element CComVariant svarEmpty; CComPtr<IDispatch> spdispElement; // Get the element out of the collection with index 0 (the first element, that is, the head) hr = objects->item(svarItemIndex, svarEmpty, &spdispElement); if (hr == S_OK && spdispElement != NULL) { CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spHeadNode = spdispElement; // query for DOM interfaces CComQIPtr<IHTMLDOMNode, &IID_IHTMLDOMNode> spNodeNew; spNodeNew = pHtmlElem; if (spHeadNode) { spHeadNode->appendChild(spNodeNew, NULL); } } } } } 

}

Vous devez utiliser execScript au lieu d'appendChild. Et la syntaxe de ce que vous devez exécuter est très, très étrange . Mais il accomplit ce que vous voulez – à savoir, un JavaScript externe est ajouté au DOM. Appelez ceci pendant OnDocumentComplete:

 VARIANT vrt = {0}; CComQIPtr<IHTMLWindow2> win; spHTMLDoc->get_parentWindow(&win); CComBSTR bstrScript = L"var html_doc = document.getElementsByTagName('head')[0]; var _js = document.createElement('script'); _js.setAttribute('type', 'text/javascript'); _js.setAttribute('id', 'bho_js'); _js.setAttribute('src', 'http://domain.com/script.js'); if(!document.getElementById('bho_js')) html_doc.appendChild(_js);"; CComBSTR bstrLanguage = L"javascript"; HRESULT hrexec = win->execScript(bstrScript,bstrLanguage, &vrt); 

Cela ajoutera <script type="text/javascript" id="bho_js" src="http://domain.com/script.js"></script> dans le DOM HEAD.