Javascript 在 RadComboBox "OnClientKeyPressing" 事件中 "Paste"
Javascript for "Paste" in RadComboBox "OnClientKeyPressing" event
在 RadComboBox
的 OnClientKeyPressing
事件中,
我正在检查 RadComboBox
中输入的文本是否大于 5 个字符,
然后启用 asp:Button
,如果没有则禁用 asp:Button
。
RadComboBox
和asp:Button
都在RadGrid
里面。
如果我手动输入 5 或 5 个以上的字符,这将非常有效,
但如果我在 RadComboBox
中粘贴 5 个或 5 个以上的字符,则不会,如果我粘贴,则 asp:Button
将保持禁用状态。
原因是: 当我在 RadComboBox
中粘贴内容时,OnClientKeyPressing
事件引发并且因为仅按下键 (ctrl+v) 一次,因此文本的长度始终为 0,并且根据条件(如果长度 < 3,禁用按钮)它保持禁用状态。
请注意,长度是从 0 开始的,而不是从 1 开始的。
我知道原因,但我不知道在 RadComboBox
中粘贴任何内容后如何让它检测 whole text-length
以下是Javascript到现在:
<telerik:RadCodeBlock ID="rcb" runat="server">
<script type="text/javascript">
function HandleKeyPress(sender, eventArgs) {
var len = sender.get_text().length;
var comboID = sender.get_id();
var btnSearchID = comboID.replace("ddlAccountCode", "btnSearch");
var btnCtrl = document.getElementById(btnSearchID);
//code to chk Ctrl + V
var e = eventArgs.get_domEvent();
if (e.keyCode == 86 && e.ctrlKey)
{
var len2 = sender.get_text().length; //-------Issue here : pasted text/length is always 0 (as the key is pressed only one time)
alert(len2);
if (len2 > 4) {
//alert("ctrl+v : Enable");
btnCtrl.disabled = false; //Enable
}
else {
//alert("ctrl+v : Disable");
btnCtrl.disabled = true; //Disable
}
}
else if (eventArgs.get_domEvent().keyCode != 8 && len > 4)
{
//alert("Chk manually entered text");
btnCtrl.disabled = false; //Enable
}
else if (eventArgs.get_domEvent().keyCode == 8 && len > 4){
//alert("Backspace Enable");
btnCtrl.disabled = false; //Enable
}
else {
btnCtrl.disabled = true; //Disable
}
}
</script>
</telerik:RadCodeBlock>
HTML:
<telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="false" OnNeedDataSource="RadGrid1_NeedDataSource">
<MasterTableView>
<Columns>
<telerik:GridTemplateColumn HeaderText="Acc">
<EditItemTemplate>
<telerik:RadComboBox ID="ddlAccountCode" runat="server" Height="200" Width="260"
AllowCustomText="true" OnClientKeyPressing="HandleKeyPress" >
<Items>
<telerik:RadComboBoxItem Text="Gg" />
<telerik:RadComboBoxItem Text="Gg1" />
<telerik:RadComboBoxItem Text="Gg3" />
</Items>
</telerik:RadComboBox>
<asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" OnClientClick="ButtonClicked()" UseSubmitBehavior="true" />
</EditItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
OnClientKeyPressing
事件实际上是在按下键和用按键文本填充控件之间的时间触发的。这意味着它将始终显示您的文本长度 - 在用户输入的正常情况下为 1,并且当用户粘贴到其中时还没有文本。
我建议改用 OnClientTextChange
事件,该事件将在控件中的文本实际更改后触发。在那种情况下,您不需要编写条件语句来处理 ctrl+v
输入。但是,这只会在组合框失去焦点后触发。
另一个解决方案,如果您需要它在用户按下键时触发而不是在组合框失去焦点后触发,则将您的代码包装在 setTimeout
调用中,第二个参数为 1 毫秒, 这将允许控件在根据您的代码检查之前更新其文本。
在 RadComboBox
的 OnClientKeyPressing
事件中,
我正在检查 RadComboBox
中输入的文本是否大于 5 个字符,
然后启用 asp:Button
,如果没有则禁用 asp:Button
。
RadComboBox
和asp:Button
都在RadGrid
里面。
如果我手动输入 5 或 5 个以上的字符,这将非常有效,
但如果我在 RadComboBox
中粘贴 5 个或 5 个以上的字符,则不会,如果我粘贴,则 asp:Button
将保持禁用状态。
原因是: 当我在 RadComboBox
中粘贴内容时,OnClientKeyPressing
事件引发并且因为仅按下键 (ctrl+v) 一次,因此文本的长度始终为 0,并且根据条件(如果长度 < 3,禁用按钮)它保持禁用状态。
请注意,长度是从 0 开始的,而不是从 1 开始的。
我知道原因,但我不知道在 RadComboBox
以下是Javascript到现在:
<telerik:RadCodeBlock ID="rcb" runat="server">
<script type="text/javascript">
function HandleKeyPress(sender, eventArgs) {
var len = sender.get_text().length;
var comboID = sender.get_id();
var btnSearchID = comboID.replace("ddlAccountCode", "btnSearch");
var btnCtrl = document.getElementById(btnSearchID);
//code to chk Ctrl + V
var e = eventArgs.get_domEvent();
if (e.keyCode == 86 && e.ctrlKey)
{
var len2 = sender.get_text().length; //-------Issue here : pasted text/length is always 0 (as the key is pressed only one time)
alert(len2);
if (len2 > 4) {
//alert("ctrl+v : Enable");
btnCtrl.disabled = false; //Enable
}
else {
//alert("ctrl+v : Disable");
btnCtrl.disabled = true; //Disable
}
}
else if (eventArgs.get_domEvent().keyCode != 8 && len > 4)
{
//alert("Chk manually entered text");
btnCtrl.disabled = false; //Enable
}
else if (eventArgs.get_domEvent().keyCode == 8 && len > 4){
//alert("Backspace Enable");
btnCtrl.disabled = false; //Enable
}
else {
btnCtrl.disabled = true; //Disable
}
}
</script>
</telerik:RadCodeBlock>
HTML:
<telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="false" OnNeedDataSource="RadGrid1_NeedDataSource">
<MasterTableView>
<Columns>
<telerik:GridTemplateColumn HeaderText="Acc">
<EditItemTemplate>
<telerik:RadComboBox ID="ddlAccountCode" runat="server" Height="200" Width="260"
AllowCustomText="true" OnClientKeyPressing="HandleKeyPress" >
<Items>
<telerik:RadComboBoxItem Text="Gg" />
<telerik:RadComboBoxItem Text="Gg1" />
<telerik:RadComboBoxItem Text="Gg3" />
</Items>
</telerik:RadComboBox>
<asp:Button ID="btnSearch" runat="server" Text="Search" OnClick="btnSearch_Click" OnClientClick="ButtonClicked()" UseSubmitBehavior="true" />
</EditItemTemplate>
</telerik:GridTemplateColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
OnClientKeyPressing
事件实际上是在按下键和用按键文本填充控件之间的时间触发的。这意味着它将始终显示您的文本长度 - 在用户输入的正常情况下为 1,并且当用户粘贴到其中时还没有文本。
我建议改用 OnClientTextChange
事件,该事件将在控件中的文本实际更改后触发。在那种情况下,您不需要编写条件语句来处理 ctrl+v
输入。但是,这只会在组合框失去焦点后触发。
另一个解决方案,如果您需要它在用户按下键时触发而不是在组合框失去焦点后触发,则将您的代码包装在 setTimeout
调用中,第二个参数为 1 毫秒, 这将允许控件在根据您的代码检查之前更新其文本。