customevent.html revision bec687aba7976035d86626c750ea65c65ce13733
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin<script type="text/javascript" src="/build/yui/yui.js"></script>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin<p><input type="button" value="Run Tests" id="btnRun" disabled="true" /></p>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin(function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin filter: "debug",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin combine: false,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin useConsole: true,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // logInclude: ['event', 'test']
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin logExclude: {Dom: true, Selector: true, Node: true, attribute: true, base: true, event: true, widget: true}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }).use("dump", "test", "console", function(Y) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var button = Y.get('#btnRun');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // Set up the page
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin button.set("disabled", false);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on("click", function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }, button);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var myConsole = new Y.Console().render();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var testEventTarget = new Y.Test.Case({
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name: "Event.Target tests",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testAugment: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var fired = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var O = function(id) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('O constructor executed ' + id);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oOo: function(ok) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // pass configuration info into Event.Target with the following
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // construct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin emitFacade: true
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var o = new O(),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin handle = o.on('testAugment', function(e, arg1, arg2) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(this instanceof O);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o.fire('testAugment', { foo: 'afoo' }, 1, 2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // if the first argument is not an object, the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // event facade is moved in front of the args rather
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // than overwriting existing object.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o.on('testAugment', function(e, arg1, arg2) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o.fire('testAugment', 1, 2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testExtend: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var fired = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var Base = function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('Base constructor executed');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin arguments.callee.superclass.constructor.apply(this, arguments);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin base: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('all your base...');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var b = new Base();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b.on('testExtend', function(arg1, arg2) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(this instanceof Base);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b.fire('testExtend', 1, 2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testPrefix: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var fired1 = false,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var O = function(id) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('O constructor executed ' + id);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oOo: function(ok) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // pass configuration info into Event.Target with the following
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // construct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin emitFacade: true,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin prefix: 'prefix'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var o = new O();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o.on('testPrefix', function(e, arg1, arg2) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(this instanceof O);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o.on('prefix:testPrefix', function(e, arg1, arg2) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(this instanceof O);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o.fire('testPrefix', { foo: 'afoo' }, 1, 2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin o.fire('prefix:testPrefix', { foo: 'afoo' }, 1, 2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testDetachKey: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var fired1 = false,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('handle, test:event', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // one listener
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('test:event');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.detach('handle, test:event');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('handle, test:event', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // first lisener detached, added a new listener
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('test:event');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.detach('handle,test:event');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.after('handle, test:event', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // comma or pipe
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('handle|test:event', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // testing on and after order
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('test:event');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // spaces after the comma or lack thereof should have
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // no effect on the addition or removal of listeners
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.detach('handle,test:event');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // added both an on listener and an after listener,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // then detached both
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('test:event');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testChain: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var fired1 = false,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = false,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired3 = false,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired4 = false,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired5 = false;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // should be executed once, after f2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var f1 = function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired1 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // should be executed once, before f1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var f2 = function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired2 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // should be executed once, different event from f1 and f2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var f3 = function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired3 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // detached before fired, should not executed
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var f4 = function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired4 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // should fire once, preserving the custom prefix rather
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // than using the configured event target prefix
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var f5 = function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fired5 = true;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // configure chaining via global default or on the event target
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin YUI({ /* chain: true */ }).use('*', function(Y2) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var o = new Y2.EventTarget({
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin prefix: 'foo',
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin chain : true
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // without event target prefix manipulation (incomplete now)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // @TODO an error here is throwing an uncaught exception rather than failing the test
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // Y2.after('p:e', f1).on('p:e', f2).on('p:e2', f3).on('detach, p:e', f4).detach('detach, p:e').fire('p:e').fire('p:e2');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // with event target prefix manipulation ('e' is the same event as 'foo:e',
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin // but 'pre:e' is a different event only accessible by using that exact name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chino.after('e', f1).on('foo:e', f2).on('foo:e2', f3).on('detach, e', f4).detach('detach,e').fire('foo:e').fire('e2').on('pre:e', f5).fire('pre:e');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(fired1); // verifies chaining, on/after order, and adding the event target prefix
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(fired2); // verifies chaining, on/after order, and accepting the prefix in the event name
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(fired3); // verifies no interaction between events, and prefix manipulation
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isFalse(fired4); // verifies detach works (regardless of spaces after comma)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(fired5); // verifies custom prefix
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testObjType: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var f1, f2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 'y:click': function() {f1 = true},
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 'y:clack': function() {f2 = true}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('y:click');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('y:clack');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testPreventFnOnce: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var count = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin emitFacade: true,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin preventedFn: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Assert.isTrue(this instanceof YUI);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('y:foo1', function(e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('y:foo1', function(e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testDetachHandle: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var count = 0, handle, handle2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin emitFacade: true,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('y:foo', function(e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin handle = Y.on('y:foo', function(e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin count += 100;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin handle2 = Y.on('y:foo', function(e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin count += 1000;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin count = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var handle3 = Y.on('y:click', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('y:click');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('y:click');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin count = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('y:foo', function(e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('y:foo', function(e) {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.fire('y:click');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin testBroadcast: function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin var o = new Y.EventTarget(), s1, s2, s3, s4;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin emitFacade: true,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin broadcast: 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('y:foo2', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('Y foo2 executed');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Global.on('y:foo2', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('GLOBAL foo2 executed');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin emitFacade: true,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin broadcast: 2
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.on('y:bar', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('Y bar executed');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.Global.on('y:bar', function() {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Y.log('GLOBAL bar executed');
Y.Test.Runner.add(testEventTarget);