cnelissen
8 May 2009, 9:29 AM
Seems there is a problem with element.removeListener() and element.removeAllListeners(). The following code works fine in Ext 2.2, but does not work with Ext3.0 RC1.1, or Ext Core 3.0. I have tried including ext-core.js as a standalone, including adapters/ext/ext-base.js along with ext-core.js, and adapters/ext/ext-base.js with ext-all.js. None of them produce the expected results...
function checkForm(form) {
// Define CSS classes
var errorClass = 'error-field';
var errorMsgClass = 'error-field-message';
// Define Error Messages
var requiredMsg = 'Required Field';
var invalidEmailMsg = 'Must be a Valid Email Address';
// Boolean error
var error = false;
// Remove any existing error classes and error messages
var errorFields = Ext.DomQuery.select('.' + errorClass, form);
for (var i = 0; i < errorFields.length; i++) {
var field = Ext.get(errorFields[i]);
field.removeClass(errorClass);
field.removeAllListeners(); // <--- Does not remove event listeners!
}
// Process required fields
var requiredFields = Ext.DomQuery.select('input.required, select.required, textarea.required', form);
for (var i = 0; i < requiredFields.length; i++) {
var field = Ext.get(requiredFields[i]);
if (!field.hasClass(errorClass)) {
if (field.getValue() == '') {
// Add the error class
field.addClass(errorClass);
field.addListener('focus', addErrorMsg, this, {errorMsg: requiredMsg});
field.addListener('blur', removeErrorMsg);
error = true;
}
}
}
// Process email fields
var emailFields = Ext.DomQuery.select('input.email-address, select.email-address, textarea.email-address', form);
for (var i = 0; i < emailFields.length; i++) {
var field = Ext.get(emailFields[i]);
if (!field.hasClass(errorClass)) {
if (!validEmailAddress(field.getValue())) {
// Add the error class
field.addClass(errorClass);
field.addListener('focus', addErrorMsg, this, {errorMsg: invalidEmailMsg});
field.addListener('blur', removeErrorMsg);
error = true;
}
}
}
// If there were any errors, return false
if (error == true) {
return false;
} else {
return true;
}
// Function to add an error message to a form field
function addErrorMsg(e, t, o) {
// Create an error message
var field = Ext.fly(t);
var el = Ext.get(Ext.DomHelper.insertAfter(t, {id: field.dom.id + '-msg', tag: 'div', cls: errorMsgClass, html: o.errorMsg}));
el.setLocation(field.getRight() + 10, field.getTop());
}
// Function to remove an error message from a form field
function removeErrorMsg(e, t, o) {
Ext.fly(t.id + '-msg').remove();
}
// Function to check if email is valid
function validEmailAddress(str) {
if (str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/)) {
return true;
} else {
return false;
}
}
}
This function would validate a form similar to this:
<form id="form" action="/some/form/action.php" method="post" onsubmit="return checkForm(this);">
<p><strong>First Name</strong><br />
<input type="text" class="required" id="first_name" name="first_name" value="" /></p>
<p><strong>Last Name</strong><br />
<input type="text" id="last_name" name="last_name" value="" /></p>
<p><strong>Address</strong><br />
<input type="text" id="address" name="address" value="" /></p>
<p><strong>Phone</strong><br />
<input type="text" class="required" id="phone_number" name="phone_number" value="" /></p>
<p><strong>Email</strong><br />
<input type="text" class="required email-address" id="email_address" name="email_address" value="" /></p>
<p><input type="submit" value="› Submit" /></p>
</form>
Also to clarify, what exactly is the difference between the ext-core.js that is included with Ext3.0RC1.1 and the ext-core.js that ships with Ext Core 3.0? Aren't they supposed to be the same thing?
function checkForm(form) {
// Define CSS classes
var errorClass = 'error-field';
var errorMsgClass = 'error-field-message';
// Define Error Messages
var requiredMsg = 'Required Field';
var invalidEmailMsg = 'Must be a Valid Email Address';
// Boolean error
var error = false;
// Remove any existing error classes and error messages
var errorFields = Ext.DomQuery.select('.' + errorClass, form);
for (var i = 0; i < errorFields.length; i++) {
var field = Ext.get(errorFields[i]);
field.removeClass(errorClass);
field.removeAllListeners(); // <--- Does not remove event listeners!
}
// Process required fields
var requiredFields = Ext.DomQuery.select('input.required, select.required, textarea.required', form);
for (var i = 0; i < requiredFields.length; i++) {
var field = Ext.get(requiredFields[i]);
if (!field.hasClass(errorClass)) {
if (field.getValue() == '') {
// Add the error class
field.addClass(errorClass);
field.addListener('focus', addErrorMsg, this, {errorMsg: requiredMsg});
field.addListener('blur', removeErrorMsg);
error = true;
}
}
}
// Process email fields
var emailFields = Ext.DomQuery.select('input.email-address, select.email-address, textarea.email-address', form);
for (var i = 0; i < emailFields.length; i++) {
var field = Ext.get(emailFields[i]);
if (!field.hasClass(errorClass)) {
if (!validEmailAddress(field.getValue())) {
// Add the error class
field.addClass(errorClass);
field.addListener('focus', addErrorMsg, this, {errorMsg: invalidEmailMsg});
field.addListener('blur', removeErrorMsg);
error = true;
}
}
}
// If there were any errors, return false
if (error == true) {
return false;
} else {
return true;
}
// Function to add an error message to a form field
function addErrorMsg(e, t, o) {
// Create an error message
var field = Ext.fly(t);
var el = Ext.get(Ext.DomHelper.insertAfter(t, {id: field.dom.id + '-msg', tag: 'div', cls: errorMsgClass, html: o.errorMsg}));
el.setLocation(field.getRight() + 10, field.getTop());
}
// Function to remove an error message from a form field
function removeErrorMsg(e, t, o) {
Ext.fly(t.id + '-msg').remove();
}
// Function to check if email is valid
function validEmailAddress(str) {
if (str.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/)) {
return true;
} else {
return false;
}
}
}
This function would validate a form similar to this:
<form id="form" action="/some/form/action.php" method="post" onsubmit="return checkForm(this);">
<p><strong>First Name</strong><br />
<input type="text" class="required" id="first_name" name="first_name" value="" /></p>
<p><strong>Last Name</strong><br />
<input type="text" id="last_name" name="last_name" value="" /></p>
<p><strong>Address</strong><br />
<input type="text" id="address" name="address" value="" /></p>
<p><strong>Phone</strong><br />
<input type="text" class="required" id="phone_number" name="phone_number" value="" /></p>
<p><strong>Email</strong><br />
<input type="text" class="required email-address" id="email_address" name="email_address" value="" /></p>
<p><input type="submit" value="› Submit" /></p>
</form>
Also to clarify, what exactly is the difference between the ext-core.js that is included with Ext3.0RC1.1 and the ext-core.js that ships with Ext Core 3.0? Aren't they supposed to be the same thing?