diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index 950026a8..88f2ca6d 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -88,16 +88,37 @@ var TextInput = function(parentNode, host) { } } if (useragent.isOldIE) { - event.addListener(text, "propertychange", function(e){ - if (text.value != "" && text.value != PLACEHOLDER) - onInput(e); - }); + var propchangeTimeout; + var propertyChangeCounter = 0; + var onPropertyChange = function(e){ + if (propertyChangeCounter) + return; + var data = text.value; + if (inCompostion || !data || data == PLACEHOLDER) + return; + // can happen either after delete or during insert operation + if (e && data == PLACEHOLDER[0]) { + if (!propchangeTimeout) { + propchangeTimeout = setTimeout(function() { + onPropertyChange(); + propchangeTimeout = null; + }); + } + return; + } + + sendText(data); + propertyChangeCounter++ + resetValue(); + propertyChangeCounter-- + } + event.addListener(text, "propertychange", onPropertyChange); var keytable = { 13:1, 27:1 }; event.addListener(text, "keyup", function (e) { if (inCompostion && (!text.value || keytable[e.keyCode])) setTimeout(onCompositionEnd, 0); - if ((text.value.charCodeAt(0)|0) < 129) { + if ((text.value.charCodeAt(0)||0) < 129) { return; } inCompostion ? onCompositionUpdate() : onCompositionStart(); @@ -147,12 +168,7 @@ var TextInput = function(parentNode, host) { } }; - var onInput = function(e) { - if (inCompostion) - return; - var data = text.value; - resetValue(); - + var sendText = function(data) { if (pasted) { resetSelection(); if (data) @@ -165,16 +181,24 @@ var TextInput = function(parentNode, host) { data = data.substr(2); else if (data[0] == PLACEHOLDER[0]) data = data.substr(1); + else if (data[data.length - 1] == PLACEHOLDER[0]) + data = data.slice(0, -1); + // can happen if undo in textarea isn't stopped + if (data[data.length - 1] == PLACEHOLDER[0]) + data = data.slice(0, -1); - if (data) { - // can happen if undo in textarea isn't stopped - if (data[data.length - 1] == PLACEHOLDER[0]) - data = data.slice(0, -1); - if (data) - host.onTextInput(data); - } + if (data) + host.onTextInput(data); } }; + var onInput = function(e) { + if (inCompostion) + return; + var data = text.value; + resetValue(); + + sendText(data); + }; var onCompositionStart = function(e) { inCompostion = true;