惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - 黃偉榮

Web Project的檔案共用小技巧 IoC的中繼器:CommonServiceLocator UTF8Encoding與BOM Temporary Post Used For Theme Detection (d4b0aefa-c88e-4957-bba7-b367d1bfa042 - 3bfe001a-32de-4114-a6b4-4005b770f6d7) 寫CodedUI時如何尋找控制項的小技巧 Visual Studio 2010 Feature Packs 2之Silverlight自動化測試 Moles - Isolation framework for .NET(假.Net)介紹 [小技巧]Entity Framework強型別Include C#仿Oracle Decode,將ValueType對應成String - 黃偉榮 - 博客园 Visual Studio 單元測試的3種Initialize與Cleanup 用EventLogReader查詢特殊EventLog jQuery自製Plugin-Bind事件函式時檢查有沒有Bind過 ASP.NET MVC TempData使用心得 Visual Stuiod 自訂檔案比較合并工具 [小技巧]自動化測試時NLog的訊息輸出到測試結果中 小技巧:專案切換32與64位元組件 Linq小技巧:日期處理 Unit Test小技巧 : DateTime的Stub 解決TFS Build Asp.Net Mvc開啟MvcBuildViews後無法載入組件問題
jQuery套件-檢查頁面的欄位是否有變更
黃偉榮 · 2010-10-20 · via 博客园 - 黃偉榮

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

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

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

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

/*
程式功能只有一個檢查頁面上的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的東西,請在用時,注意一下

<!--明明是下拉選單,卻下多個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下載