我从原生 NPAPI/XPCOM/ActiveX 获取 JavaScript 的结果。以前用户通过以下方式激活 native GUI:
<h:commandLink styleClass="send-doc-link" value="#{msg.send}" onclick="javascript:signDocument('data');return true;" action="#{internalPayment.sendDocument}"/>
和 JavaScript 函数“signDocument”在用户退出附加 GUI 后完成执行。
我将 native 代码切换到异步模型。所以 JS func 'signDocument' 立即返回执行并且必须最近获取结果。
我写的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 秒间隔内获得结果并通过触发“点击”事件模拟链接按下。 在测试静态 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 调用 native 代码,该代码为 GUI 创建单独的线程并执行返回给 JS。下一页重新加载,似乎所有 JS 对象都随着页面的消失而消失(我通过“mylog”函数检查)。
真正先将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=""
?
最佳答案
如果您不需要使用链接调用同步支持 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:
伪协议(protocol)和 return true;
完全是多余的。两者都已经是默认值。您可能还会使用 return false;
相反,这样链接的默认操作(转到页面顶部)将被阻止。
关于javascript - 如何停止 JSF 重新加载页面 "onclick"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6424210/