Element.load() callback, event?
От: Antik  
Дата: 26.08.10 15:35
Оценка:
Приветствую,

Использую sciter и возникла потребность в событии возникающим после загрузки html кода в Element.load() через url
В данный момент не нахожу способа, чтобы понять загрузился ли html код кроме как проверки через select существует ли в DOM загружаемый элемент или ещё нет. Такой вариант не всегда удобен так как иногда неизвестно какой html код подгружается.
Может есть какой-нить скрытый callback у Element.load(url) или может Event который можно поймать после окончания подгрузки?

PS. Про self.ready в курсе и этот вариант не годиться так как загружаемый код это голый html.
Re: Element.load() callback, event?
От: cgibin  
Дата: 26.08.10 16:49
Оценка:
Здравствуйте, Antik, Вы писали:

A>Может есть какой-нить скрытый callback у Element.load(url) или может Event который можно поймать после окончания подгрузки?


Можешь посмотреть в сторону SC_DATA_LOADED
Re: Element.load() callback, event?
От: c-smile Канада http://terrainformatica.com
Дата: 26.08.10 18:11
Оценка:
Здравствуйте, Antik, Вы писали:

A>Приветствую,


A>Использую sciter и возникла потребность в событии возникающим после загрузки html кода в Element.load() через url

A>В данный момент не нахожу способа, чтобы понять загрузился ли html код кроме как проверки через select существует ли в DOM загружаемый элемент или ещё нет. Такой вариант не всегда удобен так как иногда неизвестно какой html код подгружается.
A>Может есть какой-нить скрытый callback у Element.load(url) или может Event который можно поймать после окончания подгрузки?

А Element здесь это frame или обычный DOM элемент?

Если Element это не frame то можно в класс Element добавить примерно такую функцию:

function Element.loadFx(url,callback)
  {
    function cb(data,status)
    {
      if( data instanceof Stream && status == 200)
        this.load( data );
      else
        this.$content(Load failed, status: {status});
      callback(this); << !!!!
    }
    this.request(cb,#get,url);
  }


Метод callback будет вызван когда данные приедут.

Документ для теста:

<html>
<head>
  <style>
  
    div#update-panel 
    {
      min-height:40px;
      border:1px solid;
    }
    div#update-panel:busy
    {
      background: url(res:activity.gif) no-repeat 50% 50%;
    }
    
  </style>  
  <script type="text/tiscript">
  
  function Element.loadFx(url,callback)
  {
    function cb(data,status)
    {
      if( data instanceof Stream && status == 200)
        this.load( data );
      else
        this.$content(Load failed, status: {status});
      callback(this);
    }
    this.request(cb,#get,url);
  }
  
  $(button#test-ok).onClick = function()
  {
    function whenDone(element) { stdout.println("Done!"); }
    $(div#update-panel).loadFx("http://terrainformatica.com/sciter/main.htm",whenDone);
  }
  $(button#test-failure).onClick = function()
  {
    function whenDone(element) { stdout.println("Done!"); }
    $(div#update-panel).loadFx("http://terrainformatica.com/sciter/non-existent.htm",whenDone);
  }
  
  </script>  
</head>
<body>
  <button #test-ok>Test OK</button>
  <button #test-failure>Test failure</button>
  <div #update-panel></div>
</body>
</html>
Re[2]: Element.load() callback, event?
От: Antik  
Дата: 27.08.10 02:05
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>А Element здесь это frame или обычный DOM элемент?


Обычный DOM элемент. Для фрейма ведь есть Event.DOCUMENT_COMPLETE. Я думал есть нечто подобное для обычного DOM элемента.

CS>Если Element это не frame то можно в класс Element добавить примерно такую функцию:


CS>
CS>function Element.loadFx(url,callback)
CS>  {
CS>    function cb(data,status)
CS>    {
CS>      if( data instanceof Stream && status == 200)
CS>        this.load( data );
CS>      else
CS>        this.$content(Load failed, status: {status});
CS>      callback(this); << !!!!
CS>    }
CS>    this.request(cb,#get,url);
CS>  }
CS>


CS>Метод callback будет вызван когда данные приедут.


Спасибо.

А если усложнить задачу?
Нужно поймать момент когда подгруженный html код закончит атачиться к DOM, то есть до события html кода в DOM`е нет, а после уже есть. Нечто вроде Event.DOCUMENT_COMPLETE только для обычного DOM элемента.

Кстати Event.DOCUMENT_COMPLETE в документации нет. Нашёл событие в примере с pager.
Re[3]: Element.load() callback, event?
От: c-smile Канада http://terrainformatica.com
Дата: 27.08.10 06:39
Оценка:
A>Кстати Event.DOCUMENT_COMPLETE в документации нет. Нашёл событие в примере с pager.

DOCUMENT_COMPLETE генерируется когда приехал последний ресурс запрошенный документом. Генерируется для <html> nodes (во view или frame).

A>А если усложнить задачу?

A>Нужно поймать момент когда подгруженный html код закончит атачиться к DOM, то есть до события html кода в DOM`е нет, а после уже есть. Нечто вроде Event.DOCUMENT_COMPLETE только для обычного DOM элемента.

Пациент, я вас теряю... что-то там с причинно-следственными связями не то...

Короче, вот теб все варианты:

function Element.loadFx(url,cbBeforeDomModification,
                            cbAfterDomModification,
                            cbDomReadyAndScreenUpdated )
{
    function cb(data,status)
    {
      if( data !instanceof Stream || status != 200)
        return;
      cbBeforeDomModification();
      this.load( data );
      cbAfterDomModification();
      view.update();
      cbDomReadyAndScreenUpdated();  
    }
    this.request(cb,#get,url);
}


Вместо
view.update();
cbDomReadyAndScreenUpdated();


можно сделать
this.post(cbDomReady);


Все зависит от того что именно надо...
Re[4]: Element.load() callback, event?
От: Antik  
Дата: 27.08.10 20:37
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>
CS>function Element.loadFx(url,cbBeforeDomModification,
CS>                            cbAfterDomModification,
CS>                            cbDomReadyAndScreenUpdated )
CS>{
CS>    function cb(data,status)
CS>    {
CS>      if( data !instanceof Stream || status != 200)
CS>        return;
CS>      cbBeforeDomModification();
CS>      this.load( data );
CS>      cbAfterDomModification();
CS>      view.update();
CS>      cbDomReadyAndScreenUpdated();  
CS>    }
CS>    this.request(cb,#get,url);
CS>}
CS>


До того как этот код увидел, я думал что load выполняется асинхронно... С чего взял сам уже не знаю.

Спасибо в любом случае.
Re[5]: Element.load() callback, event?
От: c-smile Канада http://terrainformatica.com
Дата: 27.08.10 22:23
Оценка:
Здравствуйте, Antik, Вы писали:

A>До того как этот код увидел, я думал что load выполняется асинхронно... С чего взял сам уже не знаю.


this.load( url:string )

выполняеятся ассинхронно (если url это "http://.....")

А эти вот:
this.load( html:string, url:string ) 
this.load( html:Stream )

выполняются непосредственно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.