javascript - 加载可变尺寸的图像后保持滚动位置在底部
问题描述
我有一个带有聊天功能的 Cordova 应用程序,可以从设备上的 SQLite 数据库加载图像。我有代码可以在打开聊天时将其滚动到底部,但是当此程序化滚动发生时,聊天图像可能无法完全加载。结果,当图像完全加载时,它们的高度被添加到消息容器的高度,导致容器底部移动,因此聊天屏幕不再滚动到底部。我目前的解决方案是使用突变观察器来检查img
添加到容器中的节点。这是突变观察者的回调函数的外壳:
const mutObsCb = function(mutationsList) {
if (userHasScrolledChatMessages) {
// no need to scroll down to bottom
return;
}
mutationsList.forEach(function(mutation) {
if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
[].forEach.call(mutation.addedNodes, function(node) {
if (node.matches('.nodeWithImages')) {
// this message contains at least one image
const imgs = node.querySelectorAll('img');
imgs.forEach(function(img) {
// has image request completed even if it failed?
if (img.complete) {
scrollChatToBottom();
} else {
img.onload = function() {
scrollChatToBottom();
};
}
});
}
});
}
})
};
本质上,如果图像请求已完成(通过检查complete
属性),我滚动到容器的底部,否则我将一个函数分配给图像的onload
处理程序,并在该函数中将聊天滚动到底部。
这种方法的问题是进入聊天后可能会有一个短暂但明显的时间段,此时一个或多个图像开始加载(因此滚动位置发生变化)但尚未完全加载(因此聊天尚未滚动到底部)。我不想有这么短暂的时间,我想进入聊天并让它滚动到底部,即使在图像加载时也是如此。期待您的建议,谢谢!
解决方案
推荐阅读
- python - python - pickle 引发“没有剩余空间”错误的原因?
- tslint - 打字稿:如何抑制任何分号警告
- codeigniter - 一个字段有 2 个可调用的表单验证规则
- python - Docker - 在服务之间共享本地存储
- javascript - 如何在重定向时重新渲染 React 组件
- bash - bash shell脚本从给定的时间戳中减去毫秒
- python - 如何在python的列表中存储从for循环生成的多个值类型的输出?
- windows-10 - 如何在几个小时之间限制 imacros 脚本的执行?
- python - 正则表达式 - TypeError: '>' 在 'str' 和 'int' 的实例之间不支持
- c++ - 在 Rcpp 中调用“as”没有匹配的函数