javascript - 模拟框架集分隔符行为

标签 javascript html frameset

HTML5 当前规范删除了 <frameset>标签。

<frameset> 有一个很好的特性没有它就不容易复制:

在框架集中,您可以使用鼠标更改分隔框架的线的位置。

我如何提供与在 JavaScript 中使用 DIV 相同的功能?

我遇到了 the following这证明了我正在寻找的行为。但是我想避免使用 JQuery,即使使用 jQuery 应该是首选方式。

最佳答案

在查看了您的示例 fiddle 之后,我可以说,如果没有 jQuery,这实际上很容易。

那里的所有功能都只是简单的 innerHTMLstyle 操作,以及事件订阅。

在没有 jQuery 的情况下直接重写该代码将是:

var i = 0;

document.getElementById("dragbar").onmousedown = function (e) {

    e.preventDefault();
    document.getElementById("mousestatus").innerHTML = "mousedown" + i++;
    window.onmousemove = function (e) {
        document.getElementById("position").innerHTML = e.pageX + ', ' + e.pageY;
        document.getElementById("sidebar").style.width = e.pageX + 2 + "px";
        document.getElementById("main").style.left = e.pageX + 2 + "px";
    };

    console.log("leaving mouseDown");
};

window.onmouseup = function (e) {
    document.getElementById("clickevent").innerHTML = 'in another mouseUp event' + i++;
    window.onmousemove = null;
};

所以这是与 pure JS 相同的 fiddle .


编辑:正如@BenjaminGruenbaum 所指出的,覆盖 DOM 元素上的 on* 属性与指定新的事件处理程序不同。

在 DOM 元素上覆盖 onmouseuponloadonclick 等属性是“旧”方式,因此它甚至在JS的石器时代。我上面的代码就是这样写的。

现在添加和删除事件处理程序的标准方法是 addEventListenerremoveEventListener .旧版 IE 不支持它们(但这可以是 worked around )。

它让您可以将无限数量的监听器附加到同一事件,并且它们不会相互干扰。

因此可以通过以下方式实现相同的功能:

var i = 0;

function dragBarMouseDown(e) {
    e.preventDefault();
    document.getElementById("mousestatus").innerHTML = "mousedown" + i++;
    window.addEventListener("mousemove", windowMouseMove, false);
    console.log("leaving mouseDown");
}

function windowMouseMove(e) {
    document.getElementById("position").innerHTML = e.pageX + ', ' + e.pageY;
    document.getElementById("sidebar").style.width = e.pageX + 2 + "px";
    document.getElementById("main").style.left = e.pageX + 2 + "px";
}

function windowMouseUp(e) {
    document.getElementById("clickevent").innerHTML = 'in another mouseUp event' + i++;
    window.removeEventListener("mousemove", windowMouseMove, false);
}

document.getElementById("dragbar").addEventListener("mousedown", dragBarMouseDown, false);

window.addEventListener("mouseup", windowMouseUp, false);

Fiddle .

请注意,在这种情况下,我的函数不是匿名的,因此 self executing function如果您不在功能范围内,那么此处的范围界定是有意义的。

关于javascript - 模拟框架集分隔符行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16635959/

相关文章:

javascript - C# ASP.NET 如何通过 JavaScript 检索 EditorFor 的编号或类名

javascript - UnhandledPromiseRejectionWarning错误使用axios

javascript - 缩小 border-radius div 元素并保持相同位置,蛋形

javascript - Eslint:仅在插件规则上使用

javascript - 在 JavaScript 中,依赖对 "listen"的对象引用进行更改是一种好习惯吗?

javascript - 在框架集之外创建头标签

java - 使用 selenium 定位框架集中的元素以及框架和 div 标签

HTML 框架集 : Frameset Open in new tab/window

javascript - 从标签返回文本,其中最外层 HTML 标签适用于 jquery 中的所有文本节点

html - 只有屏幕和(最小宽度 : 0px) and (max-width: 327px) not work