Есть ли способ отловить момент, когда все обозначенные Behavior приатачились к документу в sciter?
Задача стоит так: нужно загрузить через view.load() документ, дождаться момента когда все Behavior будут готовы для манипуляций и выполнить манипуляцию используя API одного из Behavior. Манипуляцию выполняет код, а не юзер.
Проблема в последнем шаге. Не знаю как отловить момент готовности всех Behavior.
Здравствуйте, Antik, Вы писали:
A>Проблема в последнем шаге. Не знаю как отловить момент готовности всех Behavior.
function self.ready()
{
...
}
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Antik, Вы писали:
A>>Проблема в последнем шаге. Не знаю как отловить момент готовности всех Behavior.
CS>CS>function self.ready()
CS>{
CS> ...
CS>}
CS>
А если подгрузка behavior вызвана Element.load(url)? Элемент в данном случае не фрейм, а простой элемент. То есть, когда html код пришёл, бехавиоры начинают атачиться, а вот понять когда они закончили атачиться непонятно как.
Event.DOCUMENT_COMPLETE в данном случае не подходит, так как такой же евент возникает, когда подгружается по url картинка на hover state элемента при наведении мышкой, в случаях когда background-image на обычное состояние элемента и на hover state разная.
Здравствуйте, Antik, Вы писали:
Строго говоря момент назначения behaviors не определен по определению.
Вернее так: behaviors назначаются/определяются в момент style resolution. А style resolution осуществляется когда мне нужно например сделать measure, т.е. расчитать layout или скажем определить visibility элемента.
Таким образом если тебе нужно обращаться к методам описанным в behavior элемента который загружается асинхронно или динамически то ты можешь сделать скажем следующее:
var el = $(someselector);
el.style#display; // retrieving "display" CSS property - forces style to be resolved.
el.someMethod(); // calling some method of the behavior ...
В принципе ты также можешь себе нарисовать скажем такую вот чудную property:
`property Element.x(v)
{
this.style#display;
return this;
}`
и использовать её так:
var el = $(someselector);
el.x.someMethod(); // calling some method of the behavior ...
Т.е. этот x работает proxy позволяющий "надежно" обращаться к методам behavior.
Можно также нарисовать функцию которая рекурсивно обойдет sub-tree и зарезолвит стили... Но это так... не сильно кузяво.
Здравствуйте, c-smile, Вы писали:
CS>Можно также нарисовать функцию которая рекурсивно обойдет sub-tree и зарезолвит стили... Но это так... не сильно кузяво.
Спасибо.
function Element.loadStyle() {
this.style#display;
for (var n = 0; n < this.length; ++n){
this[n].loadStyle()
}
}
Хоть и не кузяво, но в некоторых ситуациях лучшее решение. Зачем резолвить стили каждого элемента отдельно, если в sub-tree почти все элементы с behavior.
Здравствуйте, Antik, Вы писали:
Тогда уже так:
function Element.loadStyle()
{
this.style#display;
for (var el in this) el.loadStyle();
}
Здравствуйте, c-smile, Вы писали:
CS>CS>function Element.loadStyle()
CS>{
CS> this.style#display;
CS> for (var el in this) el.loadStyle();
CS>}
CS>
Пробывал так, как вы указываете. Спотыкается вот на этом:
<div id="new_btn" class="start_btn"> </div>
Dump: <div#new_btn.start_btn>
Dump: <text>
Dump: а
Error: String (String("а")) has no method — loadStyle
А указанный мною код выше проходит по дереву нормально:
Dump: <div#new_btn.start_btn>
Dump: <text>
Dump: <div.title>
Dump: <text>