【问题标题】:a4j:commandLink with onClick return true or false not properly workinga4j:commandLink 与 onClick 返回 true 或 false 不能正常工作
【发布时间】:2012-07-12 08:54:51
【问题描述】:

我的代码如下,

<a4j:commandLink  oncomplete="openSignatureModel();" id="requestText"  reRender="sigPassword"  title="Send Prescription"
actionListener="#{patientNotePresBackingBean.sendPrescriptionId}"
onclick="return pharmacyCheck('#{row}');"> 
<f:param name="sendPrescriptionId" value="#{patientNotePrescriptionVar.id}" />
<f:param name="processOfPrescription" value="Send" />
<h:graphicImage value="/images/send-prescribe.png" style="border:0;"></h:graphicImage>
</a4j:commandLink>

而我的 java 脚本就像...

function pharmacyCheck(rowID) {
    var a = document.getElementById("prescriptionId:patientNotePresListId:"+rowID+":pharmacyRcopiaId");
    if(a.value == -1) {
        alert("Please select Pharmacy");
        return false;
    } else {
        return true;
    }

}

实际上,当它返回 true 时,它​​应该调用 patientNotePresBackingBean.sendPrescriptionId 对吗?

但它的调用不一样....有什么原因吗?

【问题讨论】:

  • 这可能是使用 actionListener IIRC 需要一个特殊的方法签名。你为什么不改用action="..."?
  • 看我的回答,我以前遇到过你的问题,这就是我找到的解决方案。

标签: java jsf richfaces


【解决方案1】:

当您看到生成的 HTML 时,按钮/链接的 onclick 方法中会出现这样的内容:

onclick="return pharmacyCheck('#{row}');;A4J.AJAX.Submit(..."

所以onclick一开始就返回,不会发送ajax提交。要解决您的问题,请以这种方式使用您的 javascript 方法:

<a4j:commandLink onclick="if (!pharmacyCheck('#{row}')) return false;" ...>

编辑:进一步解释:

当你有这样的 JavaScript 代码时:

function X() {
    return false;
    alert("this alert won't be shown =(");
}

显然,警报永远不会触发。因此,检查生成的 HTML 是否有 onclick(特别格式化以查看相似之处):

onclick="
    return functionX();
    alert('this alert will not display either X_x');
    A4J.AJAX.Submit(...
"

onclick 代码不会触发,因为您在执行代码之前返回了一些内容。更改只会拦截false 的值并返回,如果您的方法返回true,则将执行其余代码。

注意:默认情况下,任何不返回任何内容的 javascript 方法都会返回 false。

【讨论】:

  • 没有我检查... j_id_jsp_1779705005_0','prescriptionId',event,{'oncomplete':function(request,event,data){openSignatureModel();},'similarityGroupingId':'prescriptionId:patientNotePresListId:4:requestText','parameters':{'prescriptionId :patientNotePresListId:4:requestText':'prescriptionId:patientNotePresListId:4:requestText','processOfPrescription':'Send','sendPrescriptionId':1002} ,'actionUrl':'/Oscer/pages/PatientsNotePreDetail.jsf'});返回假;
  • 好吧,我真的不知道整个生成的 HTML 将如何用于您的特定链接,但与任何其他 JavaScript 方法一样,如果您在某个地方返回任何内容,其余代码将不会不会被执行。这就是为什么您应该在返回任何内容之前添加验证。
  • 天哪,亲爱的,你是完美的......我在我的代码中添加了你所说的 if(!pharmacyCheck('#{row}')) return false; 并且它有效...但我还是不明白这条线是什么意思...你能解释一下吗...
  • 这是否意味着默认返回true?我的下一个代码将被执行,如果我从 pharmacyCheck 函数返回为假,那么它将显式返回假?是这样吗???
  • 非常感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2021-05-22
  • 2013-06-29
  • 2012-06-24
  • 1970-01-01
相关资源
最近更新 更多