do not change selection of blurred textarea
This commit is contained in:
parent
38a5a522c2
commit
e5b307d056
1 changed files with 60 additions and 57 deletions
|
|
@ -64,17 +64,69 @@ var TextInput = function(parentNode, host) {
|
|||
var inCompostion = false;
|
||||
var tempStyle = '';
|
||||
var isSelectionEmpty = true;
|
||||
|
||||
// FOCUS
|
||||
var isFocused = document.activeElement === text;
|
||||
event.addListener(text, "blur", function() {
|
||||
host.onBlur();
|
||||
isFocused = false;
|
||||
});
|
||||
event.addListener(text, "focus", function() {
|
||||
isFocused = true;
|
||||
host.onFocus();
|
||||
resetSelection();
|
||||
});
|
||||
this.focus = function() {
|
||||
text.focus();
|
||||
};
|
||||
this.blur = function() {
|
||||
text.blur();
|
||||
};
|
||||
this.isFocused = function() {
|
||||
return isFocused;
|
||||
};
|
||||
|
||||
// modifying selection of blured textarea can focus it (chrome mac/linux)
|
||||
var syncSelection = lang.delayedCall(function() {
|
||||
resetSelection(isSelectionEmpty);
|
||||
isFocused && resetSelection(isSelectionEmpty);
|
||||
});
|
||||
var syncValue = lang.delayedCall(function() {
|
||||
if (!inCompostion) {
|
||||
text.value = PLACEHOLDER;
|
||||
resetSelection();
|
||||
text.value = PLACEHOLDER;
|
||||
isFocused && resetSelection();
|
||||
}
|
||||
});
|
||||
|
||||
function resetSelection(isEmpty) {
|
||||
if (inCompostion)
|
||||
return;
|
||||
var selectionStart = isEmpty ? 2 : 1;
|
||||
var selectionEnd = 2;
|
||||
// on firefox this throws if textarea is hidden
|
||||
try {
|
||||
text.setSelectionRange(selectionStart, selectionEnd);
|
||||
} catch(e){}
|
||||
};
|
||||
|
||||
function resetValue() {
|
||||
if (inCompostion)
|
||||
return;
|
||||
text.value = PLACEHOLDER;
|
||||
//http://code.google.com/p/chromium/issues/detail?id=76516
|
||||
if (useragent.isWebKit)
|
||||
syncValue.schedule();
|
||||
};
|
||||
|
||||
useragent.isWebKit || host.addEventListener('changeSelection', function() {
|
||||
if (host.selection.isEmpty() != isSelectionEmpty) {
|
||||
isSelectionEmpty = !isSelectionEmpty;
|
||||
syncSelection.schedule();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
resetValue();
|
||||
if (isFocused())
|
||||
if (isFocused)
|
||||
host.onFocus();
|
||||
|
||||
|
||||
|
|
@ -129,26 +181,6 @@ var TextInput = function(parentNode, host) {
|
|||
});
|
||||
}
|
||||
|
||||
function resetValue() {
|
||||
if (inCompostion)
|
||||
return;
|
||||
text.value = PLACEHOLDER;
|
||||
//http://code.google.com/p/chromium/issues/detail?id=76516
|
||||
if (useragent.isWebKit)
|
||||
syncValue.schedule();
|
||||
};
|
||||
|
||||
function resetSelection(isEmpty) {
|
||||
if (inCompostion)
|
||||
return;
|
||||
var selectionStart = isEmpty ? 2 : 1;
|
||||
var selectionEnd = 2;
|
||||
// on firefox this throws if textarea is hidden
|
||||
try {
|
||||
text.setSelectionRange(selectionStart, selectionEnd);
|
||||
} catch(e){}
|
||||
};
|
||||
|
||||
var onSelect = function(e) {
|
||||
if (cut) {
|
||||
cut = false;
|
||||
|
|
@ -321,35 +353,14 @@ var TextInput = function(parentNode, host) {
|
|||
}
|
||||
|
||||
|
||||
|
||||
// COMPOSITION
|
||||
event.addListener(text, "compositionstart", onCompositionStart);
|
||||
if (useragent.isGecko) {
|
||||
if (useragent.isGecko)
|
||||
event.addListener(text, "text", onCompositionUpdate);
|
||||
}
|
||||
if (useragent.isWebKit) {
|
||||
if (useragent.isWebKit)
|
||||
event.addListener(text, "keyup", onCompositionUpdate);
|
||||
}
|
||||
event.addListener(text, "compositionend", onCompositionEnd);
|
||||
|
||||
event.addListener(text, "blur", function() {
|
||||
host.onBlur();
|
||||
});
|
||||
event.addListener(text, "focus", function() {
|
||||
host.onFocus();
|
||||
resetSelection();
|
||||
});
|
||||
this.focus = function() {
|
||||
text.focus();
|
||||
};
|
||||
this.blur = function() {
|
||||
text.blur();
|
||||
};
|
||||
|
||||
function isFocused() {
|
||||
return document.activeElement === text;
|
||||
}
|
||||
this.isFocused = isFocused;
|
||||
|
||||
// CONTEXTMENU
|
||||
this.getElement = function() {
|
||||
return text;
|
||||
|
|
@ -382,7 +393,7 @@ var TextInput = function(parentNode, host) {
|
|||
event.capture(host.container, move, onContextMenuClose);
|
||||
};
|
||||
|
||||
function onContextMenuClose() {
|
||||
this.onContextMenuClose = function() {
|
||||
setTimeout(function () {
|
||||
if (tempStyle) {
|
||||
text.style.cssText = tempStyle;
|
||||
|
|
@ -394,7 +405,6 @@ var TextInput = function(parentNode, host) {
|
|||
}
|
||||
}, 0);
|
||||
};
|
||||
this.onContextMenuClose = onContextMenuClose;
|
||||
|
||||
// firefox fires contextmenu event after opening it
|
||||
if (!useragent.isGecko) {
|
||||
|
|
@ -403,13 +413,6 @@ var TextInput = function(parentNode, host) {
|
|||
onContextMenuClose();
|
||||
});
|
||||
}
|
||||
|
||||
host.addEventListener('changeSelection', function(){
|
||||
if (host.selection.isEmpty() != isSelectionEmpty) {
|
||||
isSelectionEmpty = !isSelectionEmpty;
|
||||
syncSelection.schedule();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
exports.TextInput = TextInput;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue