我有一个 <dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.15.1
</version>
</dependency>
滚动。通过JavaScript,我使用<div>
向<div>
添加元素。每次将元素添加到element.scrollTop = element.scrollHeight
时我都必须这样做。有没有办法自动滚动(不使用<div>
并反复滚动)并将setInterval
的滚动条固定在底部?
我的<div>
:
<div>
内容更改时是否有<div class="messages" style="height: 7em; overflow: scroll">
<div>Anonymous: Hello</div>
<div>John: Hi</div>
</div>
个事件?
更新:添加<div>
后,我无法轻松访问JavaScript代码。这就是为什么我喜欢添加一个事件监听器或其他一些机制来保持滚动条与底部挂钩。
答案 0 :(得分:2)
创建变量var index = 0
。将tabIndex
属性添加到动态创建的元素中,index
设置为.value
属性的tabIndex
。在将元素附加到父元素之后,在动态创建的元素上调用.focus()
。
var index = 0;
var div = document.createElement("div");
div.setAttribute("tabIndex", index);
document.querySelector(".messages").appendChild(div);
div.focus();
++index;
window.onload = function() {
var messages = document.querySelector(".messages");
var index = 0;
setInterval(function() {
var div = document.createElement("div");
div.setAttribute("tabIndex", index);
div.innerHTML = "abc";
messages.appendChild(div);
div.focus();
++index;
}, 2000)
}
<div class="messages" style="height: 7em; overflow: scroll">
<div>Anonymous: Hello</div>
<div>John: Hi</div>
</div>
答案 1 :(得分:0)
您可以覆盖目标元素的<{1}}方法或,您可以使用addChild
来观察DOM。
给出HTML:
MutationOvserver
覆盖方法方法:
<div id="messages-out" class="messages" style="height: 7em; overflow: scroll">
<div>Anonymous: Hello</div>
<div>John: Hi</div>
</div>
<input id="txtMessage" type="text" autofocus>
MutationObserver方法:
document.addEventListener('DOMContentLoaded', function(ev)
{
var msgs = document.getElementById('messages-out');
msgs.appendChild = function(childNode)
{
Element.prototype.appendChild.call(msgs, childNode);
msgs.scrollTop = msgs.scrollHeight;
}
document.getElementById('txtMessage').addEventListener('keypress', function(ev)
{
if(13 === ev.which)
{
var div = document.createElement('div');
div.innerHTML = '<em>nick: </em>' + ev.target.value;
msgs.appendChild(div);
ev.target.value = '';
}
});
})
注意:我们不确定document.addEventListener('DOMContentLoaded', function(ev) {
var
msgs = document.getElementById('messages-out'),
observer = new MutationObserver(function (mutations)
{
var added = false;
mutations.forEach(function (mutation) {
if ('childList' === mutation.type && 0 < mutation.addedNodes.length)
added = true;
});
if (added)
msgs.scrollTop = msgs.scrollHeight;
})
;
observer.observe(msgs, {childList: true});
document.getElementById('txtMessage').addEventListener('keypress', function(ev)
{
if(13 === ev.which)
{
var div = document.createElement('div');
div.innerHTML = '<em>nick: </em>' + ev.target.value;
msgs.appendChild(div);
ev.target.value = '';
}
});
});
方法是否用于添加消息,例如可以在行element.appendChild
或Element.prototype.appendChild.call(msgs, childNode);
中添加子项。因此,第二种方法更多的是“赶上所有”#34;之一。