我需要将一个事件附加到Wordpress的Hero Maps插件中的类别按钮。我目前使用的代码没有按预期工作:
Wordpress插件生成的代码:
<div id="" class="hmapsprem_cat_tab_container ">
<div id="hmapsprem_tab_cat_sel_0" class="hmapsprem_cat_tab active" ><a>CULTURE</a></div>
<div id="hmapsprem_tab_cat_sel_1" class="hmapsprem_cat_tab active"><a>DINING</a></div>
<div id="hmapsprem_tab_cat_sel_2" class="hmapsprem_cat_tab active"><a>HOTEL</a></div>
<div id="hmapsprem_tab_cat_sel_3" class="hmapsprem_cat_tab active"><a>RETAIL</a></div>
<div id="hmapsprem_tab_cat_sel_5" class="hmapsprem_cat_tab active"><a>z199W</a></div>
<div style="clear:both;"></div>
</div>
我的jQuery:
$(".hmapsprem_cat_tab_container > div").click(function(){
var id = $(this).attr('id');
console.log(id);
});
没有任何内容记录到控制台。该插件是否以某种方式拒绝我访问这些元素?
Wordpress在noConflict模式下运行jQuery。这样做是为了允许依赖于特定jQuery版本的插件加载他们自己的jQuery版本,而不是与Wordpress使用的版本冲突。
对你来说,这意味着你需要将你可能拥有的任何jQuery代码包装到一个函数中,并将它传递给jQuery对象:
(function($) {
// $ works here...
})(jQuery)
另一种方法是在所有jQuery代码中使用jQuery
而不是$
。
此外,请确保在您希望存在的代码时运行代码。如...
(function($) {
// on dom loaded:
$(document).ready(){
// stuff
}
// on page loaded:
$(window).on('load', function(){
// stuff
})
})(jQuery)
在将jQuery代码包装到noConflict包装器中之后,如果它仍然不起作用,请在console.log(this)
声明之前执行var
,以确保执行代码并找出this
对象在该上下文中的内容。
也许你的.hmapsprem_cat_tab_container > div
选择器有问题,这是你的代码的问题。
注意:一种优越的绑定方式,特别是在WordPress中,任何插件都可以进行ajax调用并动态更改DOM,就是绑定到可以依赖的容器上。
例如,假设您的页面容器的id为main-container
。不是为.hmapsprem_cat_tab_container > div
集合中的每个元素添加一个绑定,而是只对您可以依赖的容器进行一次绑定:
$('#main-container').on('click', '.hmapsprem_cat_tab_container > div', function(e) {
console.log(e, this);
})
您不仅可以用一个替换多个事件绑定,而且还可以在事件发生时获得选择器评估的巨大优势,而不是在绑定完成时。这意味着绑定将起作用(如果点击是在.hmapsprem_cat_tab_container > div
元素内进行的)甚至是动态添加的元素,在绑定时不存在于DOM中。
显然,您可以将#main-container
替换为.hmapsprem_cat_tab_container > div
元素的任何其他有效父元素,包括document
。
经验法则是找到(并绑定)包含您要定位的所有子项的最具体的父级。如果在您绑定的容器外部的子项上触发事件,则该函数将不会运行!
最后,但并非最不重要:您应该使用wp_enqueue_script将JavaScript添加到WordPress中,对于这种情况,您应该将jQuery指定为脚本的dep:
function enqueue_my_jquery_script() {
wp_enqueue_script(
'some_specific_script_name',
get_template_directory_uri('path/to/file.js',__FILE__),
['jquery']
);
}
add_action( 'wp_enqueue_scripts', 'enqueue_my_jquery_script' );
上面的代码片段应该在你的活动主题的functions.php
里面,如果你在该文件中有任何定义,你应该确保它没有放在另一个php函数中。 path/to/
应该是相对于活动主题文件夹,file.js
应该包含你的jQuery脚本,包装在上面显示的包装器中。
你有没有包含jquery.min.js库? https://www.w3schools.com/jquery/jquery_get_started.asp
$(".hmapsprem_cat_tab_container > div").click(function(){
var id = $(this).attr('id');
console.log(id);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="" class="hmapsprem_cat_tab_container ">
<div id="hmapsprem_tab_cat_sel_0" class="hmapsprem_cat_tab active" ><a>CULTURE</a></div>
<div id="hmapsprem_tab_cat_sel_1" class="hmapsprem_cat_tab active"><a>DINING</a></div>
<div id="hmapsprem_tab_cat_sel_2" class="hmapsprem_cat_tab active"><a>HOTEL</a></div>
<div id="hmapsprem_tab_cat_sel_3" class="hmapsprem_cat_tab active"><a>RETAIL</a></div>
<div id="hmapsprem_tab_cat_sel_5" class="hmapsprem_cat_tab active"><a>z199W</a></div>
<div style="clear:both;"></div>
</div>
检查JQuery是否可用:Checking if jquery is loaded using Javascript
另外,检查选择器是否正确。
在这种情况下,它是;但是,如果html元素位于代码的其他部分或通过iFrame加载,则需要更改选择器。
一种方法是右键单击html元素并执行Inspect。然后,查看浏览器检测到的选择器是什么。
通过转到DevTools检查jQuery是否正确加载到项目中,而不是转到Sources选项卡,并在左侧尝试查找已附加到项目的jQuery文件。
如果文件是由CDN附加的,只需按CTRL + U / CMD + U并检查它是否正确包含。
我可以看到您正在尝试将此click事件附加到多个元素。
尝试使用事件冒泡机制,因此在文档上触发click事件 - 它更有效。
$(document).on('click', '.hmapsprem_cat_tab', function(event) {
const singleTab = $('.hmapsprem_cat_tab');
console.log(singleTab);
});
在这段代码中,尝试使用console.log这些元素来查明它们是否存在于DOM中。
如果仍然无效,请尝试在$(document).ready();
函数中运行此代码,以确保在执行JavaScript代码之前已加载所有内容。