jQuery:存储元素初始类至静态变量并复用
优雅捕获元素初始类并在首次keyup时复用的方案
不用全局变量完全没问题,这里有几个实用且干净的解法,适配不同的场景:
方案1:用jQuery的data()绑定初始类到元素本身
这是最直观的方案,把初始类直接存在元素的自定义数据属性里,数据和元素绑定,不会污染全局环境,还能随时获取:
// 页面加载/脚本初始化时,先把初始类存到元素的data中 const $foo = $('#foo'); $foo.data('originalClasses', $foo.attr('class')); // 绑定keyup事件 $foo.on('keyup', function() { // 取出存储的初始类 const originalClasses = $(this).data('originalClasses'); // 重新应用初始类(这里可以根据你的需求调整逻辑,比如替换当前类或者追加) $(this).attr('class', originalClasses); // 如果只需要在第一次keyup时执行这个操作,之后不再触发,可以解绑事件: // $(this).off('keyup'); });
这个方法的优势是逻辑清晰,不需要额外的状态变量,后续如果其他地方需要用到初始类,也能通过$('#foo').data('originalClasses')直接获取。
方案2:用one()处理首次keyup事件
如果你的需求是仅第一次keyup时应用初始类,后续keyup执行其他逻辑,那么用one()绑定一次性事件再合适不过了:
// 提前捕获初始类 const originalClasses = $('#foo').attr('class'); const $foo = $('#foo'); // 只执行一次的keyup事件 $foo.one('keyup', function() { // 首次触发时重新应用初始类 $(this).attr('class', originalClasses); // 如果后续还有keyup需要处理,在这里重新绑定常规事件 $(this).on('keyup', function() { // 这里写后续keyup的逻辑 }); });
这样可以避免在事件回调里反复判断是否是第一次,代码更简洁。
方案3:用闭包封装状态变量
如果不想把初始类存在元素上,也可以用闭包把变量封装起来,避免全局污染:
// 自执行函数创建闭包,变量只在这个作用域内有效 (function() { const originalClasses = $('#foo').attr('class'); let isFirstKeyup = true; $('#foo').on('keyup', function() { if (isFirstKeyup) { // 首次keyup时应用初始类 $(this).attr('class', originalClasses); isFirstKeyup = false; } // 这里写所有keyup都要执行的逻辑 }); })();
闭包可以让变量originalClasses和isFirstKeyup不暴露到全局,避免命名冲突,同时保留它们的状态。
内容的提问来源于stack exchange,提问作者theflarenet
相关产品推荐
相关产品推荐

