我试图阻止用户在contentedtiable
元素上书写。为此,我正在检索插入符的父容器,并检查它是否是ID为dnd-textarea
的textarea。
以下代码在Chrome上完全正常,但在Firefox上失败。 preventWritingOnTextArea()
的日志记录输出显示,在Firefox下,父级没有更改,但仍然是dnd-textarea
而不是标识为InlinePanel
的{{1}}。
newId
在我的textarea的private native Node getCaretParent() /*-{
var target = null;
if($wnd.getSelection) {
target = $wnd.getSelection().getRangeAt(0).commonAncestorContainer;
return ((target.nodeType===1) ? target:target.parentNode);
}
else if($doc.selection) {
target = $doc.selection.createRange().parentElement();
}
return target;
}-*/;
方法中,我检查一下carret是否试图写上它。如果是这样,我会分支到onKeyPress()
以防止这种情况发生。
preventWritingOnTextArea()
方法@Override
public void onKeyPress(KeyPressEvent event) {
Node parent = getCaretParent();
GWT.log("Caret parent: " + parent);
if(parent == textarea.getElement()) {
preventWritingOnTextArea();
}
}
应该添加一个新的preventWritingOnTextAread()
并通过将焦点设置在这个新面板上来从textarea中删除焦点。 Imho这只能意味着InlinePanel
不能按预期在Firefox上运行和/或做其他事情。
focus()
我怎样才能在Firefox下工作呢?是的..所有其他浏览器也是如此..
是的,我已尝试private void preventWritingOnTextArea() {
GWT.log("preventWritingOnTextArea()");
InlineLabel textWrapper = new InlineLabel();
int pos = getCursorPosition(textarea.getElement());
if(pos == 0) {
textarea.getElement().insertFirst(textWrapper.getElement());
} else {
textarea.getElement().appendChild(textWrapper.getElement());
}
String newId = "wrap-"+(nextId++);
// Tried that too but this loses the focus completely under Firefox.
//textarea.getElement().blur();
textWrapper.getElement().setId(newId);
textWrapper.getElement().focus();
Node parent = getCaretParent();
Element newParent = parent.cast();
GWT.log("New parent " + newParent.getId());
}
先blur()
,然后重点关注textarea
,但这也不起作用。
答案 0 :(得分:0)
好吧,Firefox并不想按照预期的方式去做。我现在的解决方案是标记新span
元素的文本(显然是空的)以实际关注它。这很难看,但我们又在这里谈论网络开发,对吧?积分@TimDown for this answer。
private void preventWritingOnTextArea() {
GWT.log("preventWritingOnTextArea()");
InlineLabel textWrapper = new InlineLabel();
// ...
textWrapper.getElement().setId(newId);
textWrapper.getElement().focus();
// Firefox didn't want to play with us.
markText(textWrapper.getElement());
}
private native void markText(Element element) /*-{
win = $wnd;
var doc = win.document, sel, range;
if (win.getSelection && doc.createRange) {
sel = win.getSelection();
range = doc.createRange();
range.selectNodeContents(element);
sel.removeAllRanges();
sel.addRange(range);
} else if (doc.body.createTextRange) {
range = doc.body.createTextRange();
range.moveToElementText(element);
range.select();
}
}-*/;