scrollTop无法在Android手机中使用

时间:2012-09-04 09:15:55

标签: android jquery jquery-ui cordova jquery-mobile

正在为Andriod移动应用开发聊天功能,因为这是使用jQuery和jQuery移动主题前端。

我的问题是我正在尝试使用scrollTop()函数在底部追加新消息。 scrollTop()函数在所有浏览器中都运行良好,但在Andriod中它不起作用..任何人对此都有任何想法。 这是HTML代码:

<div data-role="page" id="chatPage">
    <div data-role="content">
        <div id="incomingMessages" style="height: 180px;overflow: auto;">
        </div>
        <label for="messageText"><strong>Message:</strong></label>
        <table width="100%">
            <tr>
                <td width="75%">
                    <textarea name="messageText" id="messageText"></textarea>
                </td>
                <td width="25%">
                    <div id="sendButtonId" style="display:block">
                        <a data-role="button" id="chatSendButton" name="chatSendButton" value="Send" make_button_disabled="enable">
                            Send
                        </a>
                    </div>
                </td>
            </tr>
        </table>
        <table>
            <tr>
                <td>
                    <div id="endChatButton">
                        <a data-role="button" id="chatCloseButton" name="chatCloseButton" value="EndChat" make_button_disabled="enable">
                            End Chat
                        </a>
                    </div>
                </td>
            </tr>
        </table>
    </div>
</div>

这是用于scrollbuttom的jQuery代码:

$("#chatSendButton").click(function() {
    var mes = $("#messageText").val();
    $("#incomingMessages").append("<div class='message'><span class='username'>" +'Admin'+ ":" +"</span> "+ mes + "</div>");
    $("#incomingMessages").scrollTop($("#incomingMessages")[0].scrollHeight);
});

7 个答案:

答案 0 :(得分:26)

似乎这个问题只发生在overflow属性设置为'scroll'时(这是我们唯一关心它的时候)。对我有用的解决方法是首先将溢出设置为'hidden',设置scrollTop,然后将溢出设置回'滚动'。

答案 1 :(得分:3)

编辑:我发现如果你将“顶级”风格设置为-120,它应该将div“向下滚动”120px。

这是一个HTML示例(抱歉所有内联样式):

<div id="container" style="position:relative; display:block; overflow:scroll; height:100px; border:1px solid;">
    <div style="position: relative; background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(rgb(255, 255, 255)), to(rgb(0, 0, 0))); height: 300px; width: 100%; background-position: initial initial; background-repeat: initial initial;" id="frm">
      <p>Message 1</p>
      <p>Message 2</p>
      <p>Message 3</p>
      <p>Message 4</p>
      <p style="color:#fff">Message you want to see right now</p>
      <p>Message 5</p>
      <p>Message 6</p>
      <p>Message 7</p>
      <p>Message 8</p>
</div>

和Javascript部分:

<script type="text/javascript">
function init()
{
    document.getElementById("setScroll").addEventListener('click',function()
    {
        document.getElementById("frm").style.top = -120;//Scroll by 120px
    });
}
</script>

我已经在3.0和4.0版本的Android上测试了这个(我必须说这是在模拟器上的想法)。

希望这有帮助!

原始讯息:

滚动顶部似乎无法在某些版本的Android中使用here报告,并且谷歌没有明确的答案(看起来主要是3.0和4.0有这个问题,2.3和贝娄或4.1没有'似乎受到了影响。)

很抱歉,但现在似乎没有解决此错误的方法。

答案 2 :(得分:3)

使用scrollTop()时,我使用以下Android支持。在我的经历中,它作为一种普遍的解决方案工作得非常好。

CSS:

.androidFix {
    overflow:hidden !important;
    overflow-y:hidden !important;
    overflow-x:hidden !important;
}

JS:

$(yourSelector).addClass("androidFix").scrollTop(0).removeClass("androidFix");

答案 3 :(得分:2)

我的解决方法是:

window.location.hash = '#element' + currentItem;

您可以跳转到具有特定ID的元素。

我知道这不是每个人的解决方案,也许我可以帮助别人。

答案 4 :(得分:1)

抱歉,我没有答案,也没有必要的声誉级别发表评论所以我必须将其作为“答案”发布。我花了很长时间研究这个试图找到一个尚未找到的解决方法。我创建了一个测试页面,可以深入了解正在发生的事情。

http://jsfiddle.net/RyLek/embedded/result/&lt; - DIV设置为自动溢出 http://jsfiddle.net/RyLek/2/embedded/result/&lt; - DIV设置为溢出滚动

问题是当您向下滚动时,.scrollTop属性不会更新到DIV中的当前位置。此外,当您设置scrollTop属性时,它实际上不会更新DIV滚动位置。

回应上述答案所作的评论“Aitor Calderon”。我尝试将overflow属性设置为滚动(参见上面的示例)并且没有任何影响。

我还尝试过市场上的一些第三方浏览器,例如Maxthon和Dolphin,它们也有这个问题。如果您运行的是Android 4.0 ICS设备,则可以从Google Play商店下载Google Chrome浏览器,该浏览器可以使用scrollTop属性。这对我来说不是一个选项,因为我们公司主要拥有不支持此浏览器的蜂窝设备。

以下是我上周在此问题上发布的一个问题:jQuery scrollTop() does not work in scrolling DIV on mobile browsers, alternatives?回复是尝试在CSS中实现这一点,但我还没有成功完成。

答案 5 :(得分:1)

我需要从页面顶部滚动到特定元素,.offset是我和Android的解决方案。 iOS版。 .scrolltop仅适用于iOS。

$('html, body').animate({scrollTop: $('#element').offset().top + 20}, 10);

答案 6 :(得分:0)

我注意到在 android .scrolltop()以小数形式返回值,这会导致计算出现问题。我已经通过 alert($(this).scrollTop());

我建议使用 Math.round() 以使其与桌面和 IOS 一样可行。 这就是我实现这一目标的方式:

var rounded = Math.round($(this).scrollTop());
if (rounded == $(this)[0].scrollHeight - $(this).height()) {

}

这对我有用!