一千萬個為什麽

搜索

保存並恢復jQuery對象上的“onclick”操作

我想在頁面上禁用一大堆對象,然後再重新啟用它們。由於它們中的一些是標簽而不是按鈕,我通過刪除它們的onclick attr來禁用它們。我試圖將舊處理程序存儲在.data()中,但不幸的是,當我嘗試使用 $(obj).attr('onclick',$(obj).data('onclick')恢復它們時),它調用函數而不是將其恢復到屬性。如果我嘗試將它存儲在不同的屬性而不是數據中,它不存儲函數,它存儲函數的返回值。

有沒有辦法在不重寫我頁面上的每個標簽和每個onclick處理程序的情況下完成此操作?

if( doEnable) {

    $(obj).attr('href', $(obj).data('href'));
    $(obj).attr('onclick', $(obj).data('onclick'));


    $(obj).removeClass(EIS.config.classes.disabled);
    $(obj).show();

}
else {
   //Save the things you're going to remove
    $(obj).data('onclick', $(obj).attr('onclick'));
    $(obj).data('href', $(obj).attr('href'));

    $(obj).prop("href", null);
    $(obj).prop("onclick", null);

    $(obj).addClass(EIS.config.classes.disabled);
    $(obj).show();
   }

順便說一句,這段代碼似乎在Chrome和Firefox中運行良好,但有時僅在IE8中,而在IE6中從未使用過。不幸的是,客戶端首先在IE6中測試。

最佳答案

$(obj).attr('onclick', ...

是不明確的,在不同版本的jQuery和不同的瀏覽器中有不同的結果。它可能不會做你想要的。您應該避免在事件處理程序上使用 attr

問題是 onclick 屬性onclick 屬性之間的斷開連接。 jQuery試圖在過去的地毯下刷一個屬性和屬性之間的區別,使用 attr 來訪問它們,但它們是完全不同的。這在jQuery 1.6中有所改變,並在1.6.1中部分恢復,引起了廣泛的爭議,混亂和不兼容。

對於許多屬性,屬性的值和相應的DOM屬性是相同的;對於其他人,包括所有不是字符串的屬性,他們不是。事件處理程序當然不是:屬性是一個Function對象,而string屬性可能是(a)HTML中 onclick =“...”屬性的原始字符串,(b)沒有(如果onclick從腳本分配為Function對象)或(c)不可用(在舊IE中)。

要訪問事件處理函數Function屬性,請在jQuery 1.6中使用 prop()

$(obj).data('onclick', $(obj).prop('onclick'));
...
$(obj).prop('onclick', $(obj).data('onclick'));

或者只使用普通的舊JavaScript,它實際上更簡單,更易讀; jQuery在這裏沒有贏任何東西。

obj._onclick= obj.onclick;
...
obj.onclick= obj._onclick;

無論哪種方式,這都不會可靠地“禁用”元素,因為它們可以(並且非常可能,如果您使用jQuery)在其上註冊了其他事件偵聽器,使用addEventListener/attachEvent而不是old-school事件處理程序接口。

轉載註明原文: 保存並恢復jQuery對象上的“onclick”操作