我在一个网页上嵌入另一个不同域名的iframe页面.该页面的内容完全符合iframe,因此没有任何溢出的内容,也没有滚动条.但是,可以使用鼠标滚轮缩放内容.
但是在Safari和Chrome中,使用鼠标滚轮缩放也会滚动整个页面.我不希望这个滚动发生 – 只有缩放的iframe.当鼠标在iframe上方时,如何停止滚动?
我尝试在JSFiddle:https://jsfiddle.net/twodee/57a68k3h中的最小示例中重新创建问题.当我缩放绿色的iframe时,文本缩放,但页面也会滚动.
- frame = document.getElementById('myframe');
- frame_child = document.createElement('div');
- var font_size = 12;
- frame_child.addEventListener('wheel',function(e) {
- font_size += e.wheelDelta;
- frame_child.style.fontSize = font_size + 'px';
- });
- frame_child.style.width = '190px';
- frame_child.style.height = '190px';
- frame_child.innerHTML = 'this text should zoom';
- frame.contentWindow.document.body.appendChild(frame_child);
- #myframe {
- background-color: #00FF00;
- }
- <ul>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- <li>a</li>
- </ul>
- <div>
- <iframe id="myframe" height="200px" width="800px" src="about:blank"></iframe>
- </div>
- <ul>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- <li>b</li>
- </ul>
编辑:
上面的例子有点误导,因为iframe源不是由我自己的脚本动态地生成的.相反,源由单独的网站生成,该网站期望来自请求者的表单输入.这是一个更好地演示我的问题的CodePen:http://codepen.io/twodee/pen/PGqgyw.(JSFiddle只允许https:// sources.)
当我滚动iframe时,3D立方体缩放,页面滚动.
编辑:
我之后的效果是Google地图嵌入页面时所看到的.或Sketchfab.当我将这些嵌入到iframe中时,我不必在页面中做任何特殊的处理,即使没有滚动也可以进行缩放.似乎有一些嵌入式内容本身禁用滚动,但我不知道什么.
解决方法
正如其他人所说,preventDefault()适用于您的第一个例子,它是一个div.
但是,iframe到外部站点似乎不可能,因为只有某些事件被捕获在iframe上.
在这个codepen上,您可以看到鼠标指针事件被捕获在iframe上,但是点击和轮子并不是这样.
请注意console.log(target)语句和哪些工作,哪些不工作.
- <iframe id="myframe" src="http://www.w3schools.com">
- </iframe>
- <br>
- <div id="div1">
- test
- </div>
- <div id="div2">
- </div>
CSS
- iframe {
- width:600px;
- height:200px;
- border: 10px solid red;
- }
- div {
- width:600px;
- height:40px;
- border: 10px solid blue;
- }
- #div2 {
- width:600px;
- height:800px;
- border: 10px solid green;
- }
JS
- frame = document.getElementById('myframe');
- div = document.getElementById('div1');
- frame.addEventListener('mouseenter',function(e) {
- console.log('entered');
- var target = e.target;
- console.log(target);
- });
- frame.addEventListener('click',function(e) {
- console.log('clicked');
- var target = e.target;
- console.log(target);
- });
- frame.addEventListener('wheel',function(e) {
- console.log('wheel');
- var target = e.target;
- console.log(target);
- });
- font_size = 12;
- div1.addEventListener('wheel',function(e) {
- var target = e.target;
- console.log(target);
- font_size += -e.wheelDelta/100;
- this.style.fontSize = font_size + 'px';
- if(target.id === 'div1')
- e.preventDefault();
- });
更新:
由于您认为可以控制iframe内容,因此可以将轮事件处理程序添加到框架内容中.尝试这个…
框架内容上的HTML
- <div id="framedDiv">
- abc<br>
- def<br>
- ghi<br>
- jkl<br>
- mno<br>
- pqr<br>
- stu<br>
- vwx<br>
- abc<br>
- def<br>
- ghi<br>
- jkl<br>
- mno<br>
- pqr<br>
- stu<br>
- vwx<br>
- abc<br>
- def<br>
- ghi<br>
- jkl<br>
- mno<br>
- pqr<br>
- stu<br>
- vwx<br>
- </div>
JS上的框架内容
- framed = document.getElementById('framedDiv');
- font_size = 12;
- framed.addEventListener('wheel',function(e) {
- var target = e.target.id;
- console.log(target);
- font_size += -e.wheelDelta/100;
- this.style.fontSize = font_size + 'px';
- e.preventDefault();
- });