【发布时间】:2018-07-23 23:31:55
【问题描述】:
在 HTML 4 之前,可以创建带有框架的布局,在不同的窗格中加载不同的 HTML 文件。
我想要做的是实现类似的结果,但加载并在屏幕上显示同一文档的两个不同部分。
我的理想范例是 MS Word,它允许将窗口分成 2 个水平部分以显示在同一文档的每个不同部分(在比较文档的不同部分或将部分从远处移动到另一侧时非常有用其他在长文档上)或 MS Excel(甚至 LibreOffice 或 OpenOffice Calc 也有类似的功能)允许出于相同的原因将工作表的窗格拆分为 2 个(甚至 4 个)部分,或者保持顶部的某些行可见或右侧的一些列(例如行或列标题)。
红色箭头表示将窗口文档分成两部分的装订线,允许单独滚动每个部分,正如您可以看到上窗格中的行数为 3 和下窗格中的 21。排水沟也可以调整大小。
是否可以使用带有 HTML 和 CSS 的 vanilla JS(请不要使用 jQuery 或其他框架)来做到这一点?
约束:
- 所有 2 个窗格(顶部和底部)的文档必须相同(旧框架集需要加载两个不同的文档或同一个文档两次:我已经在使用它,但如果可能的话,我想要一个更干净的方法!)
- 分隔符(装订线?)必须可调整大小
- 文档的两个不同部分完全同步,如果我在顶部(或底部)窗格中修改某些内容(使用
contenteditable属性),底部(或顶部)窗格会立即显示编辑就像 MS Word 或 Excel 一样...所以如果我在任何底部窗格表格单元格中删除某些内容,即使顶部内容也会相应调整(甚至列大小),就像 MS Word、Excel、Calc 等一样。 - 点击特定按钮会打开和关闭拆分视图
- 我不关心旧浏览器,只关心 ECMA 脚本 2015 或更新版本
-
HTML 文件有许多事件侦听器,通过
addEventListener()方法附加到各种 HTML 元素,如按钮、文本框、复选框、选择框等:这意味着回答的解决方案必须能够保持它们的完整性并在两者中工作窗格。
我将在哪里使用它?
我在本地 HTML 文件(不涉及 Web 服务器)中有一堆表格,这些表格从 csv 文件或浏览器会话存储中加载数据,我经常需要比较来自不同点的数据或保持标题固定在滚动特定表格的其余部分时,或者在其中一个表格中插入新数据或更新旧数据时,在顶部,以不断查看我在哪个表格单元格中插入或更新数据。
情况:
目前我正在使用以下代码:
function splitView()
{
var tgtSrc = location.href;
var frameset = '<frameset rows="*,*">' +
'<frame name="' + upFrame + '" src="' + tgtSrc + '">' +
'<frame name="' + dwFrame + '" src="' + tgtSrc + '">' +
'</frameset>';
document.write(frameset);
}
上述函数将当前窗口窗格水平拆分为两个框架,称为 upFrame 和 dwFrame(它们是两个变量)。拆分后,将在两个框架之间放置一个可调整大小的装订线。
加上同步文档数据的两个实例的算法:它的工作原理是在一个帧中的每次数据编辑时将数据保存到该帧的会话存储中,并将相同的数据重新加载到另一个帧中。
它有点工作,但框架不是要走的路,我想摆脱两次加载文档并同步每个实例以及所涉及的所有相对缺点的需要。所以不幸的是,这不是我正在寻找的最终答案,因为它有一些缺点:
- 现代 HTML5 兼容文件不支持 frame 和 frameset 标签,即使浏览器仍然支持它们
- 该文件必须加载两次(每帧一次),这意味着性能明显不足并且难以实时同步一帧中的任何编辑与另一帧(可能需要双向同步,因此可以在都显示了文件的一部分)。不幸的是,即使是所需的同步过程也意味着失去在每个同步循环中锁定 UI 的性能
- 同步过程不是实时的,它有一些延迟(几秒钟):如果我缩短它,我会严重缺乏性能,包括浏览器冻结
因此,我愿意通过更清洁、更高效的解决方案获得更好的答案。 (我什至建议 Chrome 开发者在浏览器中为其实现一个功能,因为我真的认为这是一个必须具备的功能,特别是考虑到不断扩展的在线数据管理系统。)
我在寻找什么:
我已经使用的上述代码的使用根本不是强制性的:答案也可以提出一种完全不同的方法。
所以我正在寻找的最终解决方案是类似于 Google 电子表格使用的拆分功能(如果可以,我希望我们也可以),这是带有示例的图像 p>
仔细看:有可能水平移动的装订线(也有垂直装订线,但我并不关心垂直分割,只是水平的),当电子表格向下滚动时,行消失在下面它:实际上,排水沟上方的第一行是 n。 1 排水沟的第一行是 n。 45.
还要注意图片最左边的红色大箭头所指示的小双头白色箭头。
我尝试研究 Google 电子表格方法对其进行逆向工程并提取显着特征并将相同的“哲学”适应我的本地应用程序,但我还不足以理解他们做了什么确切地说:我的怀疑是,当“表格行撞到排水沟”时,它只是隐藏在它后面,但我不确定。
恕我直言,这是每个浏览器(甚至是便携式设备的浏览器)都必须在本地实现的功能,并且不使用 html 5 中不再支持的旧框架技术。不幸的是,这种可能性拆分相同文档 来显示和编辑它的不同部分(例如,作为一个非常长的表格)保持每个窗格相互更新,不是(还)浏览器功能,所以同时......它需要一个解决方法.
注意:
CSS 属性
position: sticky;
也可用于解决部分问题(在编辑或将数据插入 tbody 时保持 thead 卡住),但不幸的是,它似乎无法在 thead 元素上按预期工作,至少在某些浏览器上.它也只解决了部分问题:事实上,如果需要将来自同一个表或不同表的不同部分的数据比较到同一个文档中,这个解决方案根本就不好。所以需要别的东西。
【问题讨论】:
-
mac 命令行也可以这样做,非常方便.. 不幸的是,如果不在 2 个 iframe 中两次加载同一页面,我真的看不出有任何方法可以做到这一点。
-
@Iwrestledabearonce。不幸的是,在 2 个 iframe 中两次加载同一页面无法正常工作,因为它们必须保持同步,以防其中一个或另一个发生数据更改。当然,我希望浏览器开发人员能够添加一种简单的方法来执行诸如 window.splitableV = true window.splitableH = true...之类的操作。但与此同时...
-
我认为构建起来不会太难,但它将是特定于实现的..换句话说,您放入框架的页面必须构建才能进入框架。我认为不会有一个简单的即插即用选项..
-
@Occam'sRazor 具体实现对我来说很好
-
您将如何更改文档的内容?通过外部编辑器或在浏览器中使用
contenteditable属性或...?
标签: javascript html css window