How to avoid repeatedly click a button in a form?

前端 未结 4 775

My code:


    
        

        
相关标签:
4条回答
  • 2020-12-13 15:51

    For the newer versions of PrimeFaces, the solution would be:

     <p:commandButton widgetVar="saveButton"
                     onclick="PF('saveButton').disable()"
                     value="save"
                     action="#{treeTableController.saveNewNodes}" 
                     oncomplete="PF('saveButton').enable();PF('Dlg').hide()"
                     update="productDataForm"/>
    
    0 讨论(0)
  • 2020-12-13 15:53

    As a generic approach you could customize the button renderer.

    I use this renderer for a PrimeFaces p:commandButton:

    public class CommandButtonSingleClickRenderer extends CommandButtonRenderer {
    
        @Override
        protected void encodeMarkup(FacesContext context, CommandButton button) throws IOException {
            if (isEligible(button)) {
                String widgetVar = button.resolveWidgetVar(context);
                String onClick = getAttributeValue(context, button, "onclick");
                String onComplete = getAttributeValue(context, button, "oncomplete");
                button.setOnclick(prefix(onClick, getToggleJS(widgetVar, false)));
                button.setOncomplete(prefix(onComplete, getToggleJS(widgetVar, true)));
            }
            super.encodeMarkup(context, button);
        }
    
        protected boolean isEligible(final CommandButton button) {
            return button.isAjax()
                   && button.isRendered()
                   && button.getActionExpression() != null
                   && !button.isDisabled()
                   && !isConfirmation(button);
        }
    
        protected boolean isConfirmation(final CommandButton button) {
            String styleClass = button.getStyleClass();
            return styleClass != null && styleClass.contains("ui-confirmdialog");
        }
    
        protected String getToggleJS(final String widgetVar, final boolean enabled) {
            return String.format("var w=PF('%s');if(w){w.%sable();};", widgetVar, enabled ? "en" : "dis");
        }
    
        protected String getAttributeValue(final FacesContext context, final CommandButton button, final String attribute) {
            ValueExpression ve = button.getValueExpression(attribute);
            return ve == null ? null : (String) ve.getValue(context.getELContext());
        }
    
        protected String prefix(final String base, final String prefix) {
            return base == null ? prefix : prefix + base;
        }
    
    }
    

    faces-config.xml:

    <render-kit>
      <renderer>
        <component-family>org.primefaces.component</component-family>
        <renderer-type>org.primefaces.component.CommandButtonRenderer</renderer-type>
        <renderer-class>com.whatever.CommandButtonSingleClickRenderer</renderer-class>
      </renderer>
    </render-kit>
    

    This renderer was added to PrimeFaces extensions 8.0. If you are using PFE, you can simply add this renderer to your faces-config.xml render-kit section:

    <renderer>
      <component-family>org.primefaces.component</component-family>
      <renderer-type>org.primefaces.component.CommandButtonRenderer</renderer-type>
      <renderer-class>org.primefaces.extensions.renderer.CommandButtonSingleClickRenderer</renderer-class>
    </renderer>
    
    0 讨论(0)
  • 2020-12-13 15:54

    The <p:commandButton>'s Client Side API Widget:

    • PrimeFaces.widget.CommandButton

    • Method Params Return Type Description

    • disable() - void Disables button
    • enable() - void Enables button

    So you can just use like this:

    <p:commandButton widgetVar="saveButton"
                     onclick="saveButton.disable()"
                     value="save"
                     action="#{treeTableController.saveNewNodes}" 
                     oncomplete="saveButton.enable();Dlg.hide()"
                     update="productDataForm"/>
    
    0 讨论(0)
  • 2020-12-13 16:05

    Use Javascript and Timer

    <script>
    
    function disableClick(){
       document.getElementById('saveButton').disables = true;
       setTimeout('document.getElementById(\'saveButton\').disables = false', 5000)"
    }
    </script>
    
    
     <h:form id="newBSTypePanel" >
        <h:panelGrid columns="2" id="newRecod" >
            <h:outputText value="Name"/><h:inputText value="#{treeTableController.newBStypeBean.currentObject.TYPENAME.value}" required="true" />
            <p:commandButton value="save" action="#{treeTableController.saveNewNodes}" oncomplete="Dlg.hide()" onclick="disableClick()" id="saveButton" update="productDataForm"/>
            <p:commandButton value="close" oncomplete="Dlg.hide()" />
        </h:panelGrid>
    </h:form>
    
    0 讨论(0)
提交回复
热议问题