純JS文本比較工具

来源:http://www.cnblogs.com/raotf/archive/2016/02/17/5194484.html
-Advertisement-
Play Games

前段時間由於工作需要寫了一個純JS文本比較工具 在這裡與大家分享下 演算法有待優化,還希望大家多多指教 先上效果圖: 奉上源碼(把源碼保存為html格式的文件就可以直接運行了): 1 <!doctype html> 2 <html> 3 <head> 4 <title>文本比較工具</title> 5


前段時間由於工作需要寫了一個純JS文本比較工具

在這裡與大家分享下

演算法有待優化,還希望大家多多指教

先上效果圖:

 

 

奉上源碼(把源碼保存為html格式的文件就可以直接運行了):

  1 <!doctype html>
  2 <html>
  3     <head>
  4         <title>文本比較工具</title>
  5         <style type="text/css">
  6             *{padding:0px;margin:0px;}
  7             html,body{
  8                 overflow-y: hidden;
  9             }
 10             .edit_div{
 11                 border: 1px solid #CCCCCC;
 12                 overflow: auto;
 13                 position: relative;
 14             }
 15             .edit_div textarea{
 16                 resize:none;
 17                 background: none repeat scroll 0 0 transparent;
 18                 border: 0 none;
 19                 width: 100%;
 20                 height:200px;
 21                 overflow-y: scroll;
 22                 position: absolute;
 23                 left: 0px;
 24                 top: 0px;
 25                 z-index: 2;
 26                 font-size: 18px;
 27                 white-space: pre-wrap;
 28                 word-wrap: break-word;
 29                 word-break:break-all;
 30             }
 31             .edit_div pre{    
 32                 overflow-y: scroll;
 33                 white-space: pre-wrap;
 34                 word-wrap: break-word;
 35                 word-break:break-all;
 36                 width: 100%;
 37                 height:200px;
 38                 text-align: left;
 39                 color: #ffffff;
 40                 z-index: 1;
 41                 font-size: 18px;
 42             }
 43     </style>
 44     </head>
 45     <body>
 46         <table style="width:100%">
 47             <tr>
 48                 <td style="width:50%">
 49                     <div class="edit_div">
 50                         <pre id="edit_pre_1"></pre>
 51                         <textarea id="edit_textarea_1" onscroll="test1_scroll()" oninput="textchange()" onpropertychange="textchange()"></textarea>
 52                     </div>
 53                 </td>
 54                 <td style="width:50%">
 55                     <div class="edit_div">
 56                         <pre  id="edit_pre_2"></pre>
 57                         <textarea id="edit_textarea_2" onscroll="test2_scroll()" oninput="textchange()" onpropertychange="textchange()"></textarea>
 58                     </div>
 59                 </td>
 60             </tr>
 61         </table>
 62         <script type="text/javascript">
 63             function test1_scroll(){
 64                 document.getElementById("edit_pre_1").scrollTop=document.getElementById("edit_textarea_1").scrollTop;
 65                 document.getElementById("edit_pre_2").scrollTop=document.getElementById("edit_pre_1").scrollTop;
 66                 document.getElementById("edit_textarea_2").scrollTop=document.getElementById("edit_textarea_1").scrollTop;
 67             }
 68             function test2_scroll(){
 69                 document.getElementById("edit_pre_2").scrollTop=document.getElementById("edit_textarea_2").scrollTop;
 70                 document.getElementById("edit_pre_1").scrollTop=document.getElementById("edit_pre_2").scrollTop;
 71                 document.getElementById("edit_textarea_1").scrollTop=document.getElementById("edit_textarea_2").scrollTop;
 72             }
 73             function textchange(){
 74                     var op = eq({ value1: document.getElementById("edit_textarea_1").value, value2: document.getElementById("edit_textarea_2").value });
 75                     document.getElementById("edit_pre_1").innerHTML=op.value1+"\r\n";
 76                     document.getElementById("edit_pre_2").innerHTML=op.value2+"\r\n";
 77             }
 78             function eq(op) {
 79                 if(!op){
 80                     return op;
 81                 }
 82                 if(!op.value1_style){
 83                     op.value1_style="background-color:#FEC8C8;";
 84                 }
 85                 if(!op.value2_style){
 86                     op.value2_style="background-color:#FEC8C8;";
 87                 }
 88                 if(!op.eq_min){
 89                     op.eq_min=3;
 90                 }
 91                 if(!op.eq_index){
 92                     op.eq_index=5;
 93                 }
 94                 if (!op.value1 || !op.value2) {
 95                     return op;
 96                 }
 97                 var ps = {
 98                     v1_i: 0,
 99                     v1_new_value: "",
100                     v2_i: 0,
101                     v2_new_value: ""
102                 };
103                 while (ps.v1_i < op.value1.length && ps.v2_i < op.value2.length) {
104                     if (op.value1[ps.v1_i] == op.value2[ps.v2_i]) {
105                         ps.v1_new_value += op.value1[ps.v1_i].replace(/</g,"&lt;").replace(">","&gt;");
106                         ps.v2_new_value += op.value2[ps.v2_i].replace(/</g,"&lt;").replace(">","&gt;");
107                         ps.v1_i += 1;
108                         ps.v2_i += 1;
109                         if (ps.v1_i >= op.value1.length) {
110                             ps.v2_new_value += "<span style='" + op.value2_style + "'>" + op.value2.substr(ps.v2_i).replace(/</g,"&lt;").replace(">","&gt;") + "</span>";
111                             break;
112                         }
113                         if (ps.v2_i >= op.value2.length) {
114                             ps.v1_new_value += "<span style='" + op.value1_style + "'>" + op.value1.substr(ps.v1_i).replace(/</g,"&lt;").replace(">","&gt;") + "</span>";
115                             break;
116                         }
117                     } else {
118                         ps.v1_index = ps.v1_i + 1;
119                         ps.v1_eq_length = 0;
120                         ps.v1_eq_max = 0;
121                         ps.v1_start = ps.v1_i + 1;
122                         while (ps.v1_index < op.value1.length) {
123                             if (op.value1[ps.v1_index] == op.value2[ps.v2_i + ps.v1_eq_length]) {
124                                 ps.v1_eq_length += 1;
125                             } else if (ps.v1_eq_length > 0) {
126                                 if (ps.v1_eq_max < ps.v1_eq_length) {
127                                     ps.v1_eq_max = ps.v1_eq_length;
128                                     ps.v1_start = ps.v1_index - ps.v1_eq_length;
129                                 }
130                                 ps.v1_eq_length = 0;
131                                 break;//只尋找最近的
132                             }
133                             ps.v1_index += 1;
134                         }
135                         if (ps.v1_eq_max < ps.v1_eq_length) {
136                             ps.v1_eq_max = ps.v1_eq_length;
137                             ps.v1_start = ps.v1_index - ps.v1_eq_length;
138                         }
139 
140                         ps.v2_index = ps.v2_i + 1;
141                         ps.v2_eq_length = 0;
142                         ps.v2_eq_max = 0;
143                         ps.v2_start = ps.v2_i + 1;
144                         while (ps.v2_index < op.value2.length) {
145                             if (op.value2[ps.v2_index] == op.value1[ps.v1_i + ps.v2_eq_length]) {
146                                 ps.v2_eq_length += 1;
147                             } else if (ps.v2_eq_length > 0) {
148                                 if (ps.v2_eq_max < ps.v2_eq_length) {
149                                     ps.v2_eq_max = ps.v2_eq_length;
150                                     ps.v2_start = ps.v2_index - ps.v2_eq_length;
151                                 }
152                                 ps.v1_eq_length = 0;
153                                 break;//只尋找最近的
154                             }
155                             ps.v2_index += 1;
156                         }
157                         if (ps.v2_eq_max < ps.v2_eq_length) {
158                             ps.v2_eq_max = ps.v2_eq_length;
159                             ps.v2_start = ps.v2_index - ps.v2_eq_length;
160                         }
161                         if (ps.v1_eq_max < op.eq_min && ps.v1_start - ps.v1_i > op.eq_index) {
162                             ps.v1_eq_max = 0;
163                         }
164                         if (ps.v2_eq_max < op.eq_min && ps.v2_start - ps.v2_i > op.eq_index) {
165                             ps.v2_eq_max = 0;
166                         }
167                         if ((ps.v1_eq_max == 0 && ps.v2_eq_max == 0)) {
168                             ps.v1_new_value += "<span style='" + op.value1_style + "'>" + op.value1[ps.v1_i].replace(/</g,"&lt;").replace(">"	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、下載 去nodejs下載node.msi安裝文件包,裡面包含了node.js和npm; 雙擊node.msi就行了,選擇安裝路徑和npm; 二、設置環境變數 [新版本都不需要設計環境變數了,軟體會自動寫入環境變數] 電腦(或者我的電腦)右擊屬性-》高級系統設置-》環境變數。 新建一個用戶變數。
  • 分享4種input元素滑塊UI樣式是一款使用CSS3來渲染樣式,使用JavaScript來處理滑塊的滑鼠拖動事件。效果圖如下: 線上預覽 源碼下載 實現的代碼。 js代碼: var range_els = document.querySelectorAll('input[type=range]'),
  • constructor屬性始終指向創建當前對象的構造函數。比如下麵例子: // 等價於 var foo = new Array(1, 56, 34, 12); var arr = [1, 56, 34, 12]; console.log(arr.constructor === Array); // 
  • 1.一列佈局 (一)一列自適應 自適應瀏覽器,隨著瀏覽器的拉伸而變化,一般寬度採用百分比的寫法,很簡<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>一列佈局自適應</title> <style type="t
  • p[name]{background:red;} 只使用屬性名p[name=ghr]{background:red;} 指定屬性名,並指定了該屬性的屬性值p[name~=old]{background:red;}此屬性值是一個詞列表,並且以空格隔開,其中詞列表中包含了一個value詞p[name^=
  • [原文鏈接] https://www.huangwenchao.com.cn/2015/03/html5-image-preview.html 問題 加入我們在 HTML 裡面有一個圖片上傳控制項: <input id="upload_image" type="file" name="image" a
  • 心心念念的新年過完了~卻沒念到年會,更沒念到年終獎~哎,以任何理由不發年終獎的公司都是臭流氓~然,我們公司沒有理由,壓根兒就沒提這事,哇卡卡卡卡!!! ======================== 華麗麗的跳水線=========================== 年後第一天,公司人不多,閑來
  • Media Queries 詳解
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...