Jquery mobile silentScroll()到可折叠集合中的特定项

Jquery mobile silentScroll()到可折叠集合中的特定项,jquery-mobile,Jquery Mobile,我正在创建一个带有词汇表的jQuery移动应用程序。每当用户触摸术语表中的术语时,我希望它打开术语表,打开带有该id的可折叠文件,然后滚动到它 // get all links within an element, assign click handler var links = element.find(".glossaryLink"); links.each(function(index){ $(this).on("click", function(){ var re

我正在创建一个带有词汇表的jQuery移动应用程序。每当用户触摸术语表中的术语时,我希望它打开术语表,打开带有该id的可折叠文件,然后滚动到它

// get all links within an element, assign click handler
var links = element.find(".glossaryLink");
links.each(function(index){
    $(this).on("click", function(){
        var regex = /\W/g;
        var searchID = this.innerHTML.replace(regex, "").toLowerCase();
        // open the glossary
        window.location = "#glossary";
        var entry = $("#" + searchID);
        // This is working fine, the correct collapsible is opening
        entry.collapsible( "option", "collapsed", false );

        // But this always returns 0...
        var pos = entry.offset().top;
        // ...meaning this does nothing
        $.mobile.silentScroll(pos);
    }
});
代码似乎工作正常,因为我可以打开正确的可折叠文件(我在可折叠文件集中得到正确的
),但它的
pos
值始终为0,因此它不会滚动

声明说它不支持隐藏元素,但似乎表明在可折叠的屏幕上可以自动滚动

非常感谢任何帮助

编辑 正如我在下面的评论中所说,如果时间<500毫秒,setTimeout()技巧将不起作用。使用@Omar巧妙的解决方案,分配一个侦听器,然后立即启动它

function addGlossaryClickHandlers(element){
    var links = element.find(".glossaryLink");
    links.each(function(index){
        $(this).on("click", function(){
            var regex = /\W/g;
            var searchID = this.innerHTML.replace(regex, "").toLowerCase();
            window.location = "#glossary";
            var entry = $("#" + searchID);
            // assign listener then kick it off by expanding the collapsible
            entry.on("collapsibleexpand", function(){
                var pos = entry.offset().top;
                $.mobile.silentScroll(pos);
            }).collapsible("expand");
        });
    });
}

…但是上面的
pos
再次返回0。又被难倒了,有人能帮忙吗?尽管由于某种原因,可折叠文件中的最后一个链接已断开…

您需要将计算偏移量的逻辑移动到
设置超时

至于您的评论:通常,
setTimeout(func,0)
是标准。然而,HTML5规范声明4ms,因此您将看到一些使用了
setTimeout(func,4)
的代码示例

如果您感兴趣的是为什么这样做,这里有一个关于发生了什么以及为什么setTimeout解决了这个问题(都是由于事件)的详细介绍:


谢谢

尝试将计算
偏移量
并调用
silentScroll
的逻辑放入
setTimeout
中。这将使浏览器有机会在计算偏移量之前打开术语表。@JackPattishallJr。非常感谢,这就成功了!你想发布一个答案,这样我就可以接受吗?另外,是否需要一个普遍接受的超时来允许构建内容?(我猜这项技术在JQM的其他地方也会用到!)您不需要使用
setTimeout()
listen
collapsableexpand
函数,在这个阶段,里面的元素是可见的。@Omar这两种方法的好处是什么?一个比另一个好吗?设置超时延迟因平台/设备而异,取决于它们的处理速度。在侦听事件时,无论设备是快还是慢,只要事件发生,您都会运行代码。