| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- <!DOCTYPE html>
- <html>
- <head>
- <title>文本比较工具</title>
- <style type="text/css">
- * {
- padding: 0px;
- margin: 0px;
- }
- html,
- body {
- overflow-y: hidden;
- }
- .edit_div {
- border: 1px solid #cccccc;
- overflow: auto;
- position: relative;
- }
- .edit_div textarea {
- resize: none;
- background: none repeat scroll 0 0 transparent;
- border: 0 none;
- width: 100%;
- height: 200px;
- overflow-y: scroll;
- position: absolute;
- left: 0px;
- top: 0px;
- z-index: 2;
- font-size: 18px;
- white-space: pre-wrap;
- word-wrap: break-word;
- word-break: break-all;
- }
- .edit_div pre {
- overflow-y: scroll;
- white-space: pre-wrap;
- word-wrap: break-word;
- word-break: break-all;
- width: 100%;
- height: 200px;
- text-align: left;
- color: #ffffff;
- z-index: 1;
- font-size: 18px;
- }
- </style>
- </head>
- <body>
- <table style="width: 100%">
- <tr>
- <td style="width: 50%">
- <div class="edit_div">
- <pre id="edit_pre_1"></pre>
- <textarea
- id="edit_textarea_1"
- onscroll="test1_scroll()"
- oninput="textchange()"
- onpropertychange="textchange()"
- ></textarea>
- </div>
- </td>
- <td style="width: 50%">
- <div class="edit_div">
- <pre id="edit_pre_2"></pre>
- <textarea
- id="edit_textarea_2"
- onscroll="test2_scroll()"
- oninput="textchange()"
- onpropertychange="textchange()"
- ></textarea>
- </div>
- </td>
- </tr>
- </table>
- <script type="text/javascript">
- function test1_scroll() {
- document.getElementById("edit_pre_1").scrollTop = document.getElementById("edit_textarea_1").scrollTop;
- document.getElementById("edit_pre_2").scrollTop = document.getElementById("edit_pre_1").scrollTop;
- document.getElementById("edit_textarea_2").scrollTop = document.getElementById(
- "edit_textarea_1"
- ).scrollTop;
- }
- function test2_scroll() {
- document.getElementById("edit_pre_2").scrollTop = document.getElementById("edit_textarea_2").scrollTop;
- document.getElementById("edit_pre_1").scrollTop = document.getElementById("edit_pre_2").scrollTop;
- document.getElementById("edit_textarea_1").scrollTop = document.getElementById(
- "edit_textarea_2"
- ).scrollTop;
- }
- function textchange() {
- var op = eq({
- value1: document.getElementById("edit_textarea_1").value,
- value2: document.getElementById("edit_textarea_2").value,
- });
- document.getElementById("edit_pre_1").innerHTML = op.value1 + "\r\n";
- document.getElementById("edit_pre_2").innerHTML = op.value2 + "\r\n";
- }
- function eq(op) {
- if (!op) {
- return op;
- }
- if (!op.value1_style) {
- op.value1_style = "background-color:#FEC8C8;";
- }
- if (!op.value2_style) {
- op.value2_style = "background-color:#FEC8C8;";
- }
- if (!op.eq_min) {
- op.eq_min = 3;
- }
- if (!op.eq_index) {
- op.eq_index = 5;
- }
- if (!op.value1 || !op.value2) {
- return op;
- }
- var ps = {
- v1_i: 0,
- v1_new_value: "",
- v2_i: 0,
- v2_new_value: "",
- };
- while (ps.v1_i < op.value1.length && ps.v2_i < op.value2.length) {
- if (op.value1[ps.v1_i] == op.value2[ps.v2_i]) {
- ps.v1_new_value += op.value1[ps.v1_i].replace(/</g, "<").replace(">", ">");
- ps.v2_new_value += op.value2[ps.v2_i].replace(/</g, "<").replace(">", ">");
- ps.v1_i += 1;
- ps.v2_i += 1;
- if (ps.v1_i >= op.value1.length) {
- ps.v2_new_value +=
- "<span style='" +
- op.value2_style +
- "'>" +
- op.value2.substr(ps.v2_i).replace(/</g, "<").replace(">", ">") +
- "</span>";
- break;
- }
- if (ps.v2_i >= op.value2.length) {
- ps.v1_new_value +=
- "<span style='" +
- op.value1_style +
- "'>" +
- op.value1.substr(ps.v1_i).replace(/</g, "<").replace(">", ">") +
- "</span>";
- break;
- }
- } else {
- ps.v1_index = ps.v1_i + 1;
- ps.v1_eq_length = 0;
- ps.v1_eq_max = 0;
- ps.v1_start = ps.v1_i + 1;
- while (ps.v1_index < op.value1.length) {
- if (op.value1[ps.v1_index] == op.value2[ps.v2_i + ps.v1_eq_length]) {
- ps.v1_eq_length += 1;
- } else if (ps.v1_eq_length > 0) {
- if (ps.v1_eq_max < ps.v1_eq_length) {
- ps.v1_eq_max = ps.v1_eq_length;
- ps.v1_start = ps.v1_index - ps.v1_eq_length;
- }
- ps.v1_eq_length = 0;
- break; //只寻找最近的
- }
- ps.v1_index += 1;
- }
- if (ps.v1_eq_max < ps.v1_eq_length) {
- ps.v1_eq_max = ps.v1_eq_length;
- ps.v1_start = ps.v1_index - ps.v1_eq_length;
- }
- ps.v2_index = ps.v2_i + 1;
- ps.v2_eq_length = 0;
- ps.v2_eq_max = 0;
- ps.v2_start = ps.v2_i + 1;
- while (ps.v2_index < op.value2.length) {
- if (op.value2[ps.v2_index] == op.value1[ps.v1_i + ps.v2_eq_length]) {
- ps.v2_eq_length += 1;
- } else if (ps.v2_eq_length > 0) {
- if (ps.v2_eq_max < ps.v2_eq_length) {
- ps.v2_eq_max = ps.v2_eq_length;
- ps.v2_start = ps.v2_index - ps.v2_eq_length;
- }
- ps.v1_eq_length = 0;
- break; //只寻找最近的
- }
- ps.v2_index += 1;
- }
- if (ps.v2_eq_max < ps.v2_eq_length) {
- ps.v2_eq_max = ps.v2_eq_length;
- ps.v2_start = ps.v2_index - ps.v2_eq_length;
- }
- if (ps.v1_eq_max < op.eq_min && ps.v1_start - ps.v1_i > op.eq_index) {
- ps.v1_eq_max = 0;
- }
- if (ps.v2_eq_max < op.eq_min && ps.v2_start - ps.v2_i > op.eq_index) {
- ps.v2_eq_max = 0;
- }
- if (ps.v1_eq_max == 0 && ps.v2_eq_max == 0) {
- ps.v1_new_value +=
- "<span style='" +
- op.value1_style +
- "'>" +
- op.value1[ps.v1_i].replace(/</g, "<").replace(">", ">") +
- "</span>";
- ps.v2_new_value +=
- "<span style='" +
- op.value2_style +
- "'>" +
- op.value2[ps.v2_i].replace(/</g, "<").replace(">", ">") +
- "</span>";
- ps.v1_i += 1;
- ps.v2_i += 1;
- if (ps.v1_i >= op.value1.length) {
- ps.v2_new_value +=
- "<span style='" +
- op.value2_style +
- "'>" +
- op.value2.substr(ps.v2_i).replace(/</g, "<").replace(">", ">") +
- "</span>";
- break;
- }
- if (ps.v2_i >= op.value2.length) {
- ps.v1_new_value +=
- "<span style='" +
- op.value1_style +
- "'>" +
- op.value1.substr(ps.v1_i).replace(/</g, "<").replace(">", ">") +
- "</span>";
- break;
- }
- } else if (ps.v1_eq_max > ps.v2_eq_max) {
- ps.v1_new_value +=
- "<span style='" +
- op.value1_style +
- "'>" +
- op.value1
- .substr(ps.v1_i, ps.v1_start - ps.v1_i)
- .replace(/</g, "<")
- .replace(">", ">") +
- "</span>";
- ps.v1_i = ps.v1_start;
- } else {
- ps.v2_new_value +=
- "<span style='" +
- op.value2_style +
- "'>" +
- op.value2
- .substr(ps.v2_i, ps.v2_start - ps.v2_i)
- .replace(/</g, "<")
- .replace(">", ">") +
- "</span>";
- ps.v2_i = ps.v2_start;
- }
- }
- }
- op.value1 = ps.v1_new_value;
- op.value2 = ps.v2_new_value;
- return op;
- }
- function settextheight() {
- var heigth = document.documentElement.clientHeight - 6 + "px";
- document.getElementById("edit_pre_1").style.height = heigth;
- document.getElementById("edit_textarea_1").style.height = heigth;
- document.getElementById("edit_pre_2").style.height = heigth;
- document.getElementById("edit_textarea_2").style.height = heigth;
- }
- window.onload = function () {
- settextheight();
- window.onresize = function () {
- settextheight();
- };
- };
- </script>
- </body>
- </html>
|