<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; WSH: Не запускается обработчик события DocumentComplete]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=11268</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11268&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «WSH: Не запускается обработчик события DocumentComplete».]]></description>
		<lastBuildDate>Wed, 03 Feb 2016 18:56:55 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100835#p100835</link>
			<description><![CDATA[<p><strong>Ратибор Редоран</strong>,<br /></p><div class="quotebox"><blockquote><p>Верно, только ie_DocumentComplete вызывается в методе load, который выполняется уже после того как отработает конструктор (и вернет this).</p></blockquote></div><p>Кажется понял, что Вы имеете в виду. Действительно конструктор уже отработал, но функции доступны, потому что строкой<br /></p><div class="codebox"><pre><code>var form = new MakeIE();</code></pre></div><p>был создан объект, ссылка на который держится в переменной <strong>form</strong>. И пока она существует, функции внутри будут доступны. В данном случае он (объект) будет уничтожен по концу работы скрипта. Думаю <strong>Rumata</strong> говорил не о моменте завершения работы конструктора, а о моменте уничтожения объекта в переменной и её самой. Если ошибаюсь, надеюсь он меня поправит. Но проблема была именно в том, что функция была запрятана внутрь <strong>MakeIE</strong>, поэтому обработчик событий WScript её не видел.</p><p>P.S Истина где-то рядом )</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Wed, 03 Feb 2016 18:56:55 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100835#p100835</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100820#p100820</link>
			<description><![CDATA[<p><strong>Xameleon</strong><br /></p><div class="quotebox"><blockquote><p>Хм. А из чего видно, что конструктор завершился ? Возможно Вас не понял, но вы вызываете функцию ie_DocumentComplete принудительно между циклами. Она спокойно отрабатывает и скрипт завершается. Разве не так ?</p></blockquote></div><p>Верно, только ie_DocumentComplete вызывается в методе load, который выполняется уже после того как отработает конструктор (и вернет this).</p><p><strong>5wisgest</strong><br /></p><div class="quotebox"><blockquote><p>объявить ie_DocumentComplete ... как свойство глобального объекта (... можно сделать и внутри функции MakeIE)<br />и уже в функции присвоить ей ссылку на нужную локальную функцию.</p></blockquote></div><p>Попробовал - получилось. Вариант вполне рабочий, спасибо Вам!</p><p><strong>Xameleon</strong><br /></p><div class="quotebox"><blockquote><p>Дело именно в том, что обработчик событий WScript смотрит только на функции верхнего уровня.</p></blockquote></div><p>А вот этого я не знал... Теперь понятно, почему функция не отрабатывала.</p>]]></description>
			<author><![CDATA[null@example.com (Ратибор Редоран)]]></author>
			<pubDate>Wed, 03 Feb 2016 07:35:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100820#p100820</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100775#p100775</link>
			<description><![CDATA[<p><strong>wisgest</strong>, да. Действительно, один из вариантов.</p><div class="codebox"><pre><code>
var ie = WScript.CreateObject(&#039;InternetExplorer.Application&#039;,&#039;ie_&#039;)

ie.Visible = true

navigate(&#039;http://www.yandex.ru&#039;);

function navigate(url){
	this.ie_DocumentComplete = function(){
		WScript.Echo(&#039;document complete&#039;);
	}
	ie.navigate(url);
	while(ie.Busy){
		WScript.Sleep(100);
	}
}
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Tue, 02 Feb 2016 08:33:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100775#p100775</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100773#p100773</link>
			<description><![CDATA[<div class="quotebox"><cite>Ратибор Редоран пишет:</cite><blockquote><p>Хорошо, а как бы Вы решили данную задачу?</p></blockquote></div><p>Насколько я понимаю и помню, можно:<br />объявить <em>ie_DocumentComplete</em> как глобальную переменную или как свойство глобального объекта (второе можно сделать и внутри функции <em>MakeIE</em>)<br />и уже в функции присвоить ей ссылку на нужную локальную функцию.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Tue, 02 Feb 2016 03:17:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100773#p100773</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100753#p100753</link>
			<description><![CDATA[<p><strong>Ратибор Редоран</strong><br />1) <strong>Rumata</strong> прав. Дело именно в том, что обработчик событий <strong>WScript</strong> смотрит только на функции верхнего уровня. </p><div class="quotebox"><blockquote><p>Хорошо, а как бы Вы решили данную задачу?</p></blockquote></div><p>а) Попытался бы отказаться от использования <strong>IE</strong> вовсе. Грузный тяжеловесный объект. К тому же не всегда работает адекватно.<br />б) Попробовал бы использовать <strong>WinHttp.WinHttpRequest.5.1</strong> / <strong>Msxml2.XMLHTTP.6.0</strong> и подобные&nbsp; в связке с объектом <strong>htmlfile</strong><br />в) В случае крайней необходимости именно IE, собрал бы <strong>Windows Script Component</strong> c обработчиками событий, как в первом примере, а в основном скрипте получал бы экземпляры объекта<br />г) Посмотрел бы в сторону <strong>HTA</strong>. Подгрузку данным там можно сделать нативными средствами.</p><p>Всё зависит от конкретной цели. Не зная её, сложно судить о конечной реализации. Путей решения много, правильных и оптимизированных меньше.</p><p>2) </p><div class="quotebox"><blockquote><p>И функция отработает, хотя конструктор уже давно завершился: локальные переменные и функции остались в замыкании...<br />Хорошо, а как бы Вы решили данную задачу?</p></blockquote></div><p>Хм. А из чего видно, что конструктор завершился ? Возможно Вас не понял, но вы вызываете функцию <strong>ie_DocumentComplete </strong> принудительно между циклами. Она спокойно отрабатывает и скрипт завершается. Разве не так ?</p>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Mon, 01 Feb 2016 11:21:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100753#p100753</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100722#p100722</link>
			<description><![CDATA[<p>Нет, и это легко проверить, достаточно изменить метод load на такой:<br /></p><div class="codebox"><pre><code>    this.load = function(pause, url) {

      while (ie.Busy) {
        WScript.Sleep(pause);
      }

      ie.Navigate(&quot;about:blank&quot;);

      while (ie.ReadyState &lt; 4) {
        WScript.Sleep(pause);
      }
      
      ie_DocumentComplete();

      while (forever) {
        WScript.Sleep(pause);
      }
    };</code></pre></div><p>И функция отработает, хотя конструктор уже давно завершился: локальные переменные и функции остались в замыкании...</p><p>Хорошо, а как бы Вы решили данную задачу?</p>]]></description>
			<author><![CDATA[null@example.com (Ратибор Редоран)]]></author>
			<pubDate>Fri, 29 Jan 2016 13:19:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100722#p100722</guid>
		</item>
		<item>
			<title><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100721#p100721</link>
			<description><![CDATA[<p>Функция ie_DocumentComplete - локальная, существующая только внутри функции MakeIE. По завершении работы MakeIE <strong>все</strong> локальные сущности уничтожаются.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 29 Jan 2016 12:58:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100721#p100721</guid>
		</item>
		<item>
			<title><![CDATA[WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=100717#p100717</link>
			<description><![CDATA[<p>Доброго времени суток!</p><p>Имеется следующая проблема: после попытки спрятать создание экземпляра ie в функцию-конструктор перестала выполняться функция, которая вызывалась после загрузки страницы (событие DownloadComplete).<br />Сперва было вот так (этот пример рабочий):</p><div class="codebox"><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;job id=&quot;T1&quot;&gt;
  &lt;script language=&quot;JScript&quot;&gt;&lt;![CDATA[

    var forever = true;

    function f(doc) {
      doc.title = &quot;Теst&quot;;
    }

    function ie_OnQuit() {
      forever = false;
    }
    
    function ie_DocumentComplete() {
      doc = ie.Document;

      if (typeof f == &#039;function&#039;) f(doc);

      ie.Visible = true;
    }

    var ie = WScript.CreateObject(&quot;InternetExplorer.Application&quot;, &quot;ie_&quot;);

    while (ie.Busy) {
      WScript.Sleep(200);
    }

    ie.Navigate(&quot;about:blank&quot;);

    while (forever) {
      WScript.Sleep(200);
    }

  ]]&gt;&lt;/script&gt;
&lt;/job&gt;</code></pre></div><p>А после того, как создание объекта было спрятано в функцию:</p><div class="codebox"><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;
&lt;job id=&quot;T1&quot;&gt;
  &lt;script language=&quot;JScript&quot;&gt;&lt;![CDATA[

  var form = new MakeIE();
  form.setAfterCompleteFunc(f);
  form.load(200, &quot;about:blank&quot;);

  function f(doc) {
    doc.title = &quot;test&quot;;
  }

  function MakeIE(func) {
    var forever = true;
    var f = func;
    var ie = WScript.CreateObject(&quot;InternetExplorer.Application&quot;, &quot;ie_&quot;);

    function ie_OnQuit() {
      forever = false;
    }
    
    function ie_DocumentComplete() {
      doc = ie.Document;
      doc.focus();
      window = doc.parentWindow;

      if (typeof f == &#039;function&#039;) f(doc);

      ie.Visible = true;
    }

    this.load = function(pause, url) {

      while (ie.Busy) {
        WScript.Sleep(pause);
      }

      ie.Navigate(&quot;about:blank&quot;);

      while (forever) {
        WScript.Sleep(pause);
      }
    };

    this.setAfterCompleteFunc = function(func) {
      f = func;
    };
  }
  
  ]]&gt;&lt;/script&gt;
&lt;/job&gt;</code></pre></div><p>функция &quot;ie_DocumentComplete&quot; перестала выполняться... можно, конечно обойтись проверкой в цикле значения ReadyState для принудительного выполнения этой функции, но хотелось бы сперва понять, почему второй пример не работает...</p>]]></description>
			<author><![CDATA[null@example.com (Ратибор Редоран)]]></author>
			<pubDate>Fri, 29 Jan 2016 11:40:23 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=100717#p100717</guid>
		</item>
	</channel>
</rss>
