jquery - 使用 jQuery 根据锚点的焦点向父 div 添加类
问题描述
我有一个锚点列表,我希望他们根据当前关注的锚点向特定的 div ID 添加一个唯一类。我让它为锚悬停工作,但我很难弄清楚如何也为锚焦点做这件事。我想实现锚焦点,这样即使有人通过键盘导航锚,他的类仍然会被添加到 div ID 中。
这是我的悬停类代码(可能会被清理)。#industries
如果锚有焦点(不仅仅是悬停),我需要将这些类(每个锚唯一)添加到div 中。
HTML结构:
<div id="industries" class="et_pb_section">
<div class="et_pb_row">
<div class="et_pb_column">
<div id="industries-list" class="et_pb_module">
<div class="et_pb_text_inner">
<ul>
<li><a href="#education">Education</a></li>
<li><a href="#energy">Energy</a></li>
<li><a href="#healthcare">Healthcare</a></li>
</ul>
</div>
</div> <!-- .et_pb_text -->
</div> <!-- .et_pb_column -->
</div> <!-- .et_pb_row -->
</div> <!-- .et_pb_section -->
jQuery代码:
(function ($) {
$(document).ready(function () {
industriesBackgrounds();
});
function industriesBackgrounds() {
$('#industries-list [href="#education"]').hover(function(){
$('#industries').addClass('industry-education-hover');
},
function(){
$('#industries').removeClass('industry-education-hover');
});
$('#industries-list [href="#energy"]').hover(function(){
$('#industries').addClass('industry-energy-hover');
},
function(){
$('#industries').removeClass('industry-energy-hover');
});
$('#industries-list [href="#healthcare"]').hover(function(){
$('#industries').addClass('industry-healthcare-hover');
},
function(){
$('#industries').removeClass('industry-healthcare-hover');
});
}
})(jQuery);
更新:
industriesBackgrounds
现在,通过将此代码添加到我的函数中,我可以进行这种工作。
$('#industries').delegate( '#industries-list a[href="#education"]', 'focus blur', function() {
var anchor = $( this );
setTimeout(function() {
$('#industries').toggleClass( 'industry-education-focus', anchor.is( ":focus" ) );
}, 0 );
});
$('#industries').delegate( '#industries-list a[href="#energy"]', 'focus blur', function() {
var anchor = $( this );
setTimeout(function() {
$('#industries').toggleClass( 'industry-energy-focus', anchor.is( ":focus" ) );
}, 0 );
});
$('#industries').delegate( '#industries-list a[href="#healthcare"]', 'focus blur', function() {
var anchor = $( this );
setTimeout(function() {
$('#industries').toggleClass( 'industry-healthcare-focus', anchor.is( ":focus" ) );
}, 0 );
});
我不确定这是否是最好的方法。但是,由于用户在技术上可以让一个锚点聚焦,而将鼠标悬停在另一个锚点上,因此使用 2 个单独的类(一个用于聚焦,一个用于悬停)来确定真正发生的“事件”可能是理想的。
但这是对这两种状态进行编码的最佳方式吗?是否有更清洁的解决方案来实现向 ID 添加类、悬停和聚焦的目标?
解决方案
您可以通过组合选择器和事件委托来缩短代码。.hover()
是 的简写mouseenter mouseleave
:
如果我有一个工作示例,我会提供更多建议。
看这个例子:
(function($) {
$(document).ready(function() {
industriesBackgrounds();
});
function industriesBackgrounds() {
$('#industries-list a').on("mouseenter mouseleave", function(e) {
const type = e.type;
const href = jQuery(this).attr("href").replace("#", "");
$('#industries').toggleClass(`industry-${href}-hover`, type == 'mouseenter');
console.log((type == 'mouseenter') ? `Added` : `Removed`, `industry-${href}-hover`);
}).on("focus blur", function(e) {
const type = e.type;
const href = jQuery(this).attr("href").replace("#", "");
$('#industries').toggleClass(`industry-${href}-hover`, type == 'focus');
console.log((type == 'focus') ? `Added` : `Removed`, `industry-${href}-hover`);
});
}
})(jQuery);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="industries" class="et_pb_section">
<div class="et_pb_row">
<div class="et_pb_column">
<div id="industries-list" class="et_pb_module">
<div class="et_pb_text_inner">
<ul>
<li><a href="#education">Education</a></li>
<li><a href="#energy">Energy</a></li>
<li><a href="#healthcare">Healthcare</a></li>
</ul>
</div>
</div>
<!-- .et_pb_text -->
</div>
<!-- .et_pb_column -->
</div>
<!-- .et_pb_row -->
</div>
<!-- .et_pb_section -->
推荐阅读
- node.js - 无法导出连接
- reactjs - ReactNative Expo 预加载和缓存图像
- python - Python - 按组列出来自日志和输出的数据并计算总数
- powerbi - 表格模型 - 按列排序:属性值无效的多个不同值
- c++ - 内部带有数字的动态 ASCII 框
- angular - errors.ts:30 错误错误:未捕获(在承诺中):错误:无法匹配任何路由。URL 段:'产品,%20productId'
- javascript - 根据jQuery中的函数参数创建一个显示所选属性和值的文本的函数
- python - Python从之前的两个类中继承一个类(机器学习预处理)
- java - Spring-security:有没有办法使用来自客户端的 cookie 验证 url 参数?
- python - Lambda Python 查询 SSM 参数存储值