Xpages 如何从计算的HTML链接调用SSJS函数?

Xpages 如何从计算的HTML链接调用SSJS函数?,xpages,xpages-ssjs,Xpages,Xpages Ssjs,我在xpage上有一个计算字段,其结果是HTML。在HTML中,我想计算一个链接,该链接将触发一些服务器端js函数,然后进行部分刷新 我当前的代码如下所示: <a href="#" onclick="return myFunction()">Click Here</a> <xp:eventHandler event="name" id="eventhandler1a"> <xp:this.action> <xp:sa

我在xpage上有一个计算字段,其结果是HTML。在HTML中,我想计算一个链接,该链接将触发一些服务器端js函数,然后进行部分刷新

我当前的代码如下所示:

<a href="#" onclick="return myFunction()">Click Here</a>
<xp:eventHandler event="name" id="eventhandler1a">
    <xp:this.action>
        <xp:saveDocument />
    </xp:this.action>
</xp:eventHandler>

如果我的js函数是一个客户端函数,那么这将起作用,但是我想使用这个函数来设置文档中某个字段的值,所以我需要SSJS


从xpage中的控件托盘创建的静态链接允许该链接通过部分刷新调用SSJS。如何使用计算的HTML链接执行此操作?

链接控件不是静态的。您可以根据需要计算任何内容,例如:

<xp:link escape="true" id="lnk">
   <xp:this.value><![CDATA[#{javascript:"#"}]]></xp:this.value>
   <xp:this.text><![CDATA[#{javascript:"Label here"}]]></xp:this.text>
</xp:link>

链接控件不是静态的。您可以根据需要计算任何内容,例如:

<xp:link escape="true" id="lnk">
   <xp:this.value><![CDATA[#{javascript:"#"}]]></xp:this.value>
   <xp:this.text><![CDATA[#{javascript:"Label here"}]]></xp:this.text>
</xp:link>


如果在
myFunction()
客户端函数中使用对象,则可以继续使用代码。这允许您调用部分刷新。另一个选项是调用Extlib JSON控件,并将逻辑放在那里。稍微取决于您的编码风格

如果您在
myFunction()
客户端函数中使用对象,则可以继续使用代码。这允许您调用部分刷新。另一个选项是调用Extlib JSON控件,并将逻辑放在那里。稍微取决于您的编码风格

另一个选项可以是创建您自己的事件处理程序,并通过本中描述的客户端JavaScript代码执行。因此,假设您创建一个事件处理程序,如下所示:

<a href="#" onclick="return myFunction()">Click Here</a>
<xp:eventHandler event="name" id="eventhandler1a">
    <xp:this.action>
        <xp:saveDocument />
    </xp:this.action>
</xp:eventHandler>
然后,您可以通过以下客户端JavaScript代码调用事件处理程序:

XSP.executeOnServer = function () {
    // the event handler id to be executed is the first argument, and is required
    if (!arguments[0])
        return false;
    var functionName = arguments[0];

    // OPTIONAL - The Client Side ID that is partially refreshed after executing the event handler
    var refreshId = (arguments[1]) ? arguments[1] : "@none";
    var form = (arguments[1]) ? this.findForm(arguments[1]) : dojo.query('form')[0];

    // catch all in case dojo element has moved object outside of form...
    if (!form)
        form = dojo.query('form')[0];

    // OPTIONAL - Options object containing onStart, onComplete and onError functions for the call to the
    // handler and subsequent partial refresh
    var options = (arguments[2]) ? arguments[2] : {};

    // OPTIONAL - Value to submit in $$xspsubmitvalue. can be retrieved using context.getSubmittedValue()
    var submitValue = (arguments[3]) ? arguments[3] : '';

    // Set the ID in $$xspsubmitid of the event handler to execute
    dojo.query('[name="$$xspsubmitid"]')[0].value = functionName;
    dojo.query('[name="$$xspsubmitvalue"]')[0].value = submitValue;
    this._partialRefresh("post", form, refreshId, options);
}
XSP.executeOnServer('#{id:eventhandler1a}', '#{id:panel1}')

这里的
panel1
指的是将部分刷新的控件。

另一个选项可以是创建自己的事件处理程序,并通过本中描述的客户端JavaScript代码执行。因此,假设您创建一个事件处理程序,如下所示:

<a href="#" onclick="return myFunction()">Click Here</a>
<xp:eventHandler event="name" id="eventhandler1a">
    <xp:this.action>
        <xp:saveDocument />
    </xp:this.action>
</xp:eventHandler>
然后,您可以通过以下客户端JavaScript代码调用事件处理程序:

XSP.executeOnServer = function () {
    // the event handler id to be executed is the first argument, and is required
    if (!arguments[0])
        return false;
    var functionName = arguments[0];

    // OPTIONAL - The Client Side ID that is partially refreshed after executing the event handler
    var refreshId = (arguments[1]) ? arguments[1] : "@none";
    var form = (arguments[1]) ? this.findForm(arguments[1]) : dojo.query('form')[0];

    // catch all in case dojo element has moved object outside of form...
    if (!form)
        form = dojo.query('form')[0];

    // OPTIONAL - Options object containing onStart, onComplete and onError functions for the call to the
    // handler and subsequent partial refresh
    var options = (arguments[2]) ? arguments[2] : {};

    // OPTIONAL - Value to submit in $$xspsubmitvalue. can be retrieved using context.getSubmittedValue()
    var submitValue = (arguments[3]) ? arguments[3] : '';

    // Set the ID in $$xspsubmitid of the event handler to execute
    dojo.query('[name="$$xspsubmitid"]')[0].value = functionName;
    dojo.query('[name="$$xspsubmitvalue"]')[0].value = submitValue;
    this._partialRefresh("post", form, refreshId, options);
}
XSP.executeOnServer('#{id:eventhandler1a}', '#{id:panel1}')

这里的
panel1
指的是将部分刷新的控件。

这在很大程度上是有意义的,但我仍然不知道如何获取我在客户端JS中设置的值。我想在部分刷新后在面板上使用事件,但OnClient Load事件不会在部分刷新时触发。我尝试使用Naveen建议的方法(以及在您的XSP对象帖子上),但无法确定在何处使用context.getSubmittedValue,因为我不是从SSJS开始触发此代码。我想获取我在CSJS中设置的值,并在面板部分刷新之前使用它来更改后端。context.getSubmittedValue()是一种SSJS,它会进入通过部分刷新触发的代码中。例如,当您刷新面板时,您可以将其放入其中的任何元素中。专业提示:它可能有HTML参数:style:visibility:hiddenPerfect。这帮了大忙。谢谢你选了哪一个?XSP或JSON使用了XSP技术,这在很大程度上是有道理的,但我仍然不知道如何获取我在客户端JS中设置的值。我想在部分刷新后在面板上使用事件,但OnClient Load事件不会在部分刷新时触发。我尝试使用Naveen建议的方法(以及在您的XSP对象帖子上),但无法确定在何处使用context.getSubmittedValue,因为我不是从SSJS开始触发此代码。我想获取我在CSJS中设置的值,并在面板部分刷新之前使用它来更改后端。context.getSubmittedValue()是一种SSJS,它会进入通过部分刷新触发的代码中。例如,当您刷新面板时,您可以将其放入其中的任何元素中。专业提示:它可能有HTML参数:style:visibility:hiddenPerfect。这帮了大忙。谢谢你选了哪一个?XSP或JSON使用了XSP技术。这类似于stwissel的响应,也帮助我获得了解决方案。谢谢这与stwissel的反应类似,也帮助我得到了解决方案。谢谢