Привет всем,
не получается динамически добавить скрипт и потом его вызвать. Вот код:
CComQIPtr<IHTMLDocument2> doc2;
CComQIPtr<IHTMLDocument3> doc3;
CComQIPtr<IHTMLWindow2> win2;
CComPtr<IHTMLElement> script_elem;
CComQIPtr<IHTMLDOMNode> script_node;
CComQIPtr<IHTMLDOMNode> root_node;
CComQIPtr<IHTMLDOMNode> appnode;
CComPtr<IDispatch> disp;
CComPtr<IHTMLElementCollection> coll;
HRESULT hr;
_bstr_t js("<script> function test_func() { alert(\"Hello World\"); } </script>");
_bstr_t btag("script");
_bstr_t broottag("head");
_bstr_t battrname("type");
_bstr_t battrval("text/javascript");
_variant_t rv(VT_EMPTY);
doc2 = m_browser.get_Document();
doc3 = doc2;
hr = doc2->createElement((BSTR)btag, &script_elem);
// hr = script_elem->put_innerHTML((BSTR)js); // это вообще не работает
hr = script_elem->put_outerHTML((BSTR)js); // поэтому использую это
hr = script_elem->setAttribute(battrname, _variant_t(battrval));
script_node = script_elem;
hr = doc3->getElementsByTagName(broottag, &coll);
hr = coll->item(_variant_t(0), _variant_t(0), &disp);
root_node = disp;
hr = root_node->appendChild(script_node, &appnode);
_bstr_t func_name("test_func();");
_bstr_t lang_name("JavaScript");
rv.vt = VT_EMPTY;
hr = doc2->get_parentWindow(&win2);
hr = win2->execScript((BSTR)func_name, (BSTR)lang_name, &rv);
На последней строке кода выдается сообщение "Произошла ошибка сценария. Предполагается наличие объекта, строка: 1, символ: 1" и возвращаемое значение функции = -2147352319.
Кто-нибудь знает в чем проблема и как ее решить?
Здравствуйте, vinnitu, Вы писали:
V>Здравствуйте, degoal, Вы писали:
D>>не получается динамически добавить скрипт
V>аналогичная проблема.
V>посредством put_innerHTML() не удаётся добавить код с <script>,
V>отфильтровывается он... так а как же тогда его добавить?
Собственно говоря, все зависит от того, для чего тебе нужно добавить скрипт на страницу. Если для того, чтобы выполнить его в контексте страницы (что собственно мне и нужно было), то можно использовать следующий код:
CComQIPtr<IHTMLDocument2> doc2;
CComQIPtr<IHTMLDocument3> doc3;
CComQIPtr<IHTMLWindow2> win2;
CComQIPtr<IHTMLElement> elem;
HRESULT hr;
_variant_t rv;
_bstr_t code;
_bstr_t lang_name("JavaScript");
doc2 = m_browser.get_Document();
doc3 = doc2;
hr = doc2->get_parentWindow(&win2);
code = "function test_func() { alert(\"Hello World\"); }";
hr = win2->execScript((BSTR)code, (BSTR)lang_name, &rv); // таким образом происходит объявление функции для JavaScript
Причем объявленный таким образом код можно вызвать как из С++
code = "test_func();";
hr = win2->execScript((BSTR)code, (BSTR)lang_name, &rv);
так и путем вызова этой объявленной функции из уже существующего кода на HTML странице.