Uploaded image for project: 'Wicket'
  1. Wicket
  2. WICKET-1914

Form.appendDefaultButtonField produces invalid JavaScript if Ajax is disabled

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.3.4, 1.3.5
    • Fix Version/s: 1.3.6, 1.4-RC2
    • Component/s: wicket
    • Labels:
      None

      Description

      Form.appendDefaultButtonField produces a line like this:
      <input type="submit" name="buttons:next" onclick=" var b=Wicket.$('next2'); if (typeof(b.onclick) != 'undefined')

      { var r = b.onclick.bind(b)(); if (r != false) b.click(); }

      else

      { b.click(); }; return false;" />

      If Ajax is disabled, var b=Wicket.$('next2') is invalid, as Wicket is not defined. I'm not familiar with what the bind() method does or whether it is needed or not, but the error is ugly and appears whenever a user tries to submit a Form by pressing Enter instead of clicking on the submit button.
      My proposed fix uses getElementById to get a reference to the submit component. Which requires that the markup ID is present.
      This can either be done on the fly inside appendDefaultButtonField() or maybe better in setDefaultButton().

      Here's the fix that works for me on non-ajax pages:

      protected void appendDefaultButtonField (MarkupStream markupStream, ComponentTag openTag) {

      AppendingStringBuffer buffer = new AppendingStringBuffer();

      // div that is not visible (but not display:none either)
      buffer.append("<div style=\"width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden\">");

      // add an empty textfield (otherwise IE doesn't work)
      buffer.append("<input type=\"text\" autocomplete=\"false\"/>");

      // add the submitting component
      final Component submittingComponent = (Component) getDefaultButton();
      submittingComponent.setOutputMarkupId(true);

      buffer.append("<input type=\"submit\" name=\"");
      buffer.append(getDefaultButton().getInputName());
      buffer.append("\" onclick=\" var b=document.getElementById('");
      buffer.append(submittingComponent.getMarkupId());
      buffer.append("'); if (b) { if (typeof(b.onclick) != 'undefined') { var r = b.onclick.bind(b)(); if (r != false) b.click(); } else { b.click(); }

      return false;}\"");
      buffer.append(" />");

      // close div
      buffer.append("</div>");

      getResponse().write(buffer);
      }

        Attachments

          Activity

            People

            • Assignee:
              ivaynberg Igor Vaynberg
              Reporter:
              tapter Matthias Keller
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: