首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

解決 jQuery 高版本移除 toggle() 事件的兼容性方案

     編輯:PHP 綜合知識

問題背景

jQuery 1.9+ 版本移除了 .toggle(fn, fn2, ...) 事件綁定方法(注意:非 .toggle() 動畫切換),導致舊代碼報錯 toggle is not a function。

兼容性補丁代碼

在引入 jQuery 後、業務代碼前插入以下代碼即可恢復功能:

(function($) {
    // 保存原有 toggle(動畫版)
    var oldToggle = $.fn.toggle;

    $.fn.toggle = function(fn, fn2) {
        // 非函數參數時走動畫邏輯
        if (!$.isFunction(fn) || !$.isFunction(fn2)) {
            return oldToggle.apply(this, arguments);
        }

        var args = arguments,
            guid = fn.guid || $.guid++,
            i = 0,
            toggler = function(event) {
                event.preventDefault();
                var lastToggle = ($._data(this, "lastToggle" + fn.guid) || 0) % i;
                $._data(this, "lastToggle" + fn.guid, lastToggle + 1);
                return args[lastToggle].apply(this, arguments) || false;
            };

        toggler.guid = guid;
        while (i < args.length) {
            args[i++].guid = guid;
        }
        return this.click(toggler);
    };
})(jQuery);

使用示例

$('#btn').toggle(
    function() { console.log('第一次點擊'); $(this).addClass('active'); },
    function() { console.log('第二次點擊'); $(this).removeClass('active'); },
    function() { console.log('第三次點擊'); $(this).toggleClass('highlight'); }
);

原理解析

  • 利用閉包保存回調函數數組 args
  • 用 $.guid 生成唯一標識,配合 $._data() 存儲點擊計數
  • 每次點擊取模計算執行哪個回調
  • 所有回調共享同一 guid,可通過任一函數 off('click') 解綁

替代方案對比

方案優點缺點
官方補丁(本文)零改動現有代碼依賴內部 API($._data)
手動標記狀態代碼清晰可控需修改所有調用處
使用 click + 計數器原生 API,無兼容風險代碼較繁瑣
升級為 jQuery Migrate官方維護,兼容所有廢棄 API增加額外體積

建議

  1. 新項目避免使用 toggle(fn, fn2),改用顯式狀態管理
  2. 維護舊項目可引入本補丁或 jquery-migrate 插件
  3. 注意區分 .toggle() (動畫) 與 .toggle(fn, fn2) (事件),前者未被移除
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved