使用原型js找不到当前粘贴值的自定义触发事件

时间:2011-02-23 17:07:03

标签: javascript jsf richfaces prototypejs

我在Richfaces 3.3.3中遇到了原型版本的问题。

下面列出的代码在升级Richfaces之前工作正常。

Event.observe('#{formName}:suggest', 'paste', this.handleMousePaste.bind(this));


        // Trigger keyup event when user copy and pastes data into field. (Using mouse to paste will not work without this fix)
        function handleMousePaste(event) {

            // Get element object event occured on
            var element = Event.element(event);

            // Trigger a keyup event which will send ajax request to server (Event already attached in Richfaces code)
            triggerEvent(element,'keyup');

        }

        // Create custom function that will allow us trigger an event anywhere in our javascript code
        function triggerEvent(element,event){
            if (document.createEventObject)
            {
                // dispatch for IE
                var evt = document.createEventObject();

                return element.fireEvent('on'+event,evt)
            }
            else
            {
                // dispatch for firefox + others
                var evt = document.createEvent("HTMLEvents");
                evt.initEvent(event, true, true ); // event type,bubbling,cancelable

                return !element.dispatchEvent(evt);
            }
        }


它在做什么: handleMousePaste()正在触发keyup事件,该事件附加到我页面上的输入文本字段(Via Richfaces a4j:suppoer tag)

<h:inputText value="#{myBean.typed}" id="suggest" styleClass="dataTableFilterField">
                <a4j:support event="onkeyup" reRender="Table1,tableScroller" ajaxSingle="true" requestDelay="200" ignoreDupResponses="true" eventsQueue="filterQueue"/>     
            </h:inputText>

由于某种原因,它没有将我粘贴的值粘贴到输入字段'suggest'中。如果我再次粘贴它,它将获取我粘贴的第一个值。例如: 如果我粘贴'Tom',则ajax请求会发送,但建议字段为空。现在粘贴在'Tom2'中我可以看到发送的建议值是'Tom'(该字段包含'TomTom2')。

就像我说的那样,在升级Richfaces之前表现得很好,因此我相信新版本的Prototype。

任何想法?

1 个答案:

答案 0 :(得分:0)

管理修复它。适用于有类似问题的人。

// Attach js handlers when page content is fully loaded (Prototype.js framework)
                Event.observe(window, 'load', function() {

                    // Only attach event listener if the element exists on page
                    if ( $('#{formName}:suggest') ) {                   
                        Event.observe('#{formName}:suggest', 'paste', this.handleMousePaste.bind(this));
                    }   
                });


                // Trigger keyup event when user copies and pastes data into field. (Using mouse to paste will not work without this fix)
                function handleMousePaste(event) {

                    // Need to put a tiny delay in so the element has time to get the pasted in content.
                    setTimeout(function() {this.triggerEvent($('#{formName}:suggest'),'keyup')}, 10);
                }

                // Create custom function that will allow us trigger an event anywhere in our javascript code
                function triggerEvent(element,event){
                    if (document.createEventObject)
                    {
                        // dispatch for IE
                        var evt = document.createEventObject();

                        return element.fireEvent('on'+event,evt);
                    }
                    else
                    {
                        // dispatch for firefox + others
                        var evt = document.createEvent("HTMLEvents");
                        evt.initEvent(event, true, true ); // event type,bubbling,cancelable

                        return !element.dispatchEvent(evt);
                    }
                }