在使用JS客户端处理,提醒些问题时, 总是会有这种问题,当一个页面出现多个你定义的模块,代码总是寻找到第一个出现的, 例如如下
JS部分:
var ChangeCustomer =null;
function CustomerIDChange(sPARENT_ID,sPARENT_NAME)
{
document.getElementById('<%=txtCustomerID_ID.ClientID %>').value=sPARENT_ID;
document.getElementById('<%=txtCustomerID_NAME.ClientID %>').value=sPARENT_NAME;
}
function PopupCustomerID()
{
ChangeCustomer=CustomerIDChange;
return window.open('<%=this.ModulePath %>../VAP.Modules.Customer/PopupCustomer.aspx' ,'PopupCustomerID','width=600,height=400,resizable=1,scrollbars=1');
}
HTML部分:
<td class="SubHead" width="125">
<dnn:Label ID="lblCustomerID" runat="server" ControlName="lblCustomerID" Suffix=":" />
</td>
<td style="width: 526px">
<input id="txtCustomerID_ID" runat="server" style="width: 34px" type="hidden" />
<input id="txtCustomerID_NAME" runat="server" readonly="readonly" style="width: 268px"
type="text" /><input id="btnCustomerID" onclick="return PopupCustomerID();" type="button"
value="查找" />
</td>
实际应用中,如果这个模块代码被应用多次,那么<%=txtCustomerID_ID.ClientID%> 总是找到第一个出现的,实践证明这并不是最好的方法.
正确的应该是这样.
JS部分:
<script type="text/javascript">
<!--
var sSelectNameUserContext='';
var sModuleTag='<%=this.ClientID %>' + '_';
function ItemPriceChanged(fldValue)
{
var fldAjaxErrors=document.getElementById(sModuleTag+ 'AjaxErrors');
if (fldValue.value!='')
{
var nValue = parseFloat(fldValue.value);
if (isNaN(nValue))
{
fldAjaxErrors.innerHTML='必须为数字,请检查';
}
}
}
//-->
</script>
HTML部分
<EditItemTemplate>
<asp:TextBox ID="month1" runat="server" Text='<%#Bind("month1") %>' onblur="ItemPriceChanged(this);"></asp:TextBox>
</EditItemTemplate>
--这段代码是验证用户输入,只允许他输入货币值,如果错误,用下面span提醒他.
<span id="AjaxErrors" runat="server" class="NormalRed" style="text-align: left"></span>
我们使用 var sModuleTag='<%=this.ClientID %>' + '_'; 作为前缀去标示当前模块下的控件,即可避免冲突