<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; WSH: Не запускается обработчик события DocumentComplete]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=11268&amp;type=atom" />
	<updated>2016-02-03T18:56:55Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=11268</id>
		<entry>
			<title type="html"><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100835#p100835" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2016-02-03T18:56:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100835#p100835</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100820#p100820" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ратибор Редоран]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27370</uri>
			</author>
			<updated>2016-02-03T07:35:31Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100820#p100820</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100775#p100775" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2016-02-02T08:33:00Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100775#p100775</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100773#p100773" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Ратибор Редоран пишет:</cite><blockquote><p>Хорошо, а как бы Вы решили данную задачу?</p></blockquote></div><p>Насколько я понимаю и помню, можно:<br />объявить <em>ie_DocumentComplete</em> как глобальную переменную или как свойство глобального объекта (второе можно сделать и внутри функции <em>MakeIE</em>)<br />и уже в функции присвоить ей ссылку на нужную локальную функцию.</p>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2016-02-02T03:17:49Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100773#p100773</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100753#p100753" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2016-02-01T11:21:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100753#p100753</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100722#p100722" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ратибор Редоран]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27370</uri>
			</author>
			<updated>2016-01-29T13:19:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100722#p100722</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100721#p100721" />
			<content type="html"><![CDATA[<p>Функция ie_DocumentComplete - локальная, существующая только внутри функции MakeIE. По завершении работы MakeIE <strong>все</strong> локальные сущности уничтожаются.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2016-01-29T12:58:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100721#p100721</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[WSH: Не запускается обработчик события DocumentComplete]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=100717#p100717" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Ратибор Редоран]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27370</uri>
			</author>
			<updated>2016-01-29T11:40:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=100717#p100717</id>
		</entry>
</feed>
