Search code examples
javascriptjsfdom-eventsrichfaces

a4j:support event onkeyup not working with right click copy and paste


I've tried looking for a list of all the possible events that can be used in the a4j:support event attribute. I cant find any reference that lists them, maybe somebody can provide a link? I'm aware of the obvious ones like onclick, onchange, etc.

The reason I ask this is that I currently have an input text field. It has the onkeyup event attached to it via the a4j:support tag. It should enable a text box when the event fires. The event does not fire when a user right clicks their mouse and pastes content into the field. Is there an alternative event I could use to ensure this case is managed?

<h:inputText id="someName" value="#{myBean.example.exampleName}" maxlength="25" style="width:280px">
    <a4j:support event="onchange" reRender="exampleTab" 
        action="#{myBean.activateTabPanel}" ajaxSingle="true" 
        ignoreDupResponses="true" />
</h:inputText>

<rich:tabPanel id="exampleTab" switchType="server"
    style="width:100%;height:448px;" styleClass="top_tab"
    inactiveTabClass="inactive_tab" activeTabClass="active_tab"
    selectedTab="#{myBean.exampleTabState.selectedTab}">
    <!-- Various stuff in here --->
</rich>

## ************ Update ***********##
I actually went with a jQuery solution in the end. Was much cleaner. Code attached for anyone interested.
jQuery(document).ready(function() {
    
    // Call contructor
    var common = new Site.Common();
    
});


// Constructor
Site.Common = function() {
    
    // Only attach event listener if the element exists on page
    if ( jQuery('input[id$="suggest"]') ) {
        jQuery('input[id$="suggest"]').bind('paste', Site.Common.handleMousePaste.bind(this));
    }

};


// Trigger the keyup event when user uses mouse to paste content info a field('element')
Site.Common.handleMousePaste = function(event) {
        
    // Need to split the id (JSF adds the form name in front of the input field!)
    var idParts = event.target.id.split(':');
    
    // Reformat the id we will pass to jQuery (It does not understand formName:fieldName, need to escape the ':')
    if (idParts.length >= 2) {
        var formattedID = "#" + idParts[0] + "\\:" + idParts[1];
    }
    else {
        var formattedID = "#" + event.target.id;
    }
    
    // Need to put a tiny delay in so the element has time to get the pasted in content.
    setTimeout(function() { jQuery(formattedID).keyup(); }, 10);

};

Thanks


Solution

  • you can detect the paste event in js and activate your function then.

    attached is a link that deals with similar problem

    link

    in it change what happens after the paste is detected

    if (event.ctrlKey && event.keyCode == 86) //Paste event
       call your function