Здравствуйте, DmitryScaletta, Вы писали:
DS>А как дальше с результатом работать?
// по шагам
json::value v = result.get_item(L"key"); // в общем случае
json::string s = v.get(L""); // L"" - значение по-умолчанию
// если value константный, value[] возвращает так же value, у которого можно звать его методы
json::string s = result[L"key"].get(L"");
// если не константный, то value[] возвращает прокси value_idx или value_key, которые используются для записи:
result[L"key2"] = json::value(42);
DS>Документацию нигде не могу найти.
Документация — методы json::value в value.hpp.
Re: Повесить обработчик событий onClick на элемент
Здравствуйте, DmitryScaletta, Вы писали:
DS>Как мне на "my_div" повесить обработчик событий onClick?
Приаттачиться к my_div или его предку и обрабатывать HANDLE_BEHAVIOR_EVENT (event_handler::handle_event) с BUTTON_CLICK. Это если в С++.
Re: Повесить обработчик событий onClick на элемент
Здравствуйте, DmitryScaletta, Вы писали:
DS>Как мне на "my_div" повесить обработчик событий onClick?
Все DOM событиия всплывают по цепочке контейнеров к окну поэтому если у тебя окно отнаследовано от sciter::event_handler то все DOM events туда приходят.
Поэтому ты можешь написать нечто типа:
Но вообще-то ведущие собаководы рекомендуют более высокоуровневый UI/backend обмен, т.е. event handlers находятся и обрабатываются в скрипте
и вызывают native functions по результатам обработки:
Смысл такой организации в том что дизайнер может поменять markup поэтому вшивать в native код селекторы можно лишь в том случае если ты сам и дизайнер и программер.
Со скриптом DOM structure refactoring проще.
Re[3]: Повесить обработчик событий onClick на элемент
Здравствуйте, DmitryScaletta, Вы писали:
DS>Как в процессе работы программы можно менять эти условия?
Если я правильно понял мысль ...
Есть такая функция eval(text, globals). С её помощью можно интерпретировать скрипты. Например так:
<html>
<head>
<script type="text/tiscript">
var formItems = {};
function self.ready()
{
var form = $(form);
var rule = $(textarea#rule);
// formItems is a name/element collection
for( var el in form.$$(button,input,select) )
{
var name = el.attributes["name"];
formItems[symbol(name)] = el;
}
form.on("change", function() {
eval( rule.value, formItems ); // passing formItems as global items
});
}
</script>
</head>
<body>
<p>Form</p>
<form>
<button|checkbox name="checkbox1">checkbox1</button>
<button|checkbox name="checkbox2">checkbox2</button>
<button|checkbox name="checkbox3">checkbox3</button>
</form>
<p>Rule</p>
<textarea #rule>
if (checkbox1.value && checkbox2.value)
checkbox3.state.disabled = false;
else
checkbox3.state.disabled = true;
</textarea>
<p>Form value</p>
<pre#out></pre>
</body>
</html>
Обрати внимание что правила берутся из textarea, т.е. могут меняться на ходу.
Можно также текст из textarea#rule компилировать в функцию и уже её вызывать вместо eval.
Так имеет смысл делать если правило меняется редко а его интерпретация — часто.
Re[5]: Повесить обработчик событий onClick на элемент
Здравствуйте, DmitryScaletta, Вы писали:
DS>c-smile,
DS>Т.е. можно сделать невидимую textarea, программно изменять в ней текст скрипта, и он будет выполняться?
Зачем обязательно textarea для этого? Переменную заведи и функцию.
<script type="text/tiscript">
var formItems = {};
var rules = "";
function self.ready()
{
var form = $(form);
// formItems is a name/element collection
for( var el in form.$$(button,input,select) )
{
var name = el.attributes["name"];
formItems[symbol(name)] = el;
}
form.on("change", function() {
if( rules )
eval( rules, formItems ); // passing formItems as global items
});
}
function setRules(text) {
rules = text;
}
</script>
var checkbox1 = $(button[name=checkbox1]);
var checkbox2 = $(button[name=checkbox2]);
var checkbox3 = $(button[name=checkbox3]);
checkbox3.state.disabled = true;
$(form).subscribe("change", function() {
if (checkbox1.state.checked && checkbox2.state.checked)
checkbox3.state.disabled = false;
else
checkbox3.state.disabled = true;
// if (checkbox4) ...
$(pre#out).text = String.printf("%V",this.value).replace("\t"," ");
});
В процессе работы программы форма будет меняться, т.е. могут добавляться и (или) удаляться некоторые элементы (checkbox, radio, select и т.д.).
Условия, по которым некоторые элементы мне нужно будет делать выключенными (disabled) тоже будут меняться.
Если бы все условия были известны, я бы их просто добавил в скрипт.
Как в процессе работы программы можно менять эти условия?
Re[4]: Повесить обработчик событий onClick на элемент
Насколько я понял, первым параметром передается код, а вторым — массив элементов, которые будут глобальными для кода, который передан первым параметром.
Re[11]: Повесить обработчик событий onClick на элемент
Здравствуйте, c-smile, Вы писали: CS>Здравствуйте, DmitryScaletta, Вы писали: DS>>Как мне на "my_div" повесить обработчик событий onClick? CS>Все DOM событиия всплывают по цепочке контейнеров к окну поэтому если у тебя окно отнаследовано от sciter::event_handler то все DOM events туда приходят. CS>Поэтому ты можешь написать нечто типа: CS>
DS>Нажимаю на кнопку button#message.
DS>Метод вызывается 2 раза.
DS>Первый раз значение type — 32769, второй — 65537 DS>А BUTTON_CLICK = 0
Поменяй
return true;
на это
return false; // event not handled
и будет тебе шастя.
В твоем коде ты получаешь событие (BUTTON_CLICK | SINKING) и возвращаешь true что значит "consumed".
Engine честно выполняет твое пожелание поэтому дальше это событие уже идет под кодом (BUTTON_CLICK | HANDLED) что ты и наблюдаешь.