【问题标题】:Overwrite ID generation in JSF / XPages not to use :?不使用 JSF/XPages 中的覆盖 ID 生成:?
【发布时间】:2013-02-13 03:20:32
【问题描述】:

当像这样在 XPages 中定义一个元素时:

    <xp:div id="chartSurface"></xp:div>

生成的 HTML 如下所示:

    <div id="view:_id1:_id4:chartSurface"></div>

这是“必要的”,因为 ID 必须是唯一的,并且 JSF/XPages 元素可以重复多次。虽然我可以使用#{id:chartsurface} 获取客户端ID,但这使得寻址元素变得不必要地困难,因为“:”与CSS 伪选择器和d3js 之类的库发生冲突失败(尚未使用jQuery 对其进行测试,dojo.byId 似乎可以工作)。有没有办法告诉 JSF/XPages 使用不同的分隔符(例如 NONE 或 %),所以结果如下所示:

    <div id="view_id1_id4chartSurface"></div>
    <div id="view%_id1%_id4%chartSurface"></div>

额外问题:哪些分隔符可以保存以供使用?

【问题讨论】:

  • 相关:Is it possible to change the element id separator in JSF? 我不知道这是不是重复的问题,因为我从未听说过 XPages。
  • @LuiggiMendoza 是的,重复。 XPages 是一个 JSF 实现,它在 IBM Domino 服务器上运行,并向其中添加服务器端 JavaScript 和 NoSQL 数据库,包括目录。但它有自己的曲折,所以可能只有 80% 重复。谢谢指出
  • 不客气。请注意,init 参数仅适用于 JSF 2(因此请检查 XPages 是否基于 JSF 2)。
  • XPages 源自 JSF 1.1,但尽管实现了许多相同的功能,但仍偏离了 JSF 2 规范。
  • 如您所说:控件可能在一页中重复。那么你对 ID 属性有什么坚持(反正不推荐)?您可以通过 styleClass 属性和在选择器中使用类来简化它。

标签: jsf xpages


【解决方案1】:

据我所知,没有办法使用配置来更改分隔符,因为它被硬编码到 xpages 源代码中(更具体地讲到 UIComponentBase 中)。

理论上你可以尝试用渲染器替换clientId。有一个公共方法 convertClientId(FacesContext context, String clientId) 可以被覆盖,例如可以用其他字符序列替换所有 ':'。

不幸的是,我不确定 findComponent 功能是否会在此更改后正常工作。

【讨论】:

    【解决方案2】:

    正如@W_K 指出的那样,没有简单的方法。总之,有 4 种策略来处理这种情况:

    1. 耸耸肩移动一个
    2. 覆盖渲染器
    3. 修复客户端的clientid
    4. 修正您的查询

    1 & 2 在旁观者的眼中。对于#3,我目前使用 2 个函数,一个 SSJS,一个 CSJS:

       function getSimpleClientID(oldID) {
       /* Server side function */
            // Removes the : from a clientID, so it can be used easily in CSS3 selectors
            return oldID.replace(/:/g,"");
       }
    
       function fixClientIds() {
       /* Client side function */
       // Update all ID function with simplified IDs    
          dojo.query("*[id]:not([type='hidden'])").forEach(function(node, index, arr){
             if (node.className != "xspForm") {
                 node.id = getSimpleClientID(node.id);
             }
          });   
        }
    

    在我的 SSJS 中,我不调用 getClientId("myControl"),而是调用 getSimpleClientID(getClientId("myControl")),并在 XSP.addOnLoad() 中调用 fixClientIds()。

    感谢 Luiggi 指出的链接,第 4 个选项是调整您可能使用 escapeClientID(getClientId("myControl")) 与此功能传递的查询:

       function escapeClientID(oldID) {
       /* Server side function */
            // Removes the : from a clientID, so it can be used easily in CSS3 selectors
            return oldID.replace(/:/g,"\\:");
       }
    

    (我没有正确测试过那个)

    【讨论】:

    • 只是一个想法:如何使用反向代理和过滤器(例如 Apache mod_proxy 和 mod_sed)来替换 ID?
    • 可能,但有点矫枉过正。也使测试变得困难
    猜你喜欢
    • 2022-01-16
    • 2011-05-06
    • 2012-07-24
    • 2014-08-22
    • 2014-02-23
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多