jquery event listen on position changed

前端 未结 3 649
情书的邮戳
情书的邮戳 2020-12-19 07:09

I need to listen to an elements relative position. This is particular useful for dynamic layouting issues. There is no option to listen for CSS styles of even position() or

3条回答
  •  鱼传尺愫
    2020-12-19 07:30

    This is my solution which is based on willsteel solution. I had to monitor the changes to the width and offsetWidth. This will trigger the function even if the element has become invisible/visible due to any reason.

    See updated code below:

    jQuery.fn.onPositionChanged = function (trigger, millis) {
        if (millis == null) millis = 100;
        var o = $(this[0]); // our jquery object
        if (o.length < 1) return o;
        var lastPos = null;
        var lastOff = null;
        var lastWidth = null;
        var lastOffWidth = null;
        setInterval(function () {
            if (o == null || o.length < 1) return o; // abort if element is non existend eny more
            if (lastPos == null) lastPos = o.position();
            if (lastOff == null) lastOff = o.offset();
            if (lastWidth == null) lastWidth = o.width();
            if (lastOffWidth == null) lastOffWidth = o[0].offsetWidth;
            var newPos = o.position();
            var newOff = o.offset();
            var newWidth = o.width();
            var newOffWidth = o[0].offsetWidth;
            if (lastPos.top != newPos.top || lastPos.left != newPos.left) {
                $(this).trigger('onPositionChanged', { lastPos: lastPos, newPos: newPos });
                if (typeof (trigger) == "function") trigger(lastPos, newPos);
                lastPos = o.position();
            }
            if (lastOff.top != newOff.top || lastOff.left != newOff.left) {
                $(this).trigger('onPositionChanged', { lastOff: lastOff, newOff: newOff});
                if (typeof (trigger) == "function") trigger(lastOff, newOff);
                lastOff= o.offset();
            }
            if (lastWidth != newWidth) {
                $(this).trigger('onPositionChanged', { lastWidth: lastWidth, newWidth: newWidth});
                if (typeof (trigger) == "function") trigger(lastWidth, newWidth);
                lastWidth= o.width();
            }
            if (lastOffWidth != newOffWidth) {
                $(this).trigger('onPositionChanged', { lastOffWidth: lastOffWidth, newOffWidth: newOffWidth});
                if (typeof (trigger) == "function") trigger(lastOffWidth, newOffWidth);
                lastWidth= o.width();
            }
        }, millis);
        return o;
    };
    

提交回复
热议问题