Методы фокуса / размытия Ace-editor, по-видимому, не работают, интегрированные с termlib.js

Я разрабатываю проект, в котором мне нужен ace-editor, интегрированный с эмулятором терминала; все проблемы проиллюстрированы здесь

Проблемы отсутствуют, когда человеческое взаимодействие терпит неудачу: пользователь зависает в терминале и редакторе, пока не покинет страницу. Я хочу установить .focus() для элемента "hoved" и .blur() для элемента "not hoved". На терминал работает нормально, бот ace-editor не фокусируется. Я не могу вставить некоторые символы в редактор.

Видимо jquery здесь не работает:

$('#terminal').hover(function(){
  TermGlobals.setFocus(true);
}, function(){
  TermGlobals.setFocus(false);
})

$('#coffee_editor > textarea').hover(function(){
  window.editor.focus();
}, function(){
  window.editor.blur();
})

У кого-то есть четкое представление, почему это не работает должным образом?

Спасибо за все

РЕШЕНО!

Я помню RTFM

7.2  TermGlobals.keylock (Global Locking Flag)

The global flag `TermGlobals.keylock' allows temporary keyboard locking without any
other change of state. Use this to free the keyboard for any other resources.
(added in v.1.03)

Поэтому я добавил следующее в jsfiddle:

$('#terminal').hover(function () {
    TermGlobals.keylock = false;
    term.focus();
}, function () {
    TermGlobals.setFocus(false);
});

$('#coffee_editor').hover(function () {
    TermGlobals.keylock = true;
    window.editor.focus();
}, function () {
    window.editor.blur();
});

Странно то, что jsfiddle работает неправильно, но в мой проект работает очень хорошо. Я запускаю сервер Rails, а jsfiddle работает внутри <iframe>; почему такая разница в работе?


person gcrav    schedule 11.06.2014    source источник


Ответы (1)


Вместо этого у ace нет видимого прослушивателя textarea для присоединения к элементу контейнера.

$('#coffee_editor').hover(function(){
   window.editor.focus();
}, function(){
  window.editor.blur();
})
person a user    schedule 11.06.2014
comment
Ммм... возможно, это звучит правдоподобно; я изменил src на jsfiddle.net/34EaM/11; но пока не работает должным образом: когда я набираю символы на клавиатуре, они не отображаются в ace. Я каким-то образом блокирую редактор, когда нет терминала; мигает в двух окнах работает исправно. - person gcrav; 12.06.2014
comment
jsfiddle, кажется, не работает, поэтому я не могу проверить, но я видел это вчера. Установите прерывание при ошибке и отладьте его. - person a user; 12.06.2014
comment
В console я получаю эти ошибки, когда нажимаю на терминал: Uncaught TypeError: Cannot set property 'innerHTML' of null VM369:1 -> Uncaught TypeError: undefined is not a function (anonymous function) VM370:1 -> Terminal.prototype.globals.activeTerm._cursorBlink() document.getElementById("SL_tocurlng").innerHTML=document.getElementById("SL_lng_to").options[document.getElementById("SL_lng_to").selectedIndex].text; Также строки в VM меняются каждый раз - person gcrav; 12.06.2014
comment
Я имел в виду отладку, а не сообщение об ошибке :). В любом случае, очевидно, что termlib.js, который вы используете, очень глючный и останавливает все события на странице. Используйте TermGlobals.setFocus({lock:1}); вместо TermGlobals.setFocus(false);, чтобы обмануть его, чтобы он не потреблял все события. - person a user; 12.06.2014
comment
Я решил проблему в своем проекте всего несколько минут назад... (jsfiddle странный...) см. мой собственный ответ на вопрос SO; на ваш взгляд, есть ли отличия между моим решением и вашим? в любом случае, я очень благодарен за вашу помощь! - person gcrav; 13.06.2014
comment
он проверяет несколько вещей в обработчике нажатия клавиш, и любая из них будет работать. Я бы предпочел решение {lock:true}, так как оно короче и позволяет обрабатывать терминал в одном месте. - person a user; 13.06.2014