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 | 增加額外體積 |
toggle(fn, fn2),改用顯式狀態管理jquery-migrate 插件.toggle() (動畫) 與 .toggle(fn, fn2) (事件),前者未被移除array() 建構、索引機制與常用函數速查表
PHP 判斷變數為空的五大函式差異總覽表:isset、empty、is_null、==、===