Есть HTML-таблица и в ней такая строка:
<tr>
<td #category>
<plaintext>Test 1</plaintext>
</td>
<td #expression>
<plaintext>Test 2</plaintext>
</td>
</tr>
Проблема в следующем. Если я наберу какой-нибудь текст в элементе <plaintext> в окне HTMLayout, он мистическим образом останется
вне DOM. "Мистическим" потому, что введенные значения все-таки можно извлечь через dom::element::get_value(). Однако, через dom::element::get_html() эти значения не увидеть. Кроме того, их нельзя клонировать.
Т.е., если я попытаюсь сделать такое:
dom::element plaintext = m_row.find_first( "#category plaintext" );
CString sValue = plaintext.get_value().to_string();
TRACE( "value: %s\r\n", sValue ); // 1
TRACE( "%s\r\n", m_row.get_html().c_str() ); // 2
То, набрав в первой ячейке "Test A", в первом TRACE я получу "value: Test A", а во втором код:
<tr>
<td id="category" >
<plaintext value="Test 1" ></plaintext>
</td>
<td id="expression" >
<plaintext value="Test 2"></plaintext>
</td></tr>
Т.е., получается как с тем сусликом. Ты его не видишь, а он есть!
Как следствие, если я попытаюсь клонировать строку:
dom::element newRow = m_row.clone();
table.insert( newRow, m_row.index() + 1 );
...в результате получу строку со старым текстом, изначально прописанном в разметке, а не с тем что набрал пользователь.
Пытался вызвать dom::element::update() и для строки, и для plaintext — бесполезно. Единственный вариант — вручную явно перенести все value's из строки-оригинала в строку-клон. Тогда все работает как надо.
Но возникает вопрос — почему так? Почему вводимые пользователем значения не попадают напрямую в DOM, а лежат где-то "вовне"? Как минимум, это выглядит очень странно.
Здравствуйте, Hawk, Вы писали:
H>Есть HTML-таблица и в ней такая строка:
H><tr>
H> <td #category>
H> <plaintext>Test 1</plaintext>
H> </td>
H> <td #expression>
H> <plaintext>Test 2</plaintext>
H> </td>
H></tr>
H>
H>Проблема в следующем. Если я наберу какой-нибудь текст в элементе <plaintext> в окне HTMLayout, он мистическим образом останется вне DOM. "Мистическим" потому, что введенные значения все-таки можно извлечь через dom::element::get_value(). Однако, через dom::element::get_html() эти значения не увидеть. Кроме того, их нельзя клонировать.
Есть DOM элемент. И есть behavior который присоединен к этому самому DOM элементу.
behavior это runtime структура. Создается когда элемент попадет в DOM и получает behavior:something в стилях.
behavior как runtime функциональность отвечает за интерпетацию value сущности.
Каждый behavior знает как инициализировать value и как его отдавать когда попросят.
Например behavior:check использует @checked DOM атрибут при инициализации и устанавливает :checked runtime flag.
А behavior:plaintext использует текст внутри <textarea>...</textarea> для инициализации значения.
Клонирование DOM элементов это клонирование DOM струкутры и атрибутов. runtime flags и behaviors не клонируются. Это стандартное поведение в HTML.
Когда клон попадает в DOM то для него создется новый и независимый behavior котрый инициализируется обычным образом.
Мне лично это представляется логичным. Ибо я не понмаю что такое клон редактора behavior:plaintext. Скажем что должно происходить со стеком undo/redo операций при клонировании?
В принципе в твоем частном случае можно нарисовать generic функцию которая после clone() и insert() скопирует runtime values.
Свисти если будут проблемы с имплементацией.
Здравствуйте, c-smile, Вы писали:
CS>Каждый behavior знает как инициализировать value и как его отдавать когда попросят.
CS>...
CS>Мне лично это представляется логичным. Ибо я не понмаю что такое клон редактора behavior:plaintext. Скажем что должно происходить со стеком undo/redo операций при клонировании?
С точки зрения пользователя, думаю, это не логично. Когда задается value, пользователь ожидает увидеть его в DOM. Сейчас же, если я правильно понял, value хранится где-то в недрах behavior текстового поля.
Может, имеет смысл сделать что-то вроде обратного "отражения" values в DOM? Тогда будет целостность — DOM будет соответствовать внутреннему состоянию behavior. А сейчас, получается, я меняю DOM (атрибут "value" некоторого элемента), пытаюсь увидеть свои изменения в HTML, а их нет. Они сгинули внутри behavior, словно в черной дыре.
Насчет клонирования. Не обязательно клонировать behaviors и их внутренние стуктуры (стек undo/redo и прочее). В данном случае существеннее клонировать values. При клонировании textarea будет создаваться новое и независимое поле редактирования, которое будет отображать клон value оригинального textarea.
Здравствуйте, Hawk, Вы писали:
H>Здравствуйте, c-smile, Вы писали:
CS>>Каждый behavior знает как инициализировать value и как его отдавать когда попросят.
CS>>...
CS>>Мне лично это представляется логичным. Ибо я не понмаю что такое клон редактора behavior:plaintext. Скажем что должно происходить со стеком undo/redo операций при клонировании?
H>С точки зрения пользователя, думаю, это не логично. Когда задается value, пользователь ожидает увидеть его в DOM. Сейчас же, если я правильно понял, value хранится где-то в недрах behavior текстового поля.
Есть @value и есть :value — это разные сущности.
В некоторых случаях :value даже нельзя представить в виде строки — значение DOM атрибута.
H>Может, имеет смысл сделать что-то вроде обратного "отражения" values в DOM? Тогда будет целостность — DOM будет соответствовать внутреннему состоянию behavior. А сейчас, получается, я меняю DOM (атрибут "value" некоторого элемента), пытаюсь увидеть свои изменения в HTML, а их нет. Они сгинули внутри behavior, словно в черной дыре.
1) Обратное отражение как я уже сказал не всегда возможно и
2) В общем случае не нужно и
3) Крайне не эффективно. Например если есть такая рефлексия то в CSS ты можешь написать
input[value="woohoo"] { color:red; }
что будет вызывать перерасчет некоего набора стилей на каждый введенный char. Т.е. в общем случае при любом изменении в поле ввода надо пересчитывать все стили. Мало не покажется.
H>Насчет клонирования. Не обязательно клонировать behaviors и их внутренние стуктуры (стек undo/redo и прочее). В данном случае существеннее клонировать values. При клонировании textarea будет создаваться новое и независимое поле редактирования, которое будет отображать клон value оригинального textarea.
А зачем это надо в общем случае? Есть внятные причины зачем это нужно?
И вообще в Sciter твой Element.cloneEx() пишется с полпинка. Это так, на всякий случай.