【问题标题】:Javascript for "Paste" in RadComboBox "OnClientKeyPressing" eventRadComboBox“OnClientKeyPressing”事件中“粘贴”的Javascript
【发布时间】:2015-09-30 03:35:39
【问题描述】:

RadComboBoxOnClientKeyPressing 事件中, 我正在检查 RadComboBox 中输入的文本是否大于 5 个字符, 然后启用 asp:Button,如果没有,则禁用 asp:Button

RadComboBoxasp:Button 都在 RadGrid 内部。

如果我手动输入 5 个或 5 个以上的字符,这将非常有效, 但如果我在 RadComboBox 中粘贴 5 或 5+ 个字符,则不会,如果我粘贴,则 asp:Button 仍然禁用。

原因是:当我在RadComboBox 中粘贴一些内容时,OnClientKeyPressing 事件引发并且由于键(ctrl+v) 仅被按下一次,所以文本长度始终为 0并且根据条件(如果长度 请注意,长度从 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>

【问题讨论】:

    标签: javascript radcombobox


    【解决方案1】:

    OnClientKeyPressing 事件实际上是在按下键和使用按键中的文本填充控件之间触发的。这意味着它将始终显示您的文本长度 - 在用户输入的正常情况下为 1,并且当用户粘贴到其中时将没有文本。

    我建议改用OnClientTextChange 事件,它将在控件中的文本实际更改后触发。在这种情况下,您不需要编写条件语句来处理ctrl+v 输入。但是,这只会在组合框失去焦点后触发。

    另一个解决方案,如果您需要它在用户按下键时触发,而不是在组合框失去焦点后触发,则将您的代码包装在 setTimeout 调用中,第二个参数为 1 毫秒,这将允许控件在根据您的代码检查之前更新其文本。

    【讨论】:

    • 感谢您的回复。明白了。我只想知道,在我上面的 Javascript 代码中,在我将字符粘贴到 RadComboBox 之后,有没有办法获取文本的长度?另外,我尝试使用setTimeout,但是我的OnClientKeyPressing 事件在它下不起作用。请回复
    • 嗨,所以我将您的函数复制到小提琴中并添加了 setTimeout 调用,因为我希望它可以工作。这在我这边未经测试,但看看它是否适合你:jsfiddle.net/avzn19p4。请注意,这是直接复制的,并没有考虑到 sender.get_text().length 值现在实际上应该反映全长,而不是长度 - 1,因此假设这有效,您需要对代码进行修改.
    • 非常感谢您的帮助。它就像魅力一样!我实现了您建议的setTimeout 调用方法(也参考了您的小提琴并再次修改了我的Javascript - 在已发布的问题中更新)。现在一切正常:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 2010-09-18
    相关资源
    最近更新 更多