behavior.html 3.26 KB
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
	"http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<title>Testing dojo.behavior</title>
		<style type="text/css">
			@import "../resources/dojo.css";
		</style>
		<script type="text/javascript" src="../dojo.js" data-dojo-config="isDebug: true, popup: true"></script>
		<script type="text/javascript">
			require(["dojo", "doh", "dojo/behavior", "dojo/domReady!"], function(dojo, doh){
				var applyCount = 0;
 
				var behaviorObj = {
					".bar":function(elem){
						dojo.style(elem, "opacity", 0.5);
						applyCount++;
					},
					".foo > span":function(elem){
						elem.style.fontStyle = "italic";
						applyCount++;
					}
				};
 
				topicCount = 0;
				dojo.subscribe("/foo", function(){ topicCount++; });

				// no behaviors should be executed when onload fires
				doh.register("t", 
					[
						function add(t){
							t.f(dojo.behavior._behaviors[".bar"]);
							t.f(dojo.behavior._behaviors[".foo > span"]);
							dojo.behavior.add(behaviorObj);
							// make sure they got plopped in
							t.t(dojo.behavior._behaviors[".bar"]);
							t.is(1, dojo.behavior._behaviors[".bar"].length);
							t.t(dojo.behavior._behaviors[".foo > span"]);
							t.is(1, dojo.behavior._behaviors[".foo > span"].length);
						},
						function apply(t){
							t.is(0, applyCount);
							dojo.behavior.apply();
							t.is(2, applyCount);

							// reapply and make sure we only match once
							dojo.behavior.apply();
							t.is(2, applyCount);
						},
						function reapply(t){
							t.is(2, applyCount);
							// add the rules again
							dojo.behavior.add(behaviorObj);
							dojo.behavior.apply();
							t.is(4, applyCount);
							// dojo.behavior.apply();
							// t.is(4, applyCount);
							// dojo.query(".bar").styles("opacity", 1.0);
						},
						function topics(t){
							var d = new doh.Deferred();
							t.is(0, topicCount);
							dojo.behavior.add({ ".foo": "/foo" });
							dojo.behavior.apply();
							t.is(2, topicCount);

							// We are going to catch focus events on "thinger", so first move focus
							// somewhere else.
							dojo.byId("another").focus();

							// use timeout because blur/focus event generation isn't synchronous on IE
							setTimeout(d.getTestErrback(function(){

								// setup listener for focus events
								dojo.behavior.add({ ".foo": {
										"onfocus": "/foo"
									}
								});
								dojo.behavior.apply();
								t.is(2, topicCount);

								// focus blah, publishing /foo
								dojo.byId("blah").focus();

								setTimeout(d.getTestErrback(function(){
									t.is(3, topicCount);

									// blur and then refocus blah, publishing /foo again
									dojo.byId("another").focus();
									dojo.byId("blah").focus();

									setTimeout(d.getTestCallback(function(){
										t.is(4, topicCount);
									}), 10);
								}), 10);
							}), 10);
							return d;
						}
					]
				);
				doh.runOnLoad();
			});
		</script>
	</head>
	<body>
		<div class="foo" id="fooOne">
			<span>.foo &gt; span</span>	
			<div class="bar">
				<span>.foo &gt; .bar &gt; span</span>	
			</div>
		</div>

		<!--for focus/topic tests -->
		<input id="another" value="another">
		<input type="text" id="blah" class="foo blah" name="thinger" value="thinger" tabIndex="0">
	</body>
</html>