如何防止javascript div弹出回到页面顶部?

时间:2012-06-13 22:17:18

标签: javascript css html popup

我有以下简洁的代码,当点击链接时打开一个小弹出框...问题是我在一个包含大量内容的很长页面上使用它,每当有人打开弹出窗口时,实际内容页面跳回到顶部,如果有人花了一段时间向下滚动,这很烦人。即使打开/关闭弹出窗口,如何强制页面保持在那里?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <script type="text/javascript">
            function showPopUp(el) {
                var cvr = document.getElementById("cover")
                var dlg = document.getElementById(el)
                cvr.style.display = "block"
                dlg.style.display = "block"
                if (document.body.style.overflow = "hidden") {
                    cvr.style.width = "1024"
                    cvr.style.height = "100%"
                }
            }
            function closePopUp(el) {
                var cvr = document.getElementById("cover")
                var dlg = document.getElementById(el)
                cvr.style.display = "none"
                dlg.style.display = "none"
                document.body.style.overflowY = "scroll"
            }
        </script>
        <style type="text/css">
            #cover {
                display:none;
                position:absolute;
                left:0px;
                top:0px;
                width:100%;
                height:100%;
                background:gray;
                filter:alpha(Opacity=50);
                opacity:0.5;
                -moz-opacity:0.5;
                -khtml-opacity:0.5
            }
            #dialog {
                display:none;
                position:absolute;
                top:50%;
                left:50%;
                width:400px;  /* adjust as per your needs */
                height:400px;   /* adjust as per your needs */
                margin-left:-200px;   /* negative half of width above */
                margin-top:-200px;   /* negative half of height above */
                z-index:100;
                background:white;
                padding:2px;
                font:10pt tahoma;
                border:1px solid gray
            }
        </style>
    </head>
    <body>
        <div id="cover"></div>
        <div id="dialog">
            My Dialog Content
            <br><input type="text">
            <br><input type="button" value="Submit">
            <br><a href="#" onclick="closePopUp('dialog');">[Close]</a>
        </div>
        <a href="#" onclick="showPopUp('dialog');">Show</a>   
    </body>
</html>

4 个答案:

答案 0 :(得分:1)

更改此代码:

from <a href="#" onclick="closePopUp('dialog');">[Close]</a>

<a href="javascript:void(0)" onclick="closePopUp('dialog');">[Close]</a>

还有:

<a href="#" onclick="showPopUp('dialog');">Show</a>  

为:

<a href="javascript:void(0)" onclick="showPopUp('dialog');">Show</a> 

试试。

答案 1 :(得分:0)

尝试更改此

<a href="#" onclick="closePopUp('dialog');">[Close]</a>

<a onclick="closePopUp('dialog');">[Close]</a>

和这个

<a href="#" onclick="showPopUp('dialog');">Show</a>

<a onclick="showPopUp('dialog');">Show</a>

答案 2 :(得分:0)

当您单击链接以打开弹出窗口时,您实际上导航到“#”,这会导致滚动条返回到页面顶部。你真的不应该再使用onclick属性了,最好用Javascript将事件监听器附加到元素上。

如上面的用户Sammy所述,使用func createBox(transform: SCNMatrix4) { let box = SCNBox(width: 0.5, height: 0.5, length: 0.5, chamferRadius: 1) let textField = UITextField(frame: CGRect(x: 0, y: 0, width: 60, height: 50)) textField.text = "Hello" let sides = [ textField, // Front UIColor.black, // Right UIColor.black, // Back UIColor.black, // Left UIColor.black, // Top UIColor.black // Bottom ] let materials = sides.map { (side) -> SCNMaterial in let material = SCNMaterial() material.diffuse.contents = side material.locksAmbientWithDiffuse = true return material } box.materials = materials let boxNode = SCNNode(geometry: box) boxNode.position = SCNVector3Make(transform.m41, transform.m42, transform.m43) boxNode.transform = transform sceneView.scene.rootNode.addChildNode(boxNode) } 可以防止此行为。我个人喜欢将href="javascript:void(0)"属性从href标记中删除,如果我实际上没有将其用作标准链接。唯一的缺点是你需要重新设置链接的样式,使其看起来像普通链接,因为如果它缺少<a>属性,它的样式将会有所不同。

我做了JSFiddle with a solution。如您所见,我删除了href属性并重新设置了链接的样式,使用Javascript为链接添加事件处理程序。您可以向下滚动一下并单击链接;弹出窗口将打开,滚动条将保持在同一位置。

代码:

HTML:

href

JS

<div class="container">
  <div id="cover"></div>
  <div id="dialog">
    My Dialog Content
    <br><input type="text">
    <br><input type="button" value="Submit">
    <br><a class="close-button" data-popup="dialog">[Close]</a>
  </div>
  <a class="show-button" data-popup="dialog">Show</a>   
</div>

CSS

var showButton = document.getElementsByClassName('show-button');
var closeButton = document.getElementsByClassName('close-button');

showButton[0].addEventListener('click', showPopUp);
closeButton[0].addEventListener('click', closePopUp);

function showPopUp(e) {
        e.preventDefault();
    var dialogId = e.currentTarget.getAttribute('data-popup');
    var scrollPos = window.scrollY;
    var cvr = document.getElementById("cover")
    var dlg = document.getElementById(dialogId)
    cvr.style.display = "block"
    dlg.style.display = "block"
    window.scroll(0, scrollPos);
}
function closePopUp(e) {
        e.preventDefault();
    var dialogId = e.currentTarget.getAttribute('data-popup');
    var cvr = document.getElementById("cover")
    var dlg = document.getElementById(dialogId)
    cvr.style.display = "none"
    dlg.style.display = "none"
}

答案 3 :(得分:-1)

尝试使用position:fixed而不是position:absolute。 如需更多信息,请阅读:http://www.w3schools.com/Css/css_positioning.asp

相关问题