You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WordPress插件短代码在Elementor Pro中下拉功能异常求助

问题:WordPress Elementor Pro中下拉菜单点击后瞬间关闭又重新打开

现象

在JS Fiddle环境中下拉功能运行正常,但在使用Elementor Pro的WordPress站点中,下拉菜单出现异常:点击后会瞬间关闭随即重新打开。
问题截图

实现方式

通过自定义短代码嵌入功能,将HTML、CSS、JS及依赖资源封装在PHP函数中:

function locationsfunction(){
    echo'<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
         <link rel="stylesheet" href="https://unpkg.com/boxicons@2.1.1/css/boxicons.min.css">
         <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.slim.min.js"></script>
         <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
         <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js"></script>
         <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>';
    global $wpdb;
?>

<div class="select-menu">
    <div class="location-btn">
      <span class="location-text">Location</span>
      <i class="bx bx-chevron-down"></i>
    </div>
  
    <ul class="options">
      <li class="option">
        <span class="option-text">Florida</span>
      </li>
      <li class="option">
        <span class="option-text">Georgia</span>
      </li>
      <li class="option">
        <span class="option-text">Texas</span>
      </li>
    </ul>
</div>

<style> /* CSS样式参考JS Fiddle中的实现 */ </style>

<script>
    const optionMenu = document.querySelector('.select-menu'),
    location_btn = optionMenu.querySelector('.location-btn'),
    options = optionMenu.querySelectorAll('.option'),
    location_text = optionMenu.querySelector('.location-text');

    location_btn.addEventListener('click', () => optionMenu.classList.toggle('active'));

    options.forEach((option) => {
    option.addEventListener('click', () => {
        let selectedOption = option.querySelector('.option-text').innerText;
        location_text.innerText = selectedOption;

        optionMenu.classList.remove('active');
    });
        });
</script>

<?php
}
add_shortcode('locationsoutput','locationsfunction');
?>

相关环境截图:

  • 插件名称:插件名称截图
  • Elementor中短代码使用:短代码截图

已尝试的解决方案

  • 调整函数内HTML、脚本、CSS的加载顺序,优先加载HTML结构
  • 将脚本中的双引号替换为单引号
  • 确保脚本代码完全包裹在函数内部

推荐解决思路

1. 阻止事件冒泡(最可能的原因)

点击下拉选项时,事件会冒泡到父元素.location-btn,触发其click事件导致active类被再次切换(先移除后添加)。在选项的点击事件中加入阻止冒泡的代码:

options.forEach((option) => {
    option.addEventListener('click', (e) => {
        e.stopPropagation(); // 阻止事件向上冒泡
        let selectedOption = option.querySelector('.option-text').innerText;
        location_text.innerText = selectedOption;
        optionMenu.classList.remove('active');
    });
});

2. 避免重复引入jQuery

代码中同时引入了jQuery Slim版和完整版,可能导致冲突,建议只保留一个版本(比如移除Slim版,使用完整版)。

3. 确保脚本在DOM加载完成后执行

Elementor的DOM结构加载可能有延迟,将JS代码包裹在DOMContentLoaded事件中,确保元素已存在再绑定事件:

document.addEventListener('DOMContentLoaded', function() {
    const optionMenu = document.querySelector('.select-menu'),
    location_btn = optionMenu.querySelector('.location-btn'),
    options = optionMenu.querySelectorAll('.option'),
    location_text = optionMenu.querySelector('.location-text');

    location_btn.addEventListener('click', () => optionMenu.classList.toggle('active'));

    options.forEach((option) => {
        option.addEventListener('click', (e) => {
            e.stopPropagation();
            let selectedOption = option.querySelector('.option-text').innerText;
            location_text.innerText = selectedOption;
            optionMenu.classList.remove('active');
        });
    });
});

4. 排查CSS样式冲突

检查Elementor的默认样式是否覆盖了.select-menu.active的样式,可通过浏览器开发者工具查看样式优先级,必要时给自定义CSS添加更具体的选择器(比如添加父元素类名)来提高优先级。

内容的提问来源于stack exchange,提问作者J Can

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:10:28