我想做的就是处理对extJS面板的点击。我已经尝试了这个问题上提出的所有建议以及其他所有我能找到的建议,但是它们每一个都失败了,如下所述。
在extJS面板上添加点击事件处理程序的正确语法是什么?
[编辑:为了方便后来的人理解,我将添加一些内联注释--@bmoeskau]
不执行处理程序:
[Ed:
不执行处理程序:
不执行处理程序:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem',
listeners: {
click: function() {
alert('ok');
}
}
});
[Ed:
click
不是面板事件]不执行处理程序:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem',
listeners: {
render: function(c) {
c.body.on('click', function() {
alert('ok');
});
}
}
});
[Ed: 面板未被渲染 - 添加renderTo配置。接下来,您将遇到一个空错误,告诉您 c 不是有效变量。您是否指的是 menuItem1 ?]
无法执行处理程序:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem'
});
Ext.getCmp('panelStart').on('click', function() {
alert('ok');
});
[Ed: click
不是Panel事件。此外,Panel尚未呈现,因此如果您将回调从组件切换为元素,则会收到空错误。]
出现错误:Ext.get('panelStart')为空:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem'
});
Ext.get('panelStart').on('click', function() {
alert('ok');
});
从getCmp切换到get意味着您正在从引用组件(该组件确实存在,但没有单击事件)切换到引用元素(该元素具有单击事件,但尚未呈现/有效)。
使面板消失:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem',
listeners: {
'render': {
fn: function() {
this.body.on('click', this.handleClick, this);
},
scope: content,
single: true
}
},
handleClick: function(e, t){
alert('ok');
}
});
< p >【编辑:传递到回调函数中的作用域(content
)在此代码中不是有效的引用(这是从另一个示例中错误地复制粘贴的)。由于Panel变量被创建为menuItem1
,并且回调函数旨在在面板作用域中运行,因此作用域变量应该是menuItem1
。此外,此面板从未呈现,请参见先前的注释。】
导致错误"Ext.fly(menuItem1.id)为空":
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem'
});
Ext.fly(menuItem1.id).addListener('click', Ext.getCmp(menuItem1.id) , this);
[Ed: 面板未被渲染,请参见上文]
...放在Ext.onReady()之外...
出现错误:Ext.getCmp('panelStart')为null
Ext.getCmp('panelStart').on('click', function() {
alert('okoutside');
});
[Ed: 可能在运行此代码时面板尚未呈现。此外,click
不是面板事件。]
...放在Ext.onReady()之外...
出错了:Ext.get('panelStart')为null
Ext.get('panelStart').on('click', function() {
alert('okoutside');
});
...放在Ext.onReady()之外...
出现错误:Ext.fly('panelStart')为空
Ext.fly('panelStart').on('click', function() {
alert('okoutside');
});
过去三次,我在Firebug中检查了一下,<div id="startPanel">
是存在的:
它可以与JQuery一起使用:
因此,使用JQuery,我只需要这样做就可以了:
$('body').delegate(('#panelStart'), 'click', function(){
alert('ok with jquery');
});
[Ed:这不是一个好的方法。它只是将处理程序的附加延迟到稍后,当元素实际显示在DOM中时(这也可以通过Ext完成,但仍然不是正确的方法)。我在下面的答案中详细说明了正确的方法链接。 OP的尝试都非常接近,但每个人都缺少一两个关键部分。]
如何使用extJS附加类似于这样的单击处理程序?