Firefox下的focus()没有按预期工作?

时间:2016-03-13 22:55:07

标签: javascript firefox gwt

我试图阻止用户在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,但这也不起作用。

1 个答案:

答案 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();
    }       
}-*/;