Текст, введенный в <plaintext>, не клонируется
От: Hawk Россия  
Дата: 07.11.10 16:45
Оценка:
Есть 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, а лежат где-то "вовне"? Как минимум, это выглядит очень странно.
Re: Текст, введенный в <plaintext>, не клонируется
От: c-smile Канада http://terrainformatica.com
Дата: 07.11.10 18:17
Оценка: 6 (1)
Здравствуйте, 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.
Свисти если будут проблемы с имплементацией.
Re[2]: Текст, введенный в <plaintext>, не клонируется
От: Hawk Россия  
Дата: 07.11.10 21:35
Оценка:
Здравствуйте, 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.
Re[3]: Текст, введенный в <plaintext>, не клонируется
От: c-smile Канада http://terrainformatica.com
Дата: 07.11.10 22:18
Оценка: 4 (1)
Здравствуйте, 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() пишется с полпинка. Это так, на всякий случай.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.