代码之家  ›  专栏  ›  技术社区  ›  Russ Bradberry

当DIV在视图中时激发javascript事件

  •  10
  • Russ Bradberry  · 技术社区  · 15 年前

    当页面上出现某个DIV时,是否可以触发特定的javascript事件?

    比如说,我有一个非常大的页面,比如2500x2500,我有一个40x40的分区,位于1980x1250的位置。DIV不一定是手动定位的,它可能是因为内容将其推到那里。现在,是否可以在用户滚动到DIV可见的点时运行函数?

    2 回复  |  直到 15 年前
        1
  •  10
  •   bobince    15 年前

    不是自动的。您必须捕获滚动事件,并通过比较DIV矩形和可见页面矩形的坐标来检查每次是否在视图中。

    下面是一个最小的例子。

    <div id="importantdiv">hello</div>
    
    <script type="text/javascript">
        function VisibilityMonitor(element, showfn, hidefn) {
            var isshown= false;
            function check() {
                if (rectsIntersect(getPageRect(), getElementRect(element)) !== isshown) {
                    isshown= !isshown;
                    isshown? showfn() : hidefn();
                }
            };
            window.onscroll=window.onresize= check;
            check();
        }
    
        function getPageRect() {
            var isquirks= document.compatMode!=='BackCompat';
            var page= isquirks? document.documentElement : document.body;
            var x= page.scrollLeft;
            var y= page.scrollTop;
            var w= 'innerWidth' in window? window.innerWidth : page.clientWidth;
            var h= 'innerHeight' in window? window.innerHeight : page.clientHeight;
            return [x, y, x+w, y+h];
        }
    
        function getElementRect(element) {
            var x= 0, y= 0;
            var w= element.offsetWidth, h= element.offsetHeight;
            while (element.offsetParent!==null) {
                x+= element.offsetLeft;
                y+= element.offsetTop;
                element= element.offsetParent;
            }
            return [x, y, x+w, y+h];
        }
    
        function rectsIntersect(a, b) {
            return a[0]<b[2] && a[2]>b[0] && a[1]<b[3] && a[3]>b[1];
        }
    
        VisibilityMonitor(
            document.getElementById('importantdiv'),
            function() {
                alert('div in view!');
            },
            function() {
                alert('div gone away!');
            }
        );
    </script>
    

    您可以通过以下方式来改进:

    • 抓住它 onscroll 所有的祖先 overflow scroll auto 并根据滚动位置调整左上角坐标
    • 检测 溢流 纸卷 , 汽车 hidden 裁切使DIV脱离屏幕
    • 使用 addEventListener / attachEvent 使用“调整大小/滚动”事件允许多个可见性监视器和其他内容
    • 一些兼容性黑客 getElementRect 在某些情况下,为了使命令更准确,如果您真的需要,还可以取消某些事件绑定以避免IE6-7内存泄漏。
        2
  •  0
  •   slolife    15 年前

    下面是一个使用jquery的入门示例:

    <html>
    <head><title>In View</title></head>
    <body>
        <div style="text-align:center; font-size:larger" id="top"></div>
        <fieldset style="text-align:center; font-size:larger" id="middle">
            <legend id="msg"></legend>
            <div>&nbsp;</div>
            <div id="findme">Here I am!!!</div>
        </fieldset>
        <div style="text-align:center; font-size:larger" id="bottom"></div>
    
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script>
    
    <script type="text/javascript">
        var $findme = $('#findme'),
            $msg = $('#msg');
    
        function Scrolled() {
            var findmeOffset = $findme.offset(),
                findmeTop = findmeOffset.top,
                scrollTop = $(document).scrollTop(),
                visibleBottom = window.innerHeight;
    
            if (findmeTop < scrollTop + visibleBottom) {
                $msg.text('findme is visible');
            }
            else {
                $msg.text('findme is NOT visible');
            }
        }
    
        function Setup() {
            var $top = $('#top'),
                $bottom = $('#bottom');
    
            $top.height(500);
            $bottom.height(500);
    
            $(window).scroll(function() {
                Scrolled();
            });
        }
    
        $(document).ready(function() {
            Setup();
    
        });
    </script>
    </body>
    </html>
    

    它只在DIV从底部进入视图时发出通知。此示例不会在DIV从顶部滚动时通知。

    推荐文章