Prevent parent page from scrolling when mouse is over embedded iframe in Firefox

前端 未结 3 780
不知归路
不知归路 2020-12-16 15:42

...without limiting the scroll inside the iframe or the need to specifically name/tag all scrollable elements.

Imagine google maps widget embedded i

相关标签:
3条回答
  • 2020-12-16 16:20

    Given all the prerequisites, I think the following is the sanest way to make this work in Firefox.

    Wrap your iframe with a div which is a little bit shorter to enable vertical scrolling in it:

    <div id="wrapper" style="height:190px; width:200px; overflow-y: auto; overflow-x: hidden;">
      <iframe id="iframeid" height="200px" width="200px" src="about:blank">
      </iframe>
    </div>
    

    Now you can center the iframe vertically and re-position it every time the wrapper receives a scroll event (it will occur when a user tries to scroll away at frame edges):

    var topOffset = 3;
    
    wrapper.scrollTop(topOffset);
    
    wrapper.on("scroll", function(e) {
        wrapper.scrollTop(topOffset);
    });
    

    Combine this with your previous fix for Chrome, and it should cover all major browsers. Here is a working example - http://jsfiddle.net/o2tk05ab/5/

    The only outstanding issue will be the visible vertical scrollbar on a wrapper div. There are several ways to go about it, for instance - Hide scroll bar, but still being able to scroll

    0 讨论(0)
  • 2020-12-16 16:29

    Since it is a bug in Firefox, the workaround is to work directly with the scroll event, instead of the mousewheel / DOMMouseScroll ones.

    The way I did: When user enters the mouse over the iframe, I set a flag to true, and when he leaves the mouse out there, I set it back to false.

    Then, when user tries to scroll, but the mouse arrow is inside the iframe, I prevent the parent window scrolling. But, unfortunately, you can't prevent the window scrolling with the usual e.preventDefault() method, so we still need another workaround here, forcing the window to scroll exactly to the X and Y positions it was already before.

    The full code:

    (function(w) {
        var s = { insideIframe: false } 
    
        $(iframe).mouseenter(function() {
            s.insideIframe = true;
            s.scrollX = w.scrollX;
            s.scrollY = w.scrollY;
        }).mouseleave(function() {
            s.insideIframe = false;
        });
    
        $(document).scroll(function() {
            if (s.insideIframe)
                w.scrollTo(s.scrollX, s.scrollY);
        });
    })(window);
    

    I've created an immediately executed function to prevent defining the s variable in the global scope.

    Fiddle working: http://jsfiddle.net/qznujqjs/16/


    Edit

    Since your question was not tagged with jQuery (although inside it, you've showed a code using the library), the solution with vanilla JS is as simple as the above one:

    (function(w) {
        var s = { insideIframe: false } 
    
        iframe.addEventListener('mouseenter', function() {
            s.insideIframe = true;
            s.scrollX = w.scrollX;
            s.scrollY = w.scrollY;
        });
        
        iframe.addEventListener('mouseleave', function() {
            s.insideIframe = false;
        });
    
        document.addEventListener('scroll', function() {
            if (s.insideIframe)
                w.scrollTo(s.scrollX, s.scrollY);
        });
    })(window);
    
    0 讨论(0)
  • 2020-12-16 16:40

    I think that will solve your problem it solved mine

        var myElem=function(event){
      return $(event.toElement).closest('.slimScrollDiv')
    }
    
    $(document).mouseover(function(e){
         window.isOnSub=myElem(e).length>0
    
    
    
    })
    
    $(document).on('mousewheel',function(e){
      if(window.isOnSub){  
    console.log(e.originalEvent.wheelDelta);      
        if( myElem(e).prop('scrollHeight')-myElem(e).scrollTop()<=myElem(e).height()&&(e.originalEvent.wheelDelta<0)){
    
          e.preventDefault()
        } 
    
    
    }
    
    })
    

    replace '.slimScrollDiv' with the element selector you want to
    prevent parent scroll while your mouse is on it

    http://jsbin.com/cutube/1/edit?html,js,output

    0 讨论(0)
提交回复
热议问题