В моем ExtJS 5 приложения Я использую Ext.ux.IFrame -компонент на дисплеи новостей HTML документ из интрасети. Когда я нажимаю backspace или alt + left/right, запускается история навигации браузера, и приложение загружает новое.ExtJs 5 - задвижка KeyDown событие Ext.ux.IFrame
Чтобы предотвратить эти поведения за пределами фрейма, я приложил KeyDown слушателя к документу
Ext.onReady(function() {
var documentObj = Ext.getDoc();
documentObj.on('keydown', globalKeyDown);
});
В обратный вызов я прекращаю эти события
globalKeyDown: function (event, targetDomEle) {
var eventKey = event.getKey();
switch (eventKey) {
case event.BACKSPACE:
if ((!/^input$/i.test(targetDomEle.tagName) &&
!/^textarea$/i.test(targetDomEle.tagName)) ||
targetDomEle.disabled || targetDomEle.readOnly) {
event.stopEvent();
}
break;
case event.LEFT:
case event.RIGHT:
if (event.altKey) {
event.stopEvent();
}
break;
}
}
Но когда я пытаюсь сделать то же самое для iframe метод прослушивания его в структуре ExtJs работает не так, как ожидалось.
Ext.application({
name: 'Test',
requires: ['Ext.ux.IFrame'],
launch : function() {
var info = new Ext.Component({
renderTo: document.body,
html: 'above the iframe',
width: 350,
padding: '0 0 20 0',
margin: '0 0 1 0',
style: { border: 'solid 1px blue' },
});
var iframe = Ext.create('Ext.ux.IFrame',{
style: { border: 'solid 1px red' },
width: 350,
height: 350,
renderTo: document.body
});
var iframeDoc = iframe.getDoc();
var iframeDocEl = Ext.get(iframeDoc);
iframeDocEl.on('keydown', function(){
console.log('iframeDoc.on callback'); // <-- never executed
});
iframeDoc.onkeyup = function(){
console.log('onkeyup callback') // <-- works just fine
};
}
});
Почему iframeDocEl.on('keydown', ...
не работает для этого случая? Метод iframeDoc.onkeyup
- это всего лишь обходное решение, потому что в обратном вызове я хочу использовать объект события framework для кросс-браузера (IE8 +).
Благодарим за любые предложения.
Сценарий можно найти по адресу Sencha Fiddle.