如何在Xpage中将Editbox的模式从读取模式更改为编辑模式

How to change the mode of Editbox from read mode to edit mode in Xpage?

本文关键字:模式 读取 编辑 Xpage 中将 Editbox      更新时间:2023-09-26

实际上,我已经为特定字段的Xpage中的属性-只读设置了true。

我已经尝试将其模式更改为在客户端javascript中进行编辑。但我无法改变
我使用了以下代码。。。

document.getElementById("#{id:read}").readOnly=false; 

以及

dojo.attr("#{id:read}","readOnly",false); 

两者都失败了。。。

(@Trim)
Also in Server side Javascript XSP Code is:      
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" dojoParseOnLoad="true"
dojoTheme="true">
<xp:this.resources>
    <xp:dojoModule name="dijit.Dialog"></xp:dojoModule>
</xp:this.resources>
<div id="dojoTest" dojoType="dijit.Dialog">
<xp:inputText id="field" defaultValue="Hello" readonly="true"></xp:inputText>
<xp:button value="Label" id="button1">
    <xp:eventHandler event="onclick" submit="true"
        refreshMode="partial" refreshId="field">
        <xp:this.action> <![CDATA[{javascript:getComponent("field").setReadonly(false);}]]></xp:this.action>
    </xp:eventHandler></xp:button>
<xp:br></xp:br></div>
<xp:br></xp:br>
<xp:br></xp:br>
<xp:button value="Show Popup" id="button2">
    <xp:eventHandler event="onclick" submit="false">
        <xp:this.script><![CDATA[dijit.byId("dojoTest").show();]]> </xp:this.script>
    </xp:eventHandler></xp:button>
</xp:view>

经过进一步审查,此问题与字段本身无关:问题中包含的代码适合所需的响应。相反,问题在于事件是在dijit中定义的。对话

Dojo解析对话框时,出于布局原因,会将DOM元素移动到主体的末尾。不幸的是,这也会将其移出表单。这会中断任何服务器端事件,因为事件数据不再作为表单的一部分进行序列化。因此,在您的示例中,事件失败不是因为事件代码错误,而是因为事件本身从未被触发。

理想的解决方案是使用扩展库(或8.5.3 UP1)中的Dialog组件,而不是使用指定dojoType的passthroughdiv。如果这不是一个选项,那么有一个变通方法。。。在页面底部添加以下组件:

<xp:scriptBlock>
    <xp:this.value><![CDATA[XSP.addOnLoad(function(){
    var dominoForm = XSP.byId("#{javascript:return view.findScriptCollector().getClientId(facesContext);}");
    dojo.query("div.dijitDialog").forEach(function(eachDialog){
        dojo.place(eachDialog, dominoForm, "last");
    });
});]]></xp:this.value>
</xp:scriptBlock>

这将导致所有已解析的对话框都移回表单中,从而使其中的事件能够再次正常启动。

如果您想在服务器端执行此操作,下面是一个切换读取/编辑模式的按钮示例:

var comp = getComponent("inputText1");
if (comp && !comp.isReadonly()) {
    comp.setReadonly(true);
}else if (comp && comp.isReadonly()) {
    comp.setReadonly(false);
}

看看这个网站,可以看到所有可以通过SSJS进行交互的组件的所有属性。

通过使用<xp:inputText id="read"readonly="true">lt/xp:inputText>

服务器创建<SPAN标记-无法转换为文本字段

<span id="view:_id1:inputText1">lt/span>

在8.5.3中,您将转到字段上的所有属性,并添加一个值为True 的READONLY属性

这将创建以下标记

<xp:inputText id="read" defaultValue="Marky">
    <xp:this.attrs>
        <xp:attr name="READONLY" value="true"></xp:attr>
    </xp:this.attrs>
</xp:inputText>

在R8.5.3之前的版本中,您可以使用在页面的onClientLoad事件上以编程方式将READONLY属性添加到字段中

dojo.attr("#{id:read}"、"READONLY"、"true");

这是标记

<xp:inputText id="read" defaultValue="Marky">
</xp:inputText>
<xp:eventHandler event="onClientLoad" submit="false">
    <xp:this.script><![CDATA[dojo.attr("#{id:read}", "READONLY", "true");]]></xp:this.script>
</xp:eventHandler>

然后,一旦你在表单上正确创建了字段,你就可以使用进行编辑

document.getElementById("#{id:read}").removeAttribute('readOnly');