myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Sven Linstaedt (JIRA)" <>
Subject [jira] [Commented] (MYFACES-3904) jsf.util.Chain() is rendered with wrong event source
Date Tue, 24 Jun 2014 11:50:24 GMT


Sven Linstaedt commented on MYFACES-3904:

Having a look at the rendered element Id for the jsf.ajax.request call, the same problem may
occur here too.

> jsf.util.Chain() is rendered with wrong event source
> ----------------------------------------------------
>                 Key: MYFACES-3904
>                 URL:
>             Project: MyFaces Core
>          Issue Type: Bug
>    Affects Versions: 2.2.0
>            Reporter: Sven Linstaedt
> 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 behaviors 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

View raw message