You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Sven Linstaedt (JIRA)" <de...@myfaces.apache.org> on 2014/07/09 09:24:06 UTC

[jira] [Commented] (MYFACES-3904) jsf.util.Chain() is rendered with wrong event source

    [ https://issues.apache.org/jira/browse/MYFACES-3904?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14055948#comment-14055948 ] 

Sven Linstaedt commented on MYFACES-3904:
-----------------------------------------

Sorry for answering late. As far as I tested the patch solves the problem. Nevertheless I have the feeling we need a niftier solution here. Things become very fragile, when it comes to custom behaviors.

> jsf.util.Chain() is rendered with wrong event source
> ----------------------------------------------------
>
>                 Key: MYFACES-3904
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3904
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 2.2.0
>            Reporter: Sven Linstaedt
>         Attachments: MYFACES-3904-1.patch
>
>
> When applying multiple behaviors to an component, they are rendered to be executed in chain by using jsf.util.chain(). So far so good. 
> When applying a behavior to a component, that renders multiple html input elements like h:selectManyCheckbox or h:selectOneRadio, the javascript is generated for every html elements, from which everyone gets it's own id rendered by appending a ongoing number to the clientId of the component. In the myfaces renderer code these Ids are called itemId.
> The problem is, when you apply multiple behaviors to components, which render multiple html input elements: in this case all behaviors are wrapped in a chained call, which unfortunately receives not the itemId of the currently rendered html element as the source parameter, but the clientId of the component. According to the spec, the source parameter should contain "the DOM element that triggered this Ajax request, or an id string of the element to use as the triggering element." 
> Because the event handler is bound to the html input element and not to it's parent html "wrapping" element used for layouting, the wrong event source is rendered in my option, which leads to the following side effect: Behavior scripts, that reference the current event producing html element via "this" will receive a different calling context ("this), if chain together with multiple behaviors than, if they would as single behavior, leading to all behavior scripts referencing "this" to run in the wrong context and often doing nothing meaningful at all.
> E.g.: chained invocation of 
> {code}
> <input id="form:shipmentDateCriteriaOption:0" type="radio" name="form:shipmentDateCriteriaOption" value="NEXT_WEEK" onchange="$(this).val('')">
> {code}
> and
> {code}
> <input id="form:shipmentDateCriteriaOption:0" type="radio" name="form:shipmentDateCriteriaOption" value="NEXT_WEEK" onchange="jsf.ajax.request('form:shipmentDateCriteriaOption',event,{'javax.faces.behavior.event':'valueChange'})">
> {code}
> is rendered as:
> {code}
> <input id="form:shipmentDateCriteriaOption:0" type="radio" name="form:shipmentDateCriteriaOption" value="NEXT_WEEK" onchange="jsf.util.chain(document.getElementById('form:shipmentDateCriteriaOption'), event,'$(this).val(\'\')', 'jsf.ajax.request(\'form:shipmentDateCriteriaOption\',event,{\'javax.faces.behavior.event\':\'valueChange\'})');">
> {code}



--
This message was sent by Atlassian JIRA
(v6.2#6252)