javascript - 对一个 onclick 事件使用两个 id
问题描述
我有一个带有打开/关闭动画的简单搜索栏,但我想将它们都放在一个 header.php 中,一个用于桌面,一个用于移动,因为我有一个移动工具栏,我想在那里显示它。这是我的移动 html 结构:
<div class="mobile-toolbar">
<div class="search-bar">
<button class="btn-search-subxxmit" aria-label="Search submit" disabled type="submit"><i class="ti-search icon-search" id="icon-search"></i></button>
<input type="text" class="search-field" id="search-field" value="" placeholder="Search by keyword">
<span class="search-clear">╳</span>
</div>
</div>
这就是我桌面上的内容:
<div class="header-toolbar">
<div class="search-bar">
<button class="btn-search-subxxmit" aria-label="Search submit" disabled type="submit"><i class="ti-search icon-search" id="icon-search"></i></button>
<input type="text" class="search-field" id="search-field-desktop" value="" placeholder="Search by keyword">
<span class="search-clear">╳</span>
</div>
</div>
这是我的 JavaScript:
var mobTool = document.querySelector ( '.mobile-toolbar');
logo = mobTool.querySelector ( '.logo');
navBtn = mobTool.querySelector ('.mobile-nav-btn');
var bar = document.querySelector( '.search-bar' ),
icon = bar.querySelector( '.icon-search' ),
input = bar.querySelector( 'input' );
clear = bar.querySelector ( '.search-clear');
clear.style.opacity = '0';
icon.addEventListener( 'click' , function(e) {
e.preventDefault();
//i can move this in a class
icon.classList.add( 'clicked' );
input.style.width = '50rem';
input.style.padding = '0 35px';
input.style.border = '1px solid gray';
input.style.color = 'black';
input.style.height = '60%';
logo.style.display = 'none';
navBtn.style.display = 'none';
// clear.style.opacity = '1';
});
document.getElementById('search-field').addEventListener('input', function(e) {
if (e.target.value !== '') {
clear.style.opacity = '1';
clear.style.display = 'block';
}
// else {
// clear.style.opacity = '0';
// }
});
jQuery(document).ready(function ($) {
$(function(){
$('.search-clear').click(function(e){
$('.search-field').val('');
$('.search-clear').css('opacity','0');
});
});
$(document).mouseup(function(e) {
var container = $(".search-bar");
container.removeClass("clicked");
if (!container.is(e.target) // if the target of the click isn't the container...
&& container.has(e.target).length === 0) // ... nor a descendant of the container
{
container.removeClass("clicked");
$('.search-field').css('width', '0');
$('.search-field').css('padding', '0 0');
$('.search-field').css('border', 'none');
$('.search-clear').css('opacity','0');
$('.mobile-toolbar .logo').css('display','inline-block');
$('.mobile-toolbar .mobile-nav-btn').css('display','block');
}
});
});
是否可以对其进行编辑,以便我可以在移动设备和桌面设备上使用相同的功能?我正在使用 document.querySelector,但我不确定是否应该使用 querySelectorAll,我是新手,我不知道该怎么做。请帮忙!谢谢!
解决方案
有两种方法可以做到这一点。
- 将您的事件侦听器附加到两个元素,使用
querySelectorAll()
:
[...document.querySelectorAll('.search-input')].forEach(input => {
input.addEventListener('input', function (e) {
// your code
});
});
- 利用事件冒泡 - 将事件侦听器添加到任何公共父级(我正在使用
<body>
下面)并检查触发事件的元素是否实际上是.search-input
:
document.body.addEventListener('input', function (e) {
if (!event.target.classList.contains('search-input')) return;
// your code
});
第二个有一些优点 - 您可以在输入甚至在 DOM 中之前添加此代码,并且任何新的、动态添加.search-input
的也将由它处理。
推荐阅读
- javascript - 在 MySQL 中使用不同的键更新多行
- trusted-timestamp - 可以将粗略时间用作时间戳权限吗?
- javascript - 在javascript中动态设置特定标签的样式
- javascript - If else key split JSON
- amazon-web-services - 用于创建 AWS SNS 主题订阅的 Terraform 模块
- r - 在 r 中使用 bas.lm() 进行贝叶斯多元线性回归
- zsh - 如何定义带有子命令的命令的 zsh 自动补全?
- reactjs - 按钮(onclick)问题它在 Chrome 中有效,但在 Firefox 中无效
- java - 使用自定义数据类型的方法的 NoSuchMethodException
- visual-studio-code - 如何在 VS Code + Ionide 中启用智能感知?