Пользовательское событие триггера с использованием прототипа js не находит текущие вставленные значения - PullRequest
0 голосов
/ 23 февраля 2011

У меня проблема с версией прототипа в 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, которое присоединяется к текстовому полю ввода на моей странице (через Richfaces a4j: тег suppoer)

<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>


По какой-то причине он не подбирает значение, которое я вставляю, в поле ввода «предложить». Если я вставлю его во второй раз, он получит первое значение, которое я вставил. Например: Если я вставлю «Tom», запрос ajax отправит, но поле предложения будет пустым. Теперь, вставляя в 'Tom2', я вижу, что отправленное значение предложения было 'Tom' (поле содержит 'TomTom2').

Как я уже говорил, до обновления Richfaces и, следовательно, новой версии Prototype все было в порядке.

Есть идеи?

1 Ответ

0 голосов
/ 03 марта 2011

удалось исправить. Присоединение для любого, у кого есть подобная проблема.

// 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);
                    }
                }
...