示例#1
0
                        keyComposer._longPressTimeout = setTimeout(function() {
                            var longPressEvent;

                            keyComposer._longPressTimeout = null;

                            longPressEvent = document.createEvent("CustomEvent");
                            longPressEvent.initCustomEvent(LONGKEYPRESS_EVENT_TYPE, true, true, null);
                            longPressEvent.activeElement = event.target;
                            longPressEvent.identifier = keyComposer.identifier;
                            longPressEvent = MutableEvent.fromEvent(longPressEvent);
                            defaultEventManager.activeTarget.dispatchEvent(longPressEvent);
                            delete thisRef._longPressKeys[keyComposer.uuid];
                        }, this._longPressThreshold);
示例#2
0
        value: function(matches, event) {
            var thisRef = this,
                stopped = false,
                keyUp = event.type == "keyup",
                keyDown = event.type == "keydown",
                eventType = keyUp ? KEYRELEASE_EVENT_TYPE : KEYPRESS_EVENT_TYPE,
                nbrMatches = matches.length,
                keyComposer,
                keyComposerEvent,
                triggeredKeys,
                i;

            // matches could be either an array of matches or an array of keyComposers
            for (i = 0; i < nbrMatches && !stopped; i ++) {
                keyComposer = matches[i].object || matches[i];

                // Make sure keyboard event's target is a descendant of the keyComposer's element
                var target = event.target,
                    element = keyComposer.element,
                    onTarget = (keyComposer.element === window);

                while (!onTarget) {
                    onTarget = (target === element);

                    if (target == document) {
                        break;
                    } else {
                        target = target.parentElement;
                        if (!target) {
                            target = document;
                        }
                    }
                }

                if (!onTarget) {
                    continue;
                }

                if (keyUp) {
                    triggeredKeys = Object.keys(this._triggeredKeys);
                    if (triggeredKeys.indexOf(keyComposer.uuid) == -1) {
                        // Do not generate a keyup event if the composerKey has not been triggered on keydown or keypress
                        continue;
                    }

                    if (keyComposer._longPressTimeout) {
                        clearTimeout(keyComposer._longPressTimeout);
                        keyComposer._longPressTimeout = null;
                        delete this._longPressKeys[keyComposer.uuid];
                    }
                } else {
                    if (keyDown) {
                        // Reset trigger
                        delete this._triggeredKeys[keyComposer.uuid];
                        event.preventDefault();
                    } else if (this._triggeredKeys[keyComposer.uuid]) {
                        // that key has already been triggered, let's ignore it...
                        continue;
                    }
                    if (keyComposer._shouldDispatchLongPress && !keyComposer._longPressTimeout) {
                        keyComposer._longPressTimeout = setTimeout(function() {
                            var longPressEvent;

                            keyComposer._longPressTimeout = null;

                            longPressEvent = document.createEvent("CustomEvent");
                            longPressEvent.initCustomEvent(LONGKEYPRESS_EVENT_TYPE, true, true, null);
                            longPressEvent.activeElement = event.target;
                            longPressEvent.identifier = keyComposer.identifier;
                            longPressEvent = MutableEvent.fromEvent(longPressEvent);
                            defaultEventManager.activeTarget.dispatchEvent(longPressEvent);
                            delete thisRef._longPressKeys[keyComposer.uuid];
                        }, this._longPressThreshold);

                        // Let's remember any longKeyPress key waiting for timeout
                        this._longPressKeys[keyComposer.uuid] = keyComposer;
                    }
                }

                keyComposerEvent = document.createEvent("CustomEvent");
                keyComposerEvent.initCustomEvent(eventType, true, true, null);
                keyComposerEvent.activeElement = event.target;
                keyComposerEvent.identifier = keyComposer.identifier;
                keyComposerEvent.keyComposer = keyComposer;
                keyComposerEvent = MutableEvent.fromEvent(keyComposerEvent);
                if (this._opera) {
                    keyComposerEvent.type = eventType; // Opera modifes the capitalization of custom event's type when that one is similar to a native event's type
                }
                defaultEventManager.activeTarget.dispatchEvent(keyComposerEvent);

                // console.log("keyComposer Event DISPATCHED:", keyComposerEvent, event.target, keyComposer);
                if (keyComposerEvent.defaultPrevented) {
                    event.preventDefault();
                }
                if (keyComposerEvent.propagationStopped) {
                    event.stopPropagation();
                    stopped = true;
                }
                if (keyUp) {
                    // We already dispatched a keyup event for this key, let's remove it
                    delete this._triggeredKeys[keyComposer.uuid];
                } else {
                    // We need to remember any composerKey triggered during the keydown phase in order to generate an equivalent keyup
                    this._triggeredKeys[keyComposer.uuid] = keyComposer;
                }
            }

            // if the composer key even has been stopped, we need clean the list of triggered keys as we wont get a keyup event anymore.
            // We need also stop pending longPress key
            if (stopped) {
                for (i = (keyUp ? i : 0); i < nbrMatches; i ++) {
                    keyComposer = matches[i].object || matches[i];
                    delete this._triggeredKeys[keyComposer.uuid];

                    if (keyComposer._longPressTimeout) {
                        clearTimeout(keyComposer._longPressTimeout);
                        keyComposer._longPressTimeout = null;
                        delete this._longPressKeys[keyComposer.uuid];
                    }
                }
            }

            return stopped;
        }