下面的代码可以正常工作,但如果我粘贴的字符串超过10个字符,则只应粘贴前10个字符。目前它不这样做,我如何防止超过10个字符被粘贴?
http://jsfiddle.net/qfzkw/2/

最佳答案

如前所述,<textarea maxlength="10">只适用于少量情况,但并非所有情况。
很难确定如何阻止用户(例如在firefox中)进入文本区域,选择browser菜单Edit,然后单击Paste。我真的不知道该怎么防止。您可以检查keydown事件以防止ctrl+v。您可以禁用上下文菜单以禁止右键单击文本区域(尽管恶意用户可以编辑前端javascript,然后重新启用此功能)。
简而言之,没有通用的方法可以阻止用户以适当的方式粘贴。
然而,你可以破解一个解决方案(当似乎没有办法继续做你真正想要的事情时,总是我最喜欢的)。我要建议的这个方法取决于你有多少计时器。如果你有多个动画计时器,google建议你尝试将它们都折叠成一个计时单元,其他的计时单元都来自这个计时单元。如果是这样,请重构您的计时器。
实现全局计时器。实现一个基于该计时器运行25毫秒的函数。缓存文本区域的内容。看看这些内容有没有变化。
文本区域

<textarea id="maintextarea"></textarea>

脚本
/*init*/
var globalTimer = new Date();
var cachedText = document.getElementById("maintextarea").value;
var iterationCount = 0;

function cacheText() {
    cachedText = document.getElementById("maintextarea").value;
}

function upDateTimer() {
    globalTimer = new Date();
    var timerTimeout = setTimeout('upDateTimer()', 5);
    timeBasedOperations();
}
upDateTimer();

function timeBasedOperations() {
    iterationCount++;//this will allow timing to occur
    //TODO: Add in other timers calls based on global timer
    if (iterationCount % 5) {//every fifth iteration (hence 25ms)
        checkTextArea();
    }
}

function checkTextArea() {
    var currentText = document.getElementById("maintextarea").value;
    var textArea = document.getElementById("maintextarea");
    if (currentText.length > cachedText.length) {
        //TODO: Add additional logic for catching a paste or text change
        textArea.value = currentText.substr(0, 10);
    }
    cacheText();
}

我认为虽然这实现了一个计时器,但这是一个非常实用的解决方案。它也碰巧起作用(经过测试)。
:)

10-05 20:44
查看更多