`
yiminghe
  • 浏览: 1460120 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Beyond Compare javascript 优化补丁

阅读更多

Beyond Compare 2 是一款很好的文件比较工具,并且可以很方便地将结果导出为html格式显示,如图所示 :

 

原图结果:

 

 

而不像他的桌面客户端一样可以各个文件可以拖动比较,而是整个窗口出现滚动条了,不方便在两个文件的同一行数据的同一位置进行比较。

 

改进分析:

 

1.结果 html 采用 table 显示数据,两个文件的同一位置代码位于 table 的同一行不同 td ,而 table 采用 auto table-layout 而使得代码表格撑破浏览器窗口了,应使用固定表格布局。

2.代码文字直接显示在 td 中,而滚动条则不能出现在 td 上。应在 td 中嵌套 div 从而使得 div 拥有滚动条可以滚动,并且滚动条div还要嵌套入数据div,并使得所有数据div具有相同宽度(最大宽度),使得即使很短的代码表格文本也可以滚动,同步长代码行。

3.需要一种最底层滚动条,使得其可以控制所有上述table的所有单元格同步滚动。

4.对于两个大文件的对比,要利用分时计算来防止浏览器失去响应。(当文件超过200K,建议使用chrome,否则请耐心等待)

 

图示分析:

 

 

改进结果:

上述步鄹都可以在原始页面载入后,利用 javascript 遍历 DOM 树来进行样式以及结构的调整 ,即只需要在原html 代码 中加入

 

<script src="patch.js"></script>

即可。

 

 

改进后:

 

 

 

 

代码注释讲解 (示例附件 ):

 

/*
    Beyond Compare 2 patch for html result
    author:yiminghe.iteye.com
    try MIT licence   
*/
Ext.onReady(function () {
    var mask = Ext.getBody().mask("start process ... ");
    var maskMessage = Ext.getBody()._maskMsg.dom.firstChild;
    /*
        分时计算,防止僵死
        修改自 : http://www.nczonline.net/blog/2009/08/11/timed-array-processing-in-javascript/
    */
    function timedChunk(items, process, context, callback) {
        var index = items.getCount() - 1;
        var total = index;
        setTimeout(function () {
            var start = +new Date();
            do { //console.log(index);
                maskMessage.innerHTML = ("current step remain : " + ((index * 100) / total).toFixed(1) + "%");
                process.call(context, items.item(index));
                index--;
            } while (index >= 0 && (+new Date() - start < 50));
            if (index >= 0) {
                setTimeout(arguments.callee, 25);
            } else {
                callback(items);
            }
        },
        25);
    }
    var maxScrollWidth = -1; //设定固定布局,防止自动撑破
    Ext.select("table.fc").setStyle({
        "table-layout": "fixed"
    }); //为固定布局设置宽度
    var tbody = Ext.DomQuery.selectNode("table.fc > tbody");
    var firstTds = Ext.get(tbody).select(" > tr:first-child td");
    var widths = [2, 45, 5, 2, 45];
    firstTds.each(function (el, _tds, index_) {
        el.setStyle({
            width: widths[index_] + "%"
        });
    });
    var trs = Ext.get(tbody).select("> tr", true);
    timedChunk(trs, function adjustDiff(el) {
        for (var i = 0; i < 2; i++) {
            var turn = i ? (5) : 2; //console.log(el);
            var cel = el.child(">td:nth-child(" + turn + ")"); //console.log(cel);
            cel.dom.style.overflow = "hidden";
            cel.dom.innerHTML = "<div>" + cel.dom.innerHTML + "</div>"; //里层文字div不允许换行
            Ext.get(cel.dom.firstChild).setStyle({
                "white-space": "nowrap"
            }); //外层滚动条div,隐藏滚动条,注意 td 出不来滚动条
            //ie6 td 内 div 设置 width 100%,才能完全填充 td
            Ext.get(cel.dom.firstChild).wrap({
                tag: 'div',
                cls: 'code',
                style: {
                    "overflow": "hidden",
                    width: "100%" // for ie6
                }
            }); //获取外层滚动的最大宽度
            var cur = cel.dom.firstChild.scrollWidth;
            if (maxScrollWidth < cur) {
                maxScrollWidth = cur;
            }
        }
    },
    null, setDiff);
    function setDiff() {
        timedChunk(trs, function (el) {
            for (var i = 0; i < 2; i++) {
                var turn = i ? (5) : 2;
                var cel = el.child(">td:nth-child(" + turn + ")");
                var cur = cel.dom.firstChild.scrollWidth; //将文字div设置为所有格子最大滚动宽度,使得可以统一滚动
                if (maxScrollWidth > cur) {
                    cel.dom.firstChild.firstChild.style.width = maxScrollWidth + "px";
                }
            }
        },
        null, createScroll); //最后一行显示的滚动条创建,ie会根据宽度设置自动出现滚动条,firefox不会,只能设置scroll
        function createScroll() {
            Ext.DomHelper.append(tbody, {
                tag: "tr",
                cn: [{
                    tag: "td",
                    html: '&nbsp;'
                },
                {
                    tag: "td",
                    cn: [{
                        tag: 'div',
                        id: "scrollDiv0",
                        cls: 'code',
                        style: {
                            "overflow-x": "scroll",
                            //for firefox
                            width: "100%" // for ie6
                        },
                        cn: [{
                            tag: "div",
                            html: '&nbsp;',
                            //for firefox
                            style: {
                                width: maxScrollWidth + "px"
                            }
                        }]
                    }]
                },
                {
                    tag: "td",
                    html: '&nbsp;'
                },
                {
                    tag: "td",
                    html: '&nbsp;'
                },
                {
                    tag: "td",
                    style: { //"overflow-x":"scroll"
                    },
                    cn: [{
                        tag: 'div',
                        id: "scrollDiv1",
                        cls: 'code',
                        style: {
                            "overflow-x": "scroll",
                            //for firefox
                            width: "100%" // for ie6
                        },
                        cn: [{
                            tag: "div",
                            html: '&nbsp;',
                            //for firefox
                            style: {
                                width: maxScrollWidth + "px"
                            }
                        }]
                    }]
                }]
            }); //当底层滚动条滚动时,所有格子的滚动条都一起滚动,造成同一列属于一个整体的假象
            var scrollCells = Ext.select(".code");
            for (var i = 0; i < 2; i++) {
                var lsDiv = Ext.get("scrollDiv" + i);
                lsDiv.on("scroll", (function (i) {
                    return function () {
                        var srollDiv = this;
                        scrollCells.each(function (el) {
                            el.dom.scrollLeft = srollDiv.dom.scrollLeft;
                        });
                    }
                })(i));
            }
            Ext.getBody().unmask();
        }
    }
});
     

 

  • 大小: 43.3 KB
  • 大小: 122.6 KB
  • 大小: 111 KB
0
0
分享到:
评论
1 楼 liangl923 2012-07-19  
发现楼主做的帖子都很精致,属于研究型人才,赞一个。

相关推荐

    Beyond Compare_3.3.8_BeyondCompare3_beyondcompare_

    《Beyond Compare 3.3.8:代码对比与文件管理利器》 Beyond Compare,简称BC,是一款由Scooter Software公司开发的专业级文件和文本对比工具。它以其强大的功能、直观的操作界面以及高效的对比算法,深受程序员和...

    beyondcompare加入右键菜单方法

    beyondcompare加入右键菜单方法 Beyond Compare是一款功能强大的文件比较工具,它可以帮助用户快速比较和同步文件。但是,默认情况下,Beyond Compare并不提供直接在右键菜单中访问的功能。这就需要用户手动打开...

    Beyond compare右键菜单修复方法.rar

    该文件里有2个压缩包:BC3ShellExFix.zip + BC4ShellExFix.zip,分别是Beyond compare3和Beyond compare4的右键菜单修复方法,具体如下: 这里介绍Beyond compare4,在32位PC机上的右键菜单修复方法: 1)先把BC4...

    beyondCompare_beyondcompare2_beyondcompare_

    最后,"BeyondCompare"可能是主程序的快捷方式或者配置文件。 总之,BeyondCompare系列是IT专业人士的强大助手,通过熟练掌握并运用这些工具,可以极大地提高文件管理和协同工作的效率。无论你是开发者、系统管理员...

    Beyond Compare 免安装直接使用

    **Beyond Compare:一款强大的文件与文件夹比较工具** Beyond Compare是一款功能强大的文件和文件夹比较工具,被广泛应用于软件开发、数据同步、版本控制等多个领域。它的主要特点是界面直观、操作简便,能够快速...

    Beyond Compare 3.zip

    《Beyond Compare 3:强大的文件与文本比对利器》 Beyond Compare 3,这款软件以其高效、精准的文件和文本比对功能,在IT行业内赢得了广泛的赞誉。它是一款专业的比较工具,能够帮助用户在多个层面进行内容比对,...

    删除BeyondCompare4注册表里CacheID的值

    在IT领域,尤其是在软件使用和优化的过程中,有时我们需要对系统进行一些特定的调整来解决特定问题或提升性能。本文将详细讲解如何删除Beyond Compare 4(一款强大的文件和文本比较工具)注册表里的CacheID值,以及...

    解决Beyond Compare左键不显示比较项的程序

    Beyond Compare是一款功能强大的文件和文本比较软件,它能够帮助用户直观地对比两个文件夹或文件之间的差异,并提供合并冲突的功能。本问题涉及到的是一个特定的使用问题,即“Beyond Compare左键不显示比较项”,这...

    文件比较软件BeyondCompare V3.3.13

    《文件比较神器:BeyondCompare V3.3.13深度解析》 在IT行业中,文件对比是一项基础且至关重要的任务,无论是代码版本控制还是数据比对,都需要精准地找出文件间的差异。这时,一款强大的文件比较工具就显得尤为...

    Beyond compare(已经配置好class反编译,解压可用)

    标题“Beyond compare(已经配置好class反编译,解压可用)”暗示了该压缩包包含的Beyond Compare版本可能已经预先配置好了对.class文件的反编译支持。.class文件是Java字节码文件,通常由Java源代码编译而来。通过反...

    Beyond Compare 免费绿色免安装,下载即用

    **Beyond Compare:一款强大的文件与文本比较工具** Beyond Compare,中文名“超级对比”,是一款功能强大的文件和文件夹比较工具,被广泛应用于软件开发、数据同步、版本控制等多个领域。这款软件以其直观的用户...

    BeyondCompare3.34 安装包

    BeyondCompare3.34 安装包

    Beyond Compare 4

    《Beyond Compare 4:深入解析与使用指南》 Beyond Compare 4是一款强大的文件和文本比较工具,由Scooter Software公司开发。它以其直观的界面、高效的功能和广泛的用途赢得了广大用户的喜爱。本文将深入探讨Beyond...

    BeyondCompare4中文版入门教程参考.pdf

    Beyond Compare 4 中文版入门教程参考 Beyond Compare 4 是一款智能且专业的文件夹和文本比较工具,它可以帮助用户快速地比较和合并文件,找出差异,生成文件报告。以下是 Beyond Compare 4 中文版的入门教程。 ...

    Beyond Compare 5激活安装教程

    Beyond Compare 5中文最近版本的安装与激活

    BeyondCompare Pro 4.2.6.23150 x64中文版.zip

    BeyondCompare是一款广受欢迎的专业级文件和目录比较工具,由Scooter Software公司开发。这款软件以其强大的功能和直观的用户界面赢得了众多用户的喜爱。在本文中,我们将深入探讨BeyondCompare Pro 4.2.6.23150 x64...

    Beyond Compare v4.4.3

    Scooter Beyond Compare is basically considered to be a concentrated beyond compare which permits the user on developer in order to compare the user folder as well as files efficiently and easily....

    Beyond Compare 2_软件比较_开发becompare_beyondcompare_

    《Beyond Compare 2:软件比较与开发神器》 在IT行业中,版本控制和代码管理是开发者日常工作中不可或缺的一部分。为了确保代码的质量和一致性,开发者需要有效地比较和合并代码。这时,一款强大的比较工具就显得至...

    Beyond Compare文件比对常规操作

    ### Beyond Compare 文件比对常规操作详解 #### 一、Beyond Compare简介 Beyond Compare是一款功能强大的文件及文件夹对比工具,支持多种格式文件的对比及合并,适用于开发人员、系统管理员等专业人士。它可以帮助...

    Beyond compare 安装java反编译插件

    重新打开beyond comare ...C:\Users\wdd\AppData\Roaming\Scooter Software\Beyond Compare 4\Helpers\Java\CLASS_to_JAVA.bat 修改为java -jar Helpers\Java\procyon-decompiler-0.5.36.jar %1 &gt; %2

Global site tag (gtag.js) - Google Analytics