【问题标题】:How to get an outcome value of h:link from javascript function in JSF?如何从 JSF 中的 javascript 函数中获取 h:link 的结果值?
【发布时间】:2021-10-24 20:08:16
【问题描述】:

我有一个像这样的h:link 元素

<h:link outcome="/overview.xhtml?source=menu"
        title="Overview">
            <div>...</div>
</h:link>

我想根据 JavaScript 中的 MobileMatcher 将布尔变量 phone 添加到 URI 地址。

换句话说,我想这样设置结果:

<h:link outcome="getOverviewURI()"
        title="Overview">
            <div>...</div>
</h:link>

getOverviewURI() 是返回字符串 URI 的函数:

function getOverviewURI() {
    let URI = '/overview.xhtml?phone=';
    URI += MobileMatcher.isMobile() ? "true" : "false";
    return URI;
}

但是h:link 需要一个实际的字符串并忽略 JavaScript 函数调用。我尝试在函数调用结束时使用分号,这使链接显示一个无法解析地址的警告。我还尝试在那里使用纯 JS 和 "javascript:getOverviewURI()",它应该与 &lt;a href="..."&gt; 标签一起使用,我还尝试直接更改 DOM 元素的属性,但它嵌套很深,我似乎无法重写它。

【问题讨论】:

    标签: jsf xhtml


    【解决方案1】:

    您无法从 javascript 函数中获得 h:link 的结果,因为 JSF 总是呈现服务器端,并且会尝试解析服务器端在呈现标记“a”的属性 href 上放置的内容。如果您需要动态结果,那么函数“getOverviewURI()”应该尽可能成为支持 bean 上的方法。

    或者,如果您只想导航,您可以使用“onclick”事件进行以下更改:

    <h:link onclick="getOverviewURI()"
            title="Overview">
                <div>...</div>
    </h:link>
    
    function getOverviewURI() {
        let URI = window.location.hostname +'/overview.xhtml?phone=';
        URI += MobileMatcher.isMobile() ? "true" : "false";
        window.location.href =URI;
    }
    

    注意使用 js 导航 jsf 应用程序存在一些缺点,例如不更新回 bean。

    【讨论】:

    • 很遗憾,因为我认为支持 bean 没有办法知道用户是在手机上还是在桌面上,是吗?
    • 您可以尝试始终尝试解析支持 bean 上的用户代理。或者另一种解决方案是使用来自主要面孔primefaces.org:8080/showcase/ui/ajax/… 的远程命令(第三个示例接收返回值),在 js 中执行检测逻辑并将结果发送到会话范围的 bean。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2021-07-18
    • 2016-01-16
    • 2019-06-04
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多