捕获 asp.net 文本框上的鼠标点击

Capturing mouseclick on an asp.net Textbox

我有一个弹出框,允许用户输入简短的(50 个字符)注释。我需要做的是弄清楚如何防止用户使用鼠标右键单击 copy/pasting 注释。

我在所有 events available 中查找了一个文本框,onkeyup 和 onkeydown 不在此列表中,但它们确实有效。

我有以下 JavaScript 可以捕获击键:

<!--//**********************************
    // Comment Character Count
    //**********************************  -->
<script type="text/javascript">
     function textCounter(field, countfield, maxlimit) {
     if (field.value.length > maxlimit)
        field.value = field.value.substring(0, maxlimit);
     else
        countfield.value = maxlimit - field.value.length;
     }
 </script>

然后这个文本框在按下某个键时调用上述函数:

<asp:TextBox ID="txtCommentBox" TextMode="MultiLine" CssClass="textbox" Wrap="True" 
Height="70px" Width="270px" Font-Size="Small" Rows="3" runat="server"  
onkeyup="textCounter(this, this.form.remLen, 50);" 
onkeydown="textCounter(this, this.form.remLen, 50);" />

一切都很好,除了当有人右键单击并选择 "Paste" 时,它会绕过检查,因为没有按下任何键。关于如何捕获它的任何想法?是否有我可以调用的未记录的 onmouseclick 事件?

使用TextBox.MaxLength属性。即使在粘贴文本时,它也会阻止添加其他字符。您还可以添加 asp.net 自定义验证器以确保用户没有在浏览器编辑器中更改您 html。

<asp:TextBox ID="txtCommentBox" TextMode="MultiLine" CssClass="textbox" Wrap="True" 
Height="70px" Width="270px" Font-Size="Small" Rows="3" runat="server" MaxLength="50"/>

首先,向您的文本框添加一个 onpaste 事件:

<asp:TextBox ID="txtCommentBox" TextMode="MultiLine" CssClass="textbox" Wrap="True" 
Height="70px" Width="270px" Font-Size="Small" Rows="3" runat="server"  
onkeyup="textCounter(this, this.form.remLen, 50);" 
onkeydown="textCounter(this, this.form.remLen, 50);"
onpaste="textCounter(this, this.form.remLen, 50);" />

接下来,调整 Fabrício Matté's 解决方案来处理 onpaste 触发和 value 填充之间的时间差异:

function textCounter(field, countfield, maxlimit) {
    setTimeout(function () {
        if (field.value.length > maxlimit)
            field.value = field.value.substring(0, maxlimit);
        else
            countfield.value = maxlimit - field.value.length;

    }, 0);
}