2015-01-21 3 views
2

저는 Ace 편집기를 부트 스트랩 3 모달에 포함 시켰습니다. 모달가 표시되기 전에,이 같은 편집기에서 값을 설정 :Ace는 Firefox에서 포커스가있는 편집기의 모든 텍스트를 선택합니다.

var editor = ace.edit(aceEditorId); 
editor.session.setValue(val, -1); // set value at document start 
editor.session.selection.clearSelection(); 
나는 또한 편집기의 크기를 조정 모달에 대해 "표시"이벤트 핸들러가

: 나는 초점

$(editSnippetSelector).on("shown.bs.modal", function() { 
     var editorId = getSnippetEditorId(); 
     var snippetEditor = ace.edit(editorId); 
     snippetEditor.resize(); 

을 Firefox의 편집기에서 모든 편집기 텍스트가 선택됩니다. 커서를 움직이거나 클릭하여 선택을 제거 할 수 없습니다. 백 스페이스 또는 다른 키 (예 : 문자 또는 입력)를 눌러 텍스트를 지울 수 있습니다.

이것은 Chrome이나 IE에서 발생하지 않습니다.

codeEditor.on("focus", function() { 
    codeEditor.getSession().setValue(codeEditor.getSession().getValue()); 
    codeEditor.clearSelection(); 
}); 

다른 내가 보일 것입니다 :

은 실험으로, 나는 또한 아무 소용이 코드를 추가? 비슷한 행동을 본 사람이 있습니까?

업데이트 :

나는 무한 루프에 호출되는 ace.jsonSelect 기능이있는 것으로 나타났습니다. 그것은 라인 (2061)에있다 : https://github.com/ajaxorg/ace-builds/blob/master/src-noconflict/ace.js#L2061 여기

함수의 코드입니다 :

var onSelect = function(e) { 
    if (copied) { 
     copied = false; 
    } else if (isAllSelected(text)) { 
     host.selectAll(); 
     resetSelection(); 
    } else if (inputHandler) { 
     resetSelection(host.selection.isEmpty()); 
    } 
}; 

파이어 폭스의 디버거에서 코드를 통해 걷는 보여줍니다 사실 때문에 선택 이벤트가 다시 발생 isAllSelected(text) 호출이 반환.

답변

6

ace.js 파이어 폭스에서 무한 루프에 호출되는 onSelect 핸들러가 표시됩니다 후에 당신은 editor.resize()를 호출해야합니다.

var onSelect = function(e) { 
    if (copied) { 
     copied = false; 
    } else if (isAllSelected(text)) { 
     host.selectAll(); 
     resetSelection(); 
    } else if (inputHandler) { 
     resetSelection(host.selection.isEmpty()); 
    } 
}; 

text가 텍스트 영역 DOM 요소이다

여기에서이 함수의 원본 코드이다. isAllSelected(text) 검사의 모든 텍스트는이 코드를 사용하여 선택하는 경우 :이도 어떻게 든 다시 아래로 전파되는 호출 할 host.selectAll() 발생하고 선택을 발사 빈 텍스트 영역에 대해 true를 돌려 볼 수 있듯이

return text.selectionStart === 0 && text.selectionEnd === text.value.length; 

을 다시 이벤트.

빈 텍스트 영역에 대한 검사가 추가되어 문제가 해결되었습니다. 코드는 다음과 같습니다 :

var onSelect = function(e) { 
    if (copied) { 
     copied = false; 
    } else if (text.value && isAllSelected(text)) { 
     host.selectAll(); 
     resetSelection(); 
    } else if (inputHandler) { 
     resetSelection(host.selection.isEmpty()); 
    } 
}; 
+1

축소 된 ace.js에서이를 갱신하려면 'E (n)'(대소 문자 구분)의 첫 번째 발생을 찾아 'n.value && E (n)'로 바꾸십시오. (이 답변을 주셔서 대단히 감사합니다.) – mch

+1

@mch 환영합니다 :) –

+0

이 수정본을 공식 ace.js 코드에 추가하면 안됩니까? 이것은 2017이며 버그는 여전히 존재합니다. 답변 주셔서 감사합니다 DanielGabriel & @mch – k32y

1

대부분 렌더러에서 오래된 캐시 된 크기가 원인 일 수 있습니다. 모달이

+0

감사합니다. 도움이되지 않습니다. 더 많은 코드로 질문을 업데이트했습니다. 모달이 표시되면 resize()를 호출합니다. 그때까지 가치는 이미 설정되어 있고 문제는 여전히 지속됩니다. "표시된"이벤트 핸들러에이 코드를 넣어 역전 (크기 조정, 값 설정) 해 보았습니다 :'snippetEditor.resize(); snippetEditor.session.setValue (snippetEditor.session.getValue(), -1); '와 같은 결과가 나타납니다. –

+0

문제의 jsbin 데모를 만들거나 페이지를 어딘가에 표시 할 수 있습니까? 질문의 코드 스 니펫으로 문제를 재현 할 수 없습니다. –

+0

다음은 jsfiddle이지만 문제를 재현하지 않습니다. http://jsfiddle.net/daniel_gabriel/02t1wphe/2/ 계속 조사 할 것입니다. –