我正在将处理程序应用于在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;
});
};
答案 0 :(得分:0)
我得到了解决方案。问题是我的功能是在页脚高度改变之前被调用的。您需要使用Web API setTimeout
或在父函数的末尾调用您的函数。我建议延迟0毫秒执行setTimeout
,这样,在执行其余代码时会调用重要的函数。
setTimeout(myFunc2, 0);
<强>结论:强> JavaScript事件没有任何问题。您只需要确保被调用函数的顺序是正确的。