ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ:
Π‘ΠΊΠ»ΠΎΠ½ΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΡΠΊΡΠΎΠΉΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡ Π² VS Code.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ quart
: pip install -U quart
.
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΠ²Π΅Ρ -- python3.7 server1.py
-- ΠΈ Π±ΡΠ°ΡΠ·Π΅Ρ -- http://localhost:5000
. ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΡΠΎΠΊ.
Π Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΎΡΠΊΡΠΎΠΉΡΠ΅ "ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°", Π² Π½ΠΈΡ Π½Π°ΠΉΠ΄ΠΈΡΠ΅ JS-ΠΊΠΎΠ½ΡΠΎΠ»Ρ. Π’Π°ΠΌ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ "ΠΠ°ΡΠ°Π»ΠΈ ΡΠ°Π±ΠΎΡΡ!".
ΠΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
ΠΊΠΎΠ΄ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ½ΠΎΠΉ ΡΠ°ΡΡΠΈ server1.py
ΠΈ ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
ΠΊΠΎΠ΄ΠΎΠΌ ΡΡΡΠ°Π½ΠΈΡΡ templates/p_1_start.html
.
Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΡΠ΅, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ²ΡΠ·ΠΊΠ° Π²Π΅Π±-ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°.
Π‘Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ Π² templates/p_1_start.html
.
ΠΠ°Π»Π΅Π΅, Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π²Π·Π°ΠΌΠ΅Π½ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° -- Π²ΡΠΎΡΠΎΠΉ (server2.py
). ΠΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.
ΠΠ·ΡΡΠΈΡΠ΅ ΠΎΡΠ»ΠΈΡΠΈΡ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π²Π·Π°ΠΌΠ΅Π½ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ° -- ΡΡΠ΅ΡΠΈΠΉ (server3.py
). ΠΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠΌΠΈ Π² ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.
ΠΠ·ΡΡΠΈΡΠ΅ ΠΎΡΠ»ΠΈΡΠΈΡ Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ.
Π‘Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ Π² server3.py
.
ΠΠ°ΠΆΠ½ΠΎ: Π²ΡΠΎΡΠΎΠΉ ΡΠ°Π³ ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠ³ΠΎ Π² server3.py
ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ.
ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ΅ΡΠ²Π΅Ρ -- python3.7 server3.py
-- ΠΈ Π±ΡΠ°ΡΠ·Π΅Ρ -- http://localhost:5000
. ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π²ΠΎ Π²ΡΠΎΡΠΎΠΉ ΡΡΠΎΠΊ.
Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΌΠΎΠ½ΠΎΡΠΎΠ½Π½ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ: ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΌΠ΅Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠ°Π·ΠΎΠ±ΡΠ°Π½Π½ΡΡ Π½Π° Π·Π°Π½ΡΡΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Ρ ΡΡΠ΅ΡΡΠΈΠΊΠ°.
Π‘Π»Π΅Π΄ΡΠΉΡΠ΅ ΡΠΊΠ°Π·Π°Π½ΠΈΡΠΌ Π² templates/p_2_inc_counter.html
.
ΠΡΠΎ Π²Π°ΡΠ΅ Π΄ΠΎΠΌΠ°ΡΠ½Π΅Π΅ Π·Π°Π΄Π°Π½ΠΈΠ΅.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π΄ΠΎΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΠΊΠ»Π°ΡΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ Π΄ΠΎΠ²Π΅Π΄ΠΈΡΠ΅ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΡΠ΅ΡΡΠΈΠΊ Π΄ΠΎ ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ.
ΠΠΎ-Π²ΡΠΎΡΡΡ , Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ°.
ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΡ ΠΈΠ· templates/p_2_inc_counter.html
:
- Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ -- ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΡΠΈΠΊΠ°;
- Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΡΡΠΎΠ²ΡΠΉ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π΄Π»Ρ Π½Π°ΠΆΠ°ΡΠΈΡ Π΄Π²ΡΡ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΏΠΎΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
ΠΠ°ΠΆΠ½ΠΎ: ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ server4.py
, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π²ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΡ ΡΠ°Π½Π΅Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ.
ΠΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° -- ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΡΡΠ΅ΡΠ° ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠ°Π²ΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΡ ΠΎΠ΄Π½Ρ ΡΡΡΠΎΠΊΡ Π² Π΄ΡΡΠ³ΡΡ. ΠΡΠ°Π²ΠΊΠ° -- ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π²ΡΡΠ°Π²ΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π°, ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ Π·Π°ΠΌΠ΅Π½Ρ ΡΠΈΠΌΠ²ΠΎΠ»Π°.
Π§ΡΠΎΠ±Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°ΡΡΠ΅ΡΠ° ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠ°Π²ΠΎΠΊ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠ°ΡΡΠ΅ΡΠ° ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΠ΅Π²Π΅Π½ΡΡΠ΅ΠΉΠ½Π° ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² Π½Π΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΡΠΉ Ρ ΠΎΠ΄, ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡΡΠΈΠΉ ΠΏΡΠ°Π²ΠΊΠΈ.
Π‘ΠΈΠ³Π½Π°ΡΡΡΠ° ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ°ΠΊΠ°Ρ:
function editList(left, right);
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ Π² ΡΠ°ΠΉΠ»Π΅ templates/j_editlist.js
.
ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π° ΡΠ°Π³Π΅ 6.
ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ -- ΡΠΌ. Π² templates/p_4_editlist.html
.
NB: ΠΡΠ»ΠΈ Π²Ρ ΡΠ°Π±ΠΎΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π±Π΅Π· Π»Π΅ΠΊΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°, ΡΠΎ Π΄Π»Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π²Π°ΠΌ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ ΡΡΠ°ΡΡΠΈ ΠΏΠΎ TreeDoc ΠΈ LSEQ.
ΠΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° -- ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ, ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΈ Π·Π°ΠΌΠ΅Π½Ρ, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π²Π½ΡΡΡΠΈ. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡΡΡ Π² ΠΏΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ² D1 ΠΈ D2: D1 -- ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠ°Ρ (ΠΏΠΎΠ·ΠΈΡΠΈΡ, ΡΠΈΠΌΠ²ΠΎΠ»), D2 -- ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΠΉ.
Π‘ΠΈΠ³Π½Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΡΠ°ΠΊΠΈΠ΅:
function public_newDocument() {}
function public_getContent(document) {}
function public_serializeState(document) {} // ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ»ΠΎΠΆΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΎ 7-Π³ΠΎ ΡΠ°Π³Π°
function public_mergeWithSerializedState(document, serializedState) {} // ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ»ΠΎΠΆΠΈΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄ΠΎ 7-Π³ΠΎ ΡΠ°Π³Π°
function public_insertAfter(document, index, symbol) {} // ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π°, Π½Π΅ ΡΡΠΎΠ³Π°ΡΡ
function public_remove(document, index) {} // ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π°, Π½Π΅ ΡΡΠΎΠ³Π°ΡΡ
function public_replace(document, index, symbol) {} // ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π°, Π½Π΅ ΡΡΠΎΠ³Π°ΡΡ
function _getPositionByIndex(document, index) {}
function _allocate(document, begin, end) {}
function _allocateLeft(document, begin, end) {}
function _allocateRight(document, begin, end) {}
function _applyInsert(document, position, symbol) {}
function _applyRemove(document, position) {}
ΠΡΡ
ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ Π² ΡΠ°ΠΉΠ»Π΅ templates/j_treedoc.js
.
ΠΡΠΎ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π° ΡΠ°Π³Π΅ 6.
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ -- Π² templates/p_5_treedoc.html
.
Π¨Π°Π³ ΡΠ΅ΡΡΠΎΠΉ: ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΈ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°
ΠΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° -- ΡΠΎΡΡΡΠΊΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ ΠΈΠ· ΡΠ΅ΡΠ²Π΅ΡΡΠΎΠ³ΠΎ ΠΈ ΠΏΡΡΠΎΠ³ΠΎ ΡΠ°Π³ΠΎΠ².
Π Π·Π°Π³ΠΎΡΠΎΠ²ΠΊΠ΅ Π²Π°Ρ ΠΆΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ. ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ
Π² Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΡΠΊΡΠ°Π½Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ editList
ΠΈΠ· templates/j_editlist.js
ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠ°Π²ΠΎΠΊ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ ΠΌΠΎΠ΄Π΅Π»ΠΈ (ΠΏΡΠ°Π²Π°Ρ ΡΠ°ΡΡΡ ΡΠΊΡΠ°Π½Π°)
ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΌ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΡΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ (Π»Π΅Π²Π°Ρ ΡΠ°ΡΡΡ ΡΠΊΡΠ°Π½Π°).
ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π»ΠΎΠ³ΠΈΠΊΡ Π·Π° ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ "ΠΠ΅ΡΠ΅Π½Π΅ΡΡΠΈ Π² ΠΌΠΎΠ΄Π΅Π»Ρ", ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΊ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΡΡΠΎΠΊΠ΅, ΡΡΠΎ ΠΈ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΠΏΠΎΠ»Π΅.
Π£ΠΊΠ°Π·Π°Π½ΠΈΡ ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ -- ΡΠΌ. Π² templates/p_6_textarea.html
.
NB: ΠΡΠ»ΠΈ Π²Ρ ΡΠ°Π±ΠΎΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ, Π±Π΅Π· Π»Π΅ΠΊΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π°, ΡΠΎ Π΄Π»Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ Π²Π°ΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π΅Π½Π° ΡΡΠ°ΡΡΡ CRATE: Writing Stories Together with our Browsers.
ΠΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° -- Π²Π·ΡΡΡ Π½Π°ΡΠ°Π±ΠΎΡΠΊΠΈ Ρ ΡΠ΅ΡΡΠΎΠ³ΠΎ ΡΠ°Π³Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ»ΠΊΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
Π‘ΡΠ°ΡΡΠΎΠ²ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΡ -- ΡΠΌ. templates/p_7_integration.html
.
ΠΠΎΠ΄ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ·Π°ΠΈΠΌΡΡΠ²ΠΎΠ²Π°ΡΡ ΠΈΠ· ΠΏΠ΅ΡΠ²ΡΡ ΡΡΠ΅Ρ ΡΠ°Π³ΠΎΠ². ΠΠΎΠ΄ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ -- ΠΈΠ· ΡΠ΅ΡΡΠΎΠ³ΠΎ.
ΠΡΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
NB: ΠΡΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠ΅ΡΠΈ ΡΠΏΠ΅ΡΠ²Π° Π²ΡΠ΅Π³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΈ ΠΌΠΎΠ΄Π΅Π»Ρ, ΠΈ Π»ΠΈΡΡ Π·Π°ΡΠ΅ΠΌ -- ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΏΡΠΈΡΠ΅Π΄ΡΠΈΠ΅ ΠΏΠΎ ΡΠ΅ΡΠΈ.
Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΡΡΠ³Π°ΡΡΠ΅Π³ΠΎ ΠΊΡΡΡΠΎΡΠ° ΠΏΡΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, Π² j_treedoc.js
ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ:
function _getIndexByPosition(document, position) {
// ΠΠ΅ΡΠ½ΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ.
// Π’ΠΎ Π΅ΡΡΡ Π²Π΅ΡΠ½ΡΡΡ ΡΠΈΡΠ»ΠΎ Π½Π΅ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ
ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ.
}
Π’Π΅ΡΡΡ Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
function testPositionSync() {
let d = public_newDocument();
public_insertAfter(d, -1, "c");
public_insertAfter(d, 0, "a");
public_insertAfter(d, 1, "t");
assertEquals(public_getContent(d), "cat");
for (var i = -1; i <= 3; ++i) {
assertEquals(i, _getIndexByPosition(d, _getPositionByIndex(d, i)));
}
}
function testPositionSyncWithInsertions() {
let d = public_newDocument();
public_insertAfter(d, -1, "a");
var p = _getPositionByIndex(d, 0);
assertEquals(public_getContent(d), "a");
assertEquals(0, _getIndexByPosition(d, p));
public_insertAfter(d, -1, "b");
assertEquals(public_getContent(d), "ba");
assertEquals(1, _getIndexByPosition(d, p));
public_insertAfter(d, -1, "c");
assertEquals(public_getContent(d), "cba");
assertEquals(2, _getIndexByPosition(d, p));
}
function testPositionSyncWithDeletions() {
let d = public_newDocument();
public_insertAfter(d, -1, "c");
public_insertAfter(d, 0, "a");
public_insertAfter(d, 1, "t");
var p = _getPositionByIndex(d, 2);
assertEquals(public_getContent(d), "cat");
assertEquals(2, _getIndexByPosition(d, p));
public_remove(d, 0);
assertEquals(public_getContent(d), "at");
assertEquals(1, _getIndexByPosition(d, p));
public_remove(d, 0);
assertEquals(public_getContent(d), "t");
assertEquals(0, _getIndexByPosition(d, p));
}
ΠΠΎ-Π²ΡΠΎΡΡΡ , ΡΠ»ΡΡΡΠΈΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ ΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΡ.
Π Π°Π±ΠΎΡΠ° Ρ ΠΊΡΡΡΠΎΡΠΎΠΌ ΡΡΡΠΎΠΈΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°Π±ΠΎΡΡ Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΡΡ -- selection range. ΠΡΠΎ ΠΏΠ°ΡΠ° ΡΠΈΡΠ΅Π», ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΠΈΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ°. ΠΡΠ»ΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΡΡΡΠΎΠΉ, ΡΠΎ Π΅ΡΡΡ Π»Π΅Π²Π°Ρ ΠΈ ΠΏΡΠ°Π²Π°Ρ Π³ΡΠ°Π½ΠΈΡΡ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ, ΡΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ ΡΠΎΡΠΊΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΡΡΡΠΎΡΠ°.
ΠΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ Π½Π° ΡΡΠ°ΠΏΠ΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
var start = $("#integration-textarea").prop("selectionStart");
var end = $("#integration-textarea").prop("selectionEnd");
console.log("ΠΡΡΡΠΎΡ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡ Π² ΠΏΠΎΠ·ΠΈΡΠΈΠΈ (" + start + ", " + end + ")");
ΠΠ»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
$("#integration-textarea").get()[0].setSelectionRange(start, end);
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ Π·Π°Π΄Π°ΡΡ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΡΡΡΠΎΡΠ°, ΠΊΠΎΠ΄ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π½ΡΠΆΠ½ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ:
var startIndex = $("#integration-textarea").prop("selectionStart");
var startPosition = _getPositionByIndex(document, startIndex);
var endIndex = $("#integration-textarea").prop("selectionEnd");
var endPosition = _getPositionByIndex(document, endIndex);
// Π·Π΄Π΅ΡΡ ΠΊΠΎΠ΄ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ
startIndex = _getIndexByPosition(startPosition);
endIndex = _getIndexByPosition(endPosition);
$("#integration-textarea").get()[0].setSelectionRange(startIndex, endIndex);
Π editList
ΠΏΡΠΈ ΡΠ°ΡΡΠ΅ΡΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΠ°Π²ΠΎΠΊ ΠΌΡ ΠΈΡΠ΅ΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΏΠΎ Π΄Π»ΠΈΠ½Π΅ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠ°Π²ΠΎΠΊ.
Π‘Π°ΠΌΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΡ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ. Π’Π°ΠΊΠΆΠ΅ ΡΡΡΠΎΠΊΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ ΠΊΠ°ΠΊ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ
Π² ΡΡΠ½ΠΊΡΠΈΡ editList
ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ : ΠΌΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌ ΠΏΡΠ°Π²ΠΊΠΈ, Π²Π½Π΅ΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ,
ΠΈ ΡΠ΅Π»ΠΎΠ²Π΅ΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠ°Π²ΠΊΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅.
ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ editList(left, right)
ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΠ²ΡΠΈΡΡΠΈΠΊΡ:
ΠΎΡΠΊΡΡΠΈΠΌ Ρ left
ΠΈ right
ΠΎΠ±ΡΠΈΠΉ ΠΏΡΠ΅ΡΠΈΠΊΡ, Π΄Π°Π»Π΅Π΅ ΠΎΡΠΊΡΡΠΈΠΌ Ρ left
ΠΈ right
ΠΎΠ±ΡΠΈΠΉ ΡΡΡΡΠΈΠΊΡ,
ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ -- Π΄Π»Ρ Π΄Π²ΡΡ
ΠΎΡΡΠ°Π²ΡΠΈΡ
ΡΡ ΡΠ΅ΡΠ΅Π΄ΠΈΠ½ ΡΡΡΠΎΠΊ -- ΠΏΠΎΡΡΠΈΡΠ°Π΅ΠΌ editList
(Π½Π΅ Π·Π°Π±ΡΠ² ΡΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΡ).
** 1: ΠΡΡ
ΠΎΠ΄Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ
left = "hello, dolly"
right = "hello dolly"
** 2: ΠΡΠΊΡΡΡΠ²Π°Π΅ΠΌ ΠΏΡΠ΅ΡΠΈΠΊΡ
p = "hello"
left = ", dolly"
right = " dolly"
** 3: ΠΡΠΊΡΡΡΠ²Π°Π΅ΠΌ ΡΡΡΡΠΈΠΊΡ
p = "hello"
s = " dolly"
left = ","
right = ""
ΠΠ°Π»Π΅Π΅ ΡΡΠΈΡΠ°Π΅ΠΌ editList(left, right); ΠΈΠ½Π΄Π΅ΠΊΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠ΅ΠΌ Π½Π° Π΄Π»ΠΈΠ½Ρ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΡΠ΅ΡΠΈΠΊΡΠ°.
ΠΠ°ΠΊ ΠΈΠ·ΠΌΠ΅ΡΠΈΡΡ Π²ΡΠ³ΠΎΠ΄Ρ ΠΎΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ?
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π² ΠΊΠΎΠ΄ ΡΡΡΠ°Π½ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°Π±ΠΎΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ:
function bench(name, fn) {
var begin = new Date();
var result = fn();
var end = new Date();
console.log("[bench] Π€ΡΠ°Π³ΠΌΠ΅Π½Ρ " + name + " Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ " + (end - begin) + "ΠΌΡ");
return result;
}
// ΠΠ°Π»Π΅Π΅ ΠΏΠΎ ΠΊΠΎΠ΄Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
// ΠΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ·ΡΠΊΠΎΠ²ΠΎΠ΅ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅:
//
// () => expr;
//
// ΠΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ:
//
// function() { return expr; }
//
// Π’ΠΎΠ³Π΄Π°:
// ΠΡΠ»ΠΎ:
var diff = editList(left, right);
// Π‘ΡΠ°Π»ΠΎ:
var diff = bench("editList-1", () => editList(left, right));
// ΠΡΠ»ΠΎ:
$(...).val(public_getContent(d));
// Π‘ΡΠ°Π»ΠΎ ΡΠ°ΠΊ:
bench("render", () => $(...).val(public_getContent(d)));
// ΠΠ»ΠΈ ΡΠ°ΠΊ:
$(...).val(bench("render", () => public_getContent(d)));
Π‘Π΅ΠΉΡΠ°Ρ ΠΏΡΠΈ ΠΎΠ±ΡΠ΅Π½ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΌΠΎΠΌ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΎΠ².
ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠ΄Π΅Π»Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° -- Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π°ΠΌΠΈ D1 ΠΈ D2 -- ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° D1 ΠΈ D2 ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ.
ΠΠ° ΡΡΠ΅Ρ ΡΡΠΎΠ³ΠΎ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΌΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠ»Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠ²ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π² D1 ΠΈ D2.
Π‘Π΅ΠΉΡΠ°Ρ ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ, ΠΌΠΎΠ΄Π΅Π»ΡΡ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»Ρ.
ΠΠΎΠΆΠ½ΠΎ ΡΡΡΡ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠ°ΡΡΠΎΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, Π΄Π΅Π»Π°Ρ Π΅Ρ Π½Π΅ ΡΠ°ΡΠ΅, ΡΠ΅ΠΌ ΡΠ°Π· Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ throttle
ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ lodash.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ: ΡΠΊΠ°ΡΠ°ΠΉΡΠ΅ ΠΈΠ· ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΡΠ°ΠΉΠ» static/js/lodash.min.js
,
Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π² p_7_integration.html
ΡΡΡΠΎΠΊΡ <script src="/static/js/lodash.min.js" crossorigin="anonymous"></script>
ΡΡΠ΄ΠΎΠΌ Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠΌΠΈ ΠΏΡΠΎ jquery
, popper
.
ΠΠΎ-Π²ΡΠΎΡΡΡ , ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΡΠΉΡΠ΅ Π²Π°Ρ ΠΊΠΎΠ΄ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
// ΠΡΠ»ΠΎ:
$("#integration-textarea").on("input", function() {
// ... ΡΠ°Π·-Π΄Π²Π°-ΡΡΠΈ ...
});
// Π‘ΡΠ°Π»ΠΎ:
var onInput = _.throttle(function() {
// ... ΡΠ°Π·-Π΄Π²Π°-ΡΡΠΈ ...
}, /* ΠΡΠ·ΡΠ²Π°ΡΡ Π½Π΅ ΡΠ°ΡΠ΅, ΡΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡΠ΅ */ 100 /* ΠΌΠΈΠ»Π»ΠΈΡΠ΅ΠΊΡΠ½Π΄. */);
$("#integration-textarea").on("input", onInput);
$("#integration-textarea").on("blur", onInput.flush);