黃偉榮的學習筆記

軟體的世界變化萬千,小小的我只能在這洪流奮發向上以求立足。
随笔 - 100, 文章 - 0, 评论 - 212, 阅读 - 17万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

jQuery套件-檢查頁面的欄位是否有變更

Posted on   黃偉榮  阅读(493)  评论(0编辑  收藏  举报

有時會在修改頁面中,檢查頁面的的欄位(text、checkbox、radio、select),沒有沒修改過,如果沒有修改,按下送出,此時是關閉視窗或轉頁,省去post出去,sever檢查與寫資料庫。

 

這是小弟我自製的jQuery套件,有二種使用方式

1
2
3
4
5
//這二個方法是同樣的,都是檢查頁面上所有:input,有沒有修改
$.hasChanged();
$(":input").hasChanged();
//也可以自訂Selector
$("#form1 input").hasChanged();

我是用input的屬性defaultValue、defaultChecked與option的defaultSelected查檢有沒有變更,這幾個值是在下載HTML就決定好的,如果是頁面載入完後用javascript賦值,因為預設值一定都是空的,所以會被認為有修改過。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
程式功能只有一個檢查頁面上的element有沒有修改過,true為有修改過,false為沒有修改過
使用方式有二種
$.hasChanged() 檢查:input有沒有修改過
$(selector).hasChanged() 檢查selector子的元素有沒有修改過
*/
(function ($) {
    $.hasChanged = function () {
        return $(":input").hasChanged();
    }
 
    $.fn.hasChanged = function () {
        for (var i = 0; i < this.length; i++) {
            var input = this[i];
            if (input.type == "checkbox" || input.type == "radio") {
                if (checkCheckBoxAndRadio(input)) {
                    return true;
                }
            } else if (typeof (input.defaultValue) != "undefined") {
                if (chekcInput(input)) {
                    return true;
                }
            } else if (input.type == "select-one") {
                if (checkSelectOne(input)) {
                    return true;
                }
            } else if (input.type == "select-multiple") {
                if (checkSelectMultiple(input)) {
                    return true;
                }
            } else {
                alert("不支援" + input.type);
                return false;
            }
        }
 
        return false;
    }
 
    function checkSelectOne(input) {
        //下拉選單零筆,不考慮
        if (input.options.length == 0) {
            return false;
        }
 
        var defaultIndex = 0;
        for (var j = 1; j < input.options.length; j++) {
            var option = input.options[j];
            if (option.defaultSelected) {
                defaultIndex = j;
                break;
            }
        }
 
        return defaultIndex != input.selectedIndex;
    }
 
 
    function checkSelectMultiple(input) {
        //下拉選單零筆,不考慮
        if (input.options.length == 0) {
            return false;
        }
 
        for (var j = 0; j < input.options.length; j++) {
            var option = input.options[j];
            if (option.defaultSelected != option.selected) {
                return true;
            }
        }
 
        return false
    }
 
    function checkCheckBoxAndRadio(input) {
        //checkbox與radio,比有沒有Checked
        return input.checked != input.defaultChecked;
    }
 
    function chekcInput(input) {
        return input.value != input.defaultValue;
    }
})(jQuery)

 

NOTE:

defaultValue是有一次我按下reset的按鈕時,發現所有的值都還原成預設值,而不是空的,我就很好奇的瀏覽器是怎麼記錄這些值的,就不小心讓我發現defaultValue這個屬性,所以如果想局部還原,可以用input.value=input.defaultValue

 

測試瀏覽器

IE 8 OK

Chrome 6 OK

Firefox 3.5 OK

NOTE:

有一個很像Bug又不是Bug的東西,請在用時,注意一下

 

1
2
3
4
5
6
7
8
<!--明明是下拉選單,卻下多個selected,因為下拉選單是單選,所以最後會選在5上,1-4會被判別被修改-->
<select>
    <option selected>1</option>
    <option selected>2</option>
    <option selected>3</option>
    <option selected>4</option>
    <option selected>5</option>
</select>

1.0下載

 

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示