如何停止JSF重新加载页面“onclick”?

时间:2011-06-21 11:00:13

标签: javascript jsf java-ee

我从原生NPAPI / XPCOM / ActiveX获得JavaScript的结果。以前用户通过以下方式激活本机GUI:

   <h:commandLink styleClass="send-doc-link" value="#{msg.send}"
       onclick="javascript:signDocument('data');return true;"
       action="#{internalPayment.sendDocument}"/>
用户从加载项GUI退出后,

和JavaScript函数'signDocument'完成执行。

我将本机代码切换为asynhronouse模型。所以JS func'ignoDocument'返回执行imediatly并且最近必须提取结果。

我编写JS代码,如下:

function signDocument(dataTagID, tagID4Event) {
    var npapi = document.getElementById("npapi");
    npapi.Sign(langId, content, desc, ts, sign);
    mylog("OK");
    var scheduler = setInterval(
           function() {
                    mylog("FAIL");
                    if (npapi.AddonGetState() != "finished")
                        return;
                    clearInterval(scheduler);
                    out_sign = npapi.SignValue();
                    fireHTMLEvent(tagID4Event, 'click');
            }, 1000);
    }
}

尝试以1秒的间隔获得结果,并通过触发'click'事件模拟链接按下。 所有这些都可以在测试静态HTML测试中正常工作。

我将.jsf文件重写为:

  <h:commandLink styleClass="send-doc-link" value="#{msg.send}"
    onclick="javascript:signDocument('data', 'signDocumentCallbackID');return true;"/>
  <t:commandLink styleClass="hidden" id="signDocumentCallbackID" forceId="true"
    onclick="return true;" action="#{internalPayment.sendDocument}"/>

我希望调度程序获取结果和触发事件。但调度程序不会被调用,因为在用户点击第一个链接(可见)之后,JS调用本机代码,为GUI创建单独的线程并将执行返回给JS。下一页重新加载并且似乎所有JS对象都死于页面死亡(我通过'mylog'func检查这个)。

确实首先将h:commandLink标记转换为:

<a href="#" onclick="var cf = function(){javascript:signDocument('data', 'signDocumentCallbackID');return true;};var oamSF = function(){return oamSubmitForm('j_id_jsp_179411707_1','j_id_jsp_179411707_1:j_id_jsp_179411707_5');};return (cf()==false)? false : oamSF();" class="send-doc-link">...

所以我的JS代码添加了oamSubmitForm,它似乎重新加载了我的页面并删除了sheduler。

如何将特殊代码包含到onclick=""

1 个答案:

答案 0 :(得分:2)

如果您不需要使用链接调用同步支持Bean操作,则只需将<h:commandLink>替换为<h:outputLink>或仅<a>

<h:outputLink styleClass="send-doc-link" onclick="signDocument('data', 'signDocumentCallbackID')">
    <h:outputText value="#{msg.send}" />
</h:outputLink>

<a href="#" styleClass="send-doc-link" onclick="signDocument('data', 'signDocumentCallbackID')">
    <h:outputText value="#{msg.send}" />
</a>

请注意,javascript:伪协议和return true;完全是多余的。两者都是默认值。您可能也会使用return false;代替,以便阻止链接的默认操作(转到页面顶部)。