source: Dev/trunk/src/client/dojox/rails/tests/plugd/trigger.js

Last change on this file was 483, checked in by hendrikvanantwerpen, 11 years ago

Added Dojo 1.9.3 release.

File size: 6.4 KB
Line 
1dojo.provide("dojox.rails.tests.plugd.trigger");
2(function(d){
3       
4        var isfn = d.isFunction,
5                leaveRe = /mouse(enter|leave)/,
6                _fix = function(_, p){
7                        return "mouse" + (p == "enter" ? "over" : "out");
8                },
9                mix = d._mixin,
10               
11                // the guts of the node triggering logic:
12                // the function accepts node (not string|node), "on"-less event name,
13                // and an object of args to mix into the event.
14                realTrigger = d.doc.createEvent ?
15                        function(n, e, a){
16                                // the sane branch
17                                var ev = d.doc.createEvent("HTMLEvents");
18                                e = e.replace(leaveRe, _fix);
19                                ev.initEvent(e, true, true);
20                                a && mix(ev, a);
21                                n.dispatchEvent(ev);
22                        } :
23                        function(n, e, a){
24                                // the janktastic branch
25                                var ev = "on" + e, stop = false, lc = e.toLowerCase(), node = n;
26                                try{
27// FIXME: is this worth it? for mixed-case native event support:? Opera ends up in the
28//      createEvent path above, and also fails on _some_ native-named events.
29//                                      if(lc !== e && d.indexOf(d.NodeList.events, lc) >= 0){
30//                                              // if the event is one of those listed in our NodeList list
31//                                              // in lowercase form but is mixed case, throw to avoid
32//                                              // fireEvent. /me sighs. http://gist.github.com/315318
33//                                              throw("janktastic");
34//                                      }
35                                        n.fireEvent(ev);
36                                }catch(er){
37                    console.warn("in catch", er);
38                                        // a lame duck to work with. we're probably a 'custom event'
39                                        var evdata = mix({
40                                                type: e, target: n, faux: true,
41                                                // HACK: [needs] added support for customStopper to _base/event.js
42                                                // some tests will fail until del._stopPropagation has support.
43                                                _stopper: function(){ stop = this.cancelBubble; }
44                                        }, a);
45                               
46                                        isfn(n[ev]) && n[ev](evdata);
47                               
48                                        // handle bubbling of custom events, unless the event was stopped.
49                                        while(!stop && n !== d.doc && n.parentNode){
50                                                n = n.parentNode;
51                                                isfn(n[ev]) && n[ev](evdata);
52                                        }
53                                }
54                        }
55        ;
56       
57        d._trigger = function(/* DomNode|String */node, /* String */event, extraArgs){
58                // summary:
59                //              Helper for `dojo.trigger`, which handles the DOM cases. We should never
60                //              be here without a domNode reference and a string eventname.
61                var n = d.byId(node), ev = event && event.slice(0, 2) == "on" ? event.slice(2) : event;
62                realTrigger(n, ev, extraArgs);
63
64        };
65               
66        d.trigger = function(obj, event, extraArgs){
67                // summary:
68                //              Trigger some event. It can be either a Dom Event, Custom Event,
69                //              or direct function call.
70                //
71                // description:
72                //              Trigger some event. It can be either a Dom Event, Custom Event,
73                //              or direct function call. NOTE: This function does not trigger
74                //              default behavior, only triggers bound event listeneres. eg:
75                //              one cannot trigger("anchorNode", "onclick") and expect the browser
76                //              to follow the href="" attribute naturally.
77                //
78                // obj: String|DomNode|Object|Function
79                //              An ID, or DomNode reference, from which to trigger the event.
80                //              If an Object, fire the `event` in the scope of this object,
81                //              similar to calling dojo.hitch(obj, event)(). The return value
82                //              in this case is returned from `dojo.trigger`
83                //
84                // event: String|Function
85                //              The name of the event to trigger. Can be any DOM level 2 event
86                //              and can be in either form: "onclick" or "click" for instance.
87                //              In the object-firing case, this method can be a function or
88                //              a string version of a member function, just like `dojo.hitch`.
89                //
90                // extraArgs: Object?
91                //              An object to mix into the `event` object passed to any bound
92                //              listeners. Be careful not to override important members, like
93                //              `type`, or `preventDefault`. It will likely error.
94                //
95                //              Additionally, extraArgs is moot in the object-triggering case,
96                //              as all arguments beyond the `event` are curried onto the triggered
97                //              function.
98                //
99                // example:
100                //      |       dojo.connect(node, "onclick", function(e){ /* stuff */ });
101                //      |       // later:
102                //      |       dojo.trigger(node, "onclick");
103                //
104                // example:
105                //      |       // or from within dojo.query: (requires dojo.NodeList)
106                //      |       dojo.query("a").onclick(function(){}).trigger("onclick");
107                //
108                // example:
109                //      |       // fire obj.method() in scope of obj
110                //      |       dojo.trigger(obj, "method");
111                //
112                // example:
113                //      |       // fire an anonymous function:
114                //      |       dojo.trigger(d.global, function(){ /* stuff */ });
115                //
116                // example:
117                //      |       // fire and anonymous function in the scope of obj
118                //      |       dojo.trigger(obj, function(){ this == obj; });
119                //
120                // example:
121                //      |       // with a connected function like:
122                //      |       dojo.connect(dojo.doc, "onclick", function(e){
123                //      |               if(e && e.manuallydone){
124                //      |                       console.log("this was a triggered onclick, not natural");
125                //      |               }
126                //      |       });
127                //      |       // fire onclick, passing in a custom bit of info
128                //      |       dojo.trigger("someId", "onclick", { manuallydone:true });
129                //
130                // returns: Anything
131                //              Will not return anything in the Dom event case, but will return whatever
132                //              return value is received from the triggered event.
133                return (isfn(obj) || isfn(event) || isfn(obj[event])) ?
134                        d.hitch.apply(d, arguments)() : d._trigger.apply(d, arguments);
135        };
136       
137        // adapt for dojo.query:
138        /*=====
139        dojo.extend(dojo.NodeList, {
140                trigger: function(event, data){
141                        // summary:
142                        //              Trigger some Event originating from each of the nodes in this
143                        //              `dojo.NodeList`.
144                        //
145                        // event: String
146                        //              Any strig identifier for the event.type to be triggered.
147                        //
148                        // data: Object
149                        //              Just like `extraArgs` for `dojo.trigger`, additional data
150                        //              to mix into the event object.
151                        //
152                        // example:
153                        //      |       dojo.query("a").trigger("onclick");
154                       
155                        return this; // dojo.NodeList
156                }
157        });
158        =====*/
159        d.NodeList.prototype.trigger = d.NodeList._adaptAsForEach(d._trigger);
160
161        // if the node.js module is available, extend trigger into that.
162        if(d._Node && !d._Node.prototype.trigger){
163                d.extend(d._Node, {
164                        trigger: function(ev, data){
165                                // summary:
166                                //              Fire some some event originating from this node.
167                                //              Only available if both the `dojo.trigger` and `dojo.node` plugin
168                                //              are enabled. Allows chaining as all `dojo._Node` methods do.
169                                //
170                                // ev: String
171                                //              Some string event name to fire. eg: "onclick", "submit"
172                                //
173                                // data: Object
174                                //              Just like `extraArgs` for `dojo.trigger`, additional data
175                                //              to mix into the event object.
176                                //
177                                // example:
178                                //      |       // fire onlick orginiating from a node with id="someAnchorId"
179                                //      |       dojo.node("someAnchorId").trigger("click");
180
181                                d._trigger(this, ev, data);
182                                return this; // dojo._Node
183                        }
184                });
185        }
186       
187})(dojo);
Note: See TracBrowser for help on using the repository browser.