@@ -38,6 +38,7 @@ ko.bindingHandlers.liveEdit = {
38
38
init ( element , valueAccessor , allBindings , viewModel , bindingContext ) {
39
39
const { field, placeholder, selectAll = false } = valueAccessor ( ) ;
40
40
let focusedValue = element . innerHTML ;
41
+
41
42
/**
42
43
* Strip HTML and return text
43
44
*
@@ -58,20 +59,13 @@ ko.bindingHandlers.liveEdit = {
58
59
focusedValue = stripHtml ( element . innerHTML ) ;
59
60
60
61
if ( selectAll && element . innerHTML !== "" ) {
61
- const selection = window . getSelection ( ) ;
62
- const range = document . createRange ( ) ;
63
- range . selectNodeContents ( element ) ;
64
- selection . removeAllRanges ( ) ;
65
- selection . addRange ( range ) ;
66
- }
67
- } ;
68
-
69
- /**
70
- * Blur event on element
71
- */
72
- const onBlur = ( ) => {
73
- if ( focusedValue !== stripHtml ( element . innerHTML ) ) {
74
- viewModel . updateData ( field , stripHtml ( element . innerHTML ) ) ;
62
+ _ . defer ( ( ) => {
63
+ const selection = window . getSelection ( ) ;
64
+ const range = document . createRange ( ) ;
65
+ range . selectNodeContents ( element ) ;
66
+ selection . removeAllRanges ( ) ;
67
+ selection . addRange ( range ) ;
68
+ } ) ;
75
69
}
76
70
} ;
77
71
@@ -91,7 +85,7 @@ ko.bindingHandlers.liveEdit = {
91
85
*
92
86
* @param {any } event
93
87
*/
94
- const onKeyDown = ( event : any ) => {
88
+ const onKeyDown = ( event : JQueryEventObject ) => {
95
89
const key = keyCodes [ event . keyCode ] ;
96
90
97
91
// command or control
@@ -107,7 +101,14 @@ ko.bindingHandlers.liveEdit = {
107
101
if ( key === "pageLeftKey" || key === "pageRightKey" ) {
108
102
event . stopPropagation ( ) ;
109
103
}
104
+ } ;
110
105
106
+ /**
107
+ * On key up update the view model to ensure all changes are saved
108
+ *
109
+ * @param {Event } event
110
+ */
111
+ const onKeyUp = ( ) => {
111
112
if ( focusedValue !== stripHtml ( element . innerHTML ) ) {
112
113
viewModel . updateData ( field , stripHtml ( element . innerHTML ) ) ;
113
114
}
@@ -128,13 +129,14 @@ ko.bindingHandlers.liveEdit = {
128
129
const onInput = ( ) => {
129
130
handlePlaceholderClass ( element ) ;
130
131
} ;
132
+
131
133
element . setAttribute ( "data-placeholder" , placeholder ) ;
132
134
element . textContent = viewModel . parent . dataStore . get ( field ) ;
133
135
element . contentEditable = true ;
134
136
element . addEventListener ( "focus" , onFocus ) ;
135
- element . addEventListener ( "blur" , onBlur ) ;
136
137
element . addEventListener ( "mousedown" , onMouseDown ) ;
137
138
element . addEventListener ( "keydown" , onKeyDown ) ;
139
+ element . addEventListener ( "keyup" , onKeyUp ) ;
138
140
element . addEventListener ( "input" , onInput ) ;
139
141
element . addEventListener ( "drop" , onDrop ) ;
140
142
0 commit comments