JavaScript:如果刚删除所选文本,则不会触发键事件

时间:2015-07-01 20:39:21

标签: javascript

我正在将处理程序应用于在textarea上发生的按键,键盘和键控等事件。它适用于所有情况,除非我选择所有文本并按backspace。将不会调用特定的已分配函数。如果我再次在textarea上按backspace,则会调用该函数。这是代码:

function myFunc(f) {
    console.log("Fired"); // Is logged when select all and remove
    var h = f.target || f.srcElement || this;
    myFunc2(f); // Doesn't get called when select all and remove
}
function myFunc2(e) {
    var $elem = $(e);
    // do important stuff
};

$textarea.addEventListener("keyup", myFunc);
$textarea.addEventListener("keydown", myFunc);
$textarea.addEventListener("keypress", myFunc);
myFunc({ target: $textarea }); // <-- Call explicitly to manage some stuff

完整代码

function elasticize(a) {
    var b = "overflow" + ("overflowY" in document.getElementsByTagName("script")[0].style ? "Y" : ""),
        e = function (h, g, j) {
            if (g.addEventListener) {
                for (var f = 0; f < h.length; f++) {
                    g.addEventListener(h[f], j, 0)
                }
            } else {
                if (g.attachEvent) {
                    for (var f = 0; f < h.length; f++) {
                        g.attachEvent("on" + h[f], j)
                    }
                }
            }
        };
    for (var c = 0; c < a.length; c++) {
        a[c].style[b] = "hidden";
        a[c].__originalRows = a[c].rows;
        var d = function (f) {
            var h = f.target || f.srcElement || this,
                g = h.scrollTop;
                window.resizeBody(h);
            h.scrollTop = 1;
            while (h.scrollTop > 0) {
                var j = h.clientHeight,
                    i = true;
                h.rows++;
                if (h.clientHeight == j) {
                    if (h.style[b]) {
                        h.style[b] = ""
                    }
                    h.scrollTop = g;
                    return
                }
                h.scrollTop = 1
            }
            if (!i) {
                while (h.scrollTop == 0 && h.rows > h.__originalRows) {
                    h.rows--;
                    h.scrollTop = 1
                }
                if (h.scrollTop > 0) {
                    h.rows++
                }
            }
            if (!h.style[b]) {
                h.style[b] = "hidden"
            }
        };
        e(["keypress", "paste", "cut", "keyup", "keydown"], a[c], d);
        d({
            target: a[c]
        })
    }
};
window.resizeBody = function(e) {
    $footer = $(e).parent(),
    $body = $footer.siblings("div.body"),
    footerHeight = $footer.height();

$body.css("margin-bottom", footerHeight + "px").height( function() {
    return window.bodyHeight - footerHeight;
});
};

1 个答案:

答案 0 :(得分:0)

我得到了解决方案。问题是我的功能是在页脚高度改变之前被调用的。您需要使用Web API setTimeout或在父函数的末尾调用您的函数。我建议延迟0毫秒执行setTimeout,这样,在执行其余代码时会调用重要的函数。

setTimeout(myFunc2, 0);

<强>结论: JavaScript事件没有任何问题。您只需要确保被调用函数的顺序是正确的。