如何滚动流JQuery UI对话框

时间:2012-01-16 09:04:25

标签: javascript jquery jquery-ui jquery-dialog

我一直在尝试使用跟随滚动将对话框与用户滚动一起移动但没有成功

<script>
$(function() {
    $( "#dialog:ui-dialog" ).dialog( "destroy" );
    $( "#dialog-report-problem-form" ).dialog({
        autoOpen: true,
        height: 550,
        width: 700,
        modal: true,
        buttons: {
            "<?= $this->translate('REPORT_PROBLEM'); ?>": function() {
                reportProblem();
            },
            "<?= $this->translate('CANCEL'); ?>": function() {
                $( this ).dialog( "close" );
            }
        },
        close: function() {
        }
    });
    $.scrollFollow("#dialog-report-problem-form",{speed: 10}); 
});
</script>

<div id="dialog-report-problem-form" title="<?= $this->translate('REPORT_PROBLEM'); ?>">
    <?= $this->form ?>
</div>

我收到了错误

 box.cont.offset() is null

有谁知道如何修复或其他基于jquery的解决方案来跟踪用户滚动?

1 个答案:

答案 0 :(得分:3)

插件 scrollFollow 似乎非常错误,开发已停止(2008年最后一次更新)

  • 当您使用$.scrollFollow()时,默认选项值未设置,因此您会收到很多错误,例如您获得的错误。
  • $(...).scrollFollow一起使用时,主选项容器未正确获取,因此无法正常工作...

这是一个小脚本,可以在滚动窗口时移动对话框:

(function(wnd, $) {

        // query for elements once
    var $dlg = $("#dialog-report-problem-form").parent(),
        $wnd = $(wnd),
        // get the initial position of dialog
        initialTop = $dlg.offset().top - $wnd.scrollTop();

    $wnd.scroll(function() {
            // when qscrolling, animate the 'top' property
            $dlg.stop()
                .animate({
                    "top": ($wnd.scrollTop() + initialTop) + "px"
                }, "slow");
        })
        .resize(function() {
            // in case of resize, re-set the initial top position of the dialog
            initialTop =  $dlg.offset().top - $wnd.scrollTop();
        });

    // if you close/open the dialog, it will mess up the 'initialTop'
    // this will re-set the correct 'initialTop' when the dialog opens again
    $dlg.bind('dialogcreate dialogopen', function(e) {
        initialTop = $dlg.offset().top - $wnd.scrollTop();
    });

})(window, jQuery);

jsfiddle上的工作示例。