All I want to do is handle a click on an extJS panel.
I've tried all the of suggestions on this question plus all I could find elsewhere but each of them fail in the ways described below.
What is the correct syntax to add a click event handler to a extJS panel?
[Edit: For the sake of others who may find this question later, I'll add some comments inline to make this easier to decipher --@bmoeskau]
doesn't execute handler:
var menuItem1 = new Ext.Panel({
id: 'panelStart',
title: 'Start',
html: 'This is the start page.',
cls:'menuItem',
listeners: {
click: function() {
alert('ok');
}
}
});
[Ed: click
is not a Panel event]
doesn't execute handler:
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: The Panel is never being rendered -- add renderTo config. Next, you'll hit a null error telling you that c
is not a valid variable. Do you mean menuItem1
instead?]
doesn't execute handler:
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
is not a Panel event. Also, the Panel is not yet rendered, so if you switched the callback to be on the element rather than the Component you'd get a null error.]
gets error: Ext.get('panelStart') is null:
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');
});
[Ed: It's not rendered, see above. Switching from getCmp
to get
means you are switching from referencing the Component
(which does exist, but does not have a click
event) to referencing the Element
(which does have a click
event, but is not yet rendered/valid).]
makes the panel disappear:
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');
}
});
[Ed: The scope being passed into the callback (content
) is not a valid ref in this code (this was copy-pasted incorrectly from another sample). Since the Panel var is created as menuItem1
and the callback is intended to run in the panel's scope, scope var should be menuItem1
. Also, this Panel is never rendered, see prev comments.]
gives the error "Ext.fly(menuItem1.id) is null":
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: Panel is not rendered, see above]
...put outside Ext.onReady()... gets error: Ext.getCmp('panelStart') is null
Ext.getCmp('panelStart').on('click', function() {
alert('okoutside');
});
[Ed: Panel is likely not rendered at the time this code is run. Also, click
is not a Panel event.]
...put outside Ext.onReady()... gets error: Ext.get('panelStart') is null
Ext.get('panelStart').on('click', function() {
alert('okoutside');
});
[Ed: See above]
...put outside Ext.onReady()... gets error: Ext.fly('panelStart') is null
Ext.fly('panelStart').on('click', function() {
alert('okoutside');
});
[Ed: See above]
For the last three, I checked in Firebug and <div id="startPanel">
exists:
It works with JQuery:
So with JQuery I simply have to do this and it works:
$('body').delegate(('#panelStart'), 'click', function(){
alert('ok with jquery');
});
[Ed: This is not a good approach. It's simply delaying attaching of the handler until later, when the element actually shows up in the DOM (which could also be done via Ext btw, but would still not be the proper approach). I spelled out the correct approach, as linked in my answer below. The OP's attempts are all very close, but each is missing one or two key pieces.]
How can I attach a click handler like this with extJS?