Динамическое добавление скриптов в HTML используя DOM
От: degoal  
Дата: 30.06.08 07:45
Оценка: 3 (1)
Привет всем,

не получается динамически добавить скрипт и потом его вызвать. Вот код:


  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.
Кто-нибудь знает в чем проблема и как ее решить?
Re: Динамическое добавление скриптов в HTML используя DOM
От: vinnitu Украина  
Дата: 16.09.08 08:16
Оценка:
Здравствуйте, degoal, Вы писали:

D>не получается динамически добавить скрипт


аналогичная проблема.

посредством put_innerHTML() не удаётся добавить код с <script>,
отфильтровывается он... так а как же тогда его добавить?
С Уважением.
Re[2]: Динамическое добавление скриптов в HTML используя DOM
От: degoal  
Дата: 19.09.08 20:31
Оценка:
Здравствуйте, 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 странице.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.