You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Marcus Husar <ma...@gmail.com> on 2015/05/05 13:20:20 UTC

Problems with wicket event registration: JavaScript links are not refreshed properly

Hello,

I have two AjaxLinks inside a panel which is inside an IColumn of a
DataTable. The table is refreshed by a TextField which implements an
OnChangeAjaxBehavior. This behaviour manipulates the data provider and adds
the table to the target.

When text is entered to the text field the table is filtered as expected.
But the response body of the Ajax post request delivers event registrations
of the AjaxLinks rendered in the iteration before.

E.g.: IBehaviourlisteners for AjaxLink IDs id54 and id55 are delivered. But
the links have the IDs id56 and id57.

Example:

<div>
    <a id="id56" href="javascript:;">Edit</a>
    <a id="id57" href="javascript:;">Delete</a>
</div>

...
<evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id54","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id55","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>

If I unfocus the text field I get a response with the correct event
registrations.

...
<evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id56","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id57","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>

Has anyone seen similar problems? Is it possible enforce an event
registration refresh for AjaxLinks?

Just ask for code examples if needed.

Regards,
Marcus

Re: Problems with wicket event registration: JavaScript links are not refreshed properly

Posted by Martin Grigorov <mg...@apache.org>.
Hi,

Your description sounds somehow related to
https://issues.apache.org/jira/browse/WICKET-5432.

'input' event is not supported (properly) by all browsers. That's why
Wicket.ChangeHandler does some extra logic.
See https://developer.mozilla.org/en-US/docs/Web/Events/input

Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov

On Tue, May 5, 2015 at 7:05 PM, Marcus Husar <ma...@gmail.com> wrote:

> Hello Martin,
>
> I solved my problem 5 minutes ago. I haven’t seen your mail because I was
> working hard to find the source of this behaviour.
>
> The solution was to use AjaxFormComponentUpdatingBehavior with event type
> "input" instead of OnChangeAjaxBehavior.
>
> Martin wrote:
> > How do you trigger the update in this case? with "unfocused text field"
> >
> > I don't see any reason why Wicket will deliver out of date information
> like
> > this.
>
> For example: I entered 3 charaters into the text field which sent out one
> post request each. Each of those post requests got an Ajax response with
> correct table text and old event registrations of the table’s AjaxLinks.
> When the text field then lost its focus because of clicking somewhere on
> the page or into Firefox developer tools the browser sent out a fourth post
> request which got correct event registrations.
>
> After I switched to AjaxFormComponentUpdatingBehavior everything was fine.
>
> ...
>
> I looked into the source code of OnChangeAjaxBehaviour. What it does is to
> use the event type "onchange". Also it adds a change handler to the
> reponse:
>
> response.write("new Wicket.ChangeHandler('" + id + "');");
>
> This change handler maybe fires on change and blur. Maybe I had problems
> with AjaxLinks inside a refreshed table because of some kind of race
> condition.
>
> Let me know if you still want to see this as a quickstart.
>
> Thanks,
> Marcus
>
>
>
> Martin Grigorov <mg...@apache.org> schrieb am Di., 5. Mai 2015 um
> 16:53 Uhr:
>
> > Hi,
> >
> > On Tue, May 5, 2015 at 2:20 PM, Marcus Husar <ma...@gmail.com>
> > wrote:
> >
> > > Hello,
> > >
> > > I have two AjaxLinks inside a panel which is inside an IColumn of a
> > > DataTable. The table is refreshed by a TextField which implements an
> > > OnChangeAjaxBehavior. This behaviour manipulates the data provider and
> > adds
> > > the table to the target.
> > >
> > > When text is entered to the text field the table is filtered as
> expected.
> > > But the response body of the Ajax post request delivers event
> > registrations
> > > of the AjaxLinks rendered in the iteration before.
> > >
> > > E.g.: IBehaviourlisteners for AjaxLink IDs id54 and id55 are delivered.
> > But
> > > the links have the IDs id56 and id57.
> > >
> > > Example:
> > >
> > > <div>
> > >     <a id="id56" href="javascript:;">Edit</a>
> > >     <a id="id57" href="javascript:;">Delete</a>
> > > </div>
> > >
> > > ...
> > >
> > >
> >
> <evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id54","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id55","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>
> > >
> > > If I unfocus the text field I get a response with the correct event
> > > registrations.
> > >
> >
> > How do you trigger the update in this case? with "unfocused text field"
> >
> > I don't see any reason why Wicket will deliver out of date information
> like
> > this.
> > If you can reproduce this in a quickstart then please attach it to a
> ticket
> > in JIRA and we will take a look.
> >
> >
> > > ...
> > >
> > >
> >
> <evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id56","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id57","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>
> > >
> > > Has anyone seen similar problems? Is it possible enforce an event
> > > registration refresh for AjaxLinks?
> > >
> > > Just ask for code examples if needed.
> > >
> > > Regards,
> > > Marcus
> > >
> >
>

Re: Problems with wicket event registration: JavaScript links are not refreshed properly

Posted by Marcus Husar <ma...@gmail.com>.
Hello Martin,

I solved my problem 5 minutes ago. I haven’t seen your mail because I was
working hard to find the source of this behaviour.

The solution was to use AjaxFormComponentUpdatingBehavior with event type
"input" instead of OnChangeAjaxBehavior.

Martin wrote:
> How do you trigger the update in this case? with "unfocused text field"
>
> I don't see any reason why Wicket will deliver out of date information
like
> this.

For example: I entered 3 charaters into the text field which sent out one
post request each. Each of those post requests got an Ajax response with
correct table text and old event registrations of the table’s AjaxLinks.
When the text field then lost its focus because of clicking somewhere on
the page or into Firefox developer tools the browser sent out a fourth post
request which got correct event registrations.

After I switched to AjaxFormComponentUpdatingBehavior everything was fine.

...

I looked into the source code of OnChangeAjaxBehaviour. What it does is to
use the event type "onchange". Also it adds a change handler to the reponse:

response.write("new Wicket.ChangeHandler('" + id + "');");

This change handler maybe fires on change and blur. Maybe I had problems
with AjaxLinks inside a refreshed table because of some kind of race
condition.

Let me know if you still want to see this as a quickstart.

Thanks,
Marcus



Martin Grigorov <mg...@apache.org> schrieb am Di., 5. Mai 2015 um
16:53 Uhr:

> Hi,
>
> On Tue, May 5, 2015 at 2:20 PM, Marcus Husar <ma...@gmail.com>
> wrote:
>
> > Hello,
> >
> > I have two AjaxLinks inside a panel which is inside an IColumn of a
> > DataTable. The table is refreshed by a TextField which implements an
> > OnChangeAjaxBehavior. This behaviour manipulates the data provider and
> adds
> > the table to the target.
> >
> > When text is entered to the text field the table is filtered as expected.
> > But the response body of the Ajax post request delivers event
> registrations
> > of the AjaxLinks rendered in the iteration before.
> >
> > E.g.: IBehaviourlisteners for AjaxLink IDs id54 and id55 are delivered.
> But
> > the links have the IDs id56 and id57.
> >
> > Example:
> >
> > <div>
> >     <a id="id56" href="javascript:;">Edit</a>
> >     <a id="id57" href="javascript:;">Delete</a>
> > </div>
> >
> > ...
> >
> >
> <evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id54","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id55","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>
> >
> > If I unfocus the text field I get a response with the correct event
> > registrations.
> >
>
> How do you trigger the update in this case? with "unfocused text field"
>
> I don't see any reason why Wicket will deliver out of date information like
> this.
> If you can reproduce this in a quickstart then please attach it to a ticket
> in JIRA and we will take a look.
>
>
> > ...
> >
> >
> <evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id56","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id57","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>
> >
> > Has anyone seen similar problems? Is it possible enforce an event
> > registration refresh for AjaxLinks?
> >
> > Just ask for code examples if needed.
> >
> > Regards,
> > Marcus
> >
>

Re: Problems with wicket event registration: JavaScript links are not refreshed properly

Posted by Martin Grigorov <mg...@apache.org>.
Hi,

On Tue, May 5, 2015 at 2:20 PM, Marcus Husar <ma...@gmail.com> wrote:

> Hello,
>
> I have two AjaxLinks inside a panel which is inside an IColumn of a
> DataTable. The table is refreshed by a TextField which implements an
> OnChangeAjaxBehavior. This behaviour manipulates the data provider and adds
> the table to the target.
>
> When text is entered to the text field the table is filtered as expected.
> But the response body of the Ajax post request delivers event registrations
> of the AjaxLinks rendered in the iteration before.
>
> E.g.: IBehaviourlisteners for AjaxLink IDs id54 and id55 are delivered. But
> the links have the IDs id56 and id57.
>
> Example:
>
> <div>
>     <a id="id56" href="javascript:;">Edit</a>
>     <a id="id57" href="javascript:;">Delete</a>
> </div>
>
> ...
>
> <evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id54","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id55","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-26-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>
>
> If I unfocus the text field I get a response with the correct event
> registrations.
>

How do you trigger the update in this case? with "unfocused text field"

I don't see any reason why Wicket will deliver out of date information like
this.
If you can reproduce this in a quickstart then please attach it to a ticket
in JIRA and we will take a look.


> ...
>
> <evaluate><![CDATA[(function(){Wicket.Ajax.ajax({"c":"id56","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-editLink","e":"click"});})();(function(){Wicket.Ajax.ajax({"c":"id57","u":"./SiglumIndexPage?4-1.IBehaviorListener.0-container-fragment-siglumDataTable-body-rows-27-cells-3-cell-deleteLink","e":"click"});})();]]></evaluate></ajax-response>
>
> Has anyone seen similar problems? Is it possible enforce an event
> registration refresh for AjaxLinks?
>
> Just ask for code examples if needed.
>
> Regards,
> Marcus
>