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 inCompostion = false;
|
||||||
var tempStyle = '';
|
var tempStyle = '';
|
||||||
var isSelectionEmpty = true;
|
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() {
|
var syncSelection = lang.delayedCall(function() {
|
||||||
resetSelection(isSelectionEmpty);
|
isFocused && resetSelection(isSelectionEmpty);
|
||||||
});
|
});
|
||||||
var syncValue = lang.delayedCall(function() {
|
var syncValue = lang.delayedCall(function() {
|
||||||
if (!inCompostion) {
|
if (!inCompostion) {
|
||||||
text.value = PLACEHOLDER;
|
text.value = PLACEHOLDER;
|
||||||
resetSelection();
|
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();
|
resetValue();
|
||||||
if (isFocused())
|
if (isFocused)
|
||||||
host.onFocus();
|
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) {
|
var onSelect = function(e) {
|
||||||
if (cut) {
|
if (cut) {
|
||||||
cut = false;
|
cut = false;
|
||||||
|
|
@ -321,35 +353,14 @@ var TextInput = function(parentNode, host) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// COMPOSITION
|
||||||
event.addListener(text, "compositionstart", onCompositionStart);
|
event.addListener(text, "compositionstart", onCompositionStart);
|
||||||
if (useragent.isGecko) {
|
if (useragent.isGecko)
|
||||||
event.addListener(text, "text", onCompositionUpdate);
|
event.addListener(text, "text", onCompositionUpdate);
|
||||||
}
|
if (useragent.isWebKit)
|
||||||
if (useragent.isWebKit) {
|
|
||||||
event.addListener(text, "keyup", onCompositionUpdate);
|
event.addListener(text, "keyup", onCompositionUpdate);
|
||||||
}
|
|
||||||
event.addListener(text, "compositionend", onCompositionEnd);
|
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
|
// CONTEXTMENU
|
||||||
this.getElement = function() {
|
this.getElement = function() {
|
||||||
return text;
|
return text;
|
||||||
|
|
@ -382,7 +393,7 @@ var TextInput = function(parentNode, host) {
|
||||||
event.capture(host.container, move, onContextMenuClose);
|
event.capture(host.container, move, onContextMenuClose);
|
||||||
};
|
};
|
||||||
|
|
||||||
function onContextMenuClose() {
|
this.onContextMenuClose = function() {
|
||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
if (tempStyle) {
|
if (tempStyle) {
|
||||||
text.style.cssText = tempStyle;
|
text.style.cssText = tempStyle;
|
||||||
|
|
@ -394,7 +405,6 @@ var TextInput = function(parentNode, host) {
|
||||||
}
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
};
|
};
|
||||||
this.onContextMenuClose = onContextMenuClose;
|
|
||||||
|
|
||||||
// firefox fires contextmenu event after opening it
|
// firefox fires contextmenu event after opening it
|
||||||
if (!useragent.isGecko) {
|
if (!useragent.isGecko) {
|
||||||
|
|
@ -403,13 +413,6 @@ var TextInput = function(parentNode, host) {
|
||||||
onContextMenuClose();
|
onContextMenuClose();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
host.addEventListener('changeSelection', function(){
|
|
||||||
if (host.selection.isEmpty() != isSelectionEmpty) {
|
|
||||||
isSelectionEmpty = !isSelectionEmpty;
|
|
||||||
syncSelection.schedule();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
exports.TextInput = TextInput;
|
exports.TextInput = TextInput;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue