Escape JavaScript quotes in EL in a JSF component attribute

后端 未结 2 1493
忘掉有多难
忘掉有多难 2020-12-04 04:15

I have an onclick event that depends on the state of a variable. So I need to do something like

onclick=\"#{object.isEnabled ? \'ch.my.js_method(\'#{object.p         


        
相关标签:
2条回答
  • 2020-12-04 04:17

    You can escape them with \ or \\, but rules differ per EL implementation, because it isn't clear cut in EL spec (Oracle's EL impl needs single backslash, but Apache needs double backslash). And you need the += operator to string-concatenate the EL expression.

    <x:someComponent onclick="#{object.isEnabled ? 'ch.my.js_method(\'' += object.property += '\'); return false;' : 'return false;'}" />
    

    Safest bet is to just create an alias with help of <c:set>.

    E.g.

    <c:set var="js_method" value="ch.my.js_method('#{object.property}'); return false;" />
    <x:someComponent onclick="#{object.isEnabled ? js_method : 'return false;'}" />
    

    You've only still a potential problem if #{object.property} can contain JS-special characters which can in turn cause invalid JS output, such as single quotes or newlines. Head to the second link below for the solution to that.

    See also:

    • How to concatenate Strings in EL expression?
    • How do I pass JSF managed bean properties to a JavaScript function?
    0 讨论(0)
  • 2020-12-04 04:41

    I found another solution: just invert the condition and add the event afterwards. This way the quotes around the JS method are not needed:

    onclick="#{object.isEnabled == 'false' ? 'return false;' : ''} ch.my.js_method('#{object.property}'); return false;"

    0 讨论(0)
提交回复
热议问题