【问题标题】:jquery function not being properly executedjquery函数没有正确执行
【发布时间】:2022-01-17 20:46:38
【问题描述】:

我正在尝试在页面上实现覆盖,但它没有按预期工作。

用例:

  • 当用户点击页面上的搜索图标时,会显示一个叠加层
  • 当显示叠加层时,用户可以点击关闭按钮来移除叠加层

问题: 当我在浏览器中刷新并查看我的 js 代码时,我的叠加层已经明显显示,这在我单击搜索图标之前不应该显示,所以我没有正确调用它吗?

我在 Search.js 的 events() 函数中调用了“openOverlay”和“closeOverlay”函数,这应该会触发该函数。

开发环境:

  • node.js 和 webpack
  • scripts.js:导入主 css 文件并实例化模块
  • Search.js 和我的覆盖代码(导入 jquery 并导出默认搜索)

scripts.js

import "../css/styles.css"

// modules
import Search from "./modules/Search"

//instantiate new object using modules/classes
const search = new Search()

// Allow new JS and CSS to load in browser without a traditional page refresh
if (module.hot) {
  module.hot.accept()
}

搜索.js

import $ from 'jquery';


//alert("helo there");

function Search(){
    //describe/create object
    var openButton = $(".js-search-trigger");
    var closeButton = $(".s-overlay__close");
    var searchOverlay = $(".s-overlay");

    //events
    function events() {
        openButton.on("click", openOverlay);
        closeButton.on("click", closeOverlay);
    };
    events();
    
    //methods
    function openOverlay(){
        searchOverlay.addClass("s-overlay--active");
    };
    function closeOverlay(){
        searchOverlay.removeClass("s-overlay--active");
    };
}
export default Search;

html:

<div class="s-overlay s-overlay--active">
    <div class="s-overlay__top">
        <div class="s-container">
            <i class="s-overlay__icon" aria-hidden="true">
                <svg>...</svg>
            </i>
            <input id="search-term" class="search-term" type="text" placeholder="What are looking for?">
            <i class="s-overlay__close" aria-hidden="true">
                <svg>...</svg>
            </i>
        </div>
    </div>
</div>

css:

.s-overlay { overflow-y: auto; overflow-x: hidden; z-index: 110; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(255, 255, 255, 0.96); visibility: hidden; opacity: 0; transform: scale(1.09); transition: opacity 0.3s, transform 0.3s, visibility 0.3s; box-sizing: border-box;}
.s-overlay--active { visibility: visible; opacity: 1; transform: scale(1);}
.s-overlay__top {  margin-top: 32px; position: relative; padding: 1em; background-color: rgba(0, 0, 0, 0.12); }
.s-overlay__icon { line-height: 0; display: block; }
.s-overlay__close {margin-left: auto; line-height: 0; display: block; transition: all 0.3s;}
.s-overlay__close:hover { opacity: 1; }

【问题讨论】:

  • 作为第一个调查步骤,我将在方法中添加console.log('openOverlay')console.log('closeOverlay'),以便您准确查看方法何时被调用。如果在页面加载时没有调用它们并且您仍然看到覆盖,我会假设您的样式逻辑或热重新加载存在问题。您可以尝试评论scripts.js 的最后几行,以便了解热重载是否导致此处出现问题。
  • Alex 我测试了你所说的,我的覆盖仍然存在,我的 css 似乎可以正常工作。但是,当我独立于 events() 调用 openOverlay() 和 closeOverlay() 函数时,它可以工作,如果我调用 events() 来调用其中的这两个函数,为什么会这样?
  • 所以你确定这两种方法在页面加载时肯定没有被调用?您确定这种“可见覆盖”状态不是热模块重新加载的缓存状态吗?评论scripts.js的最后几行怎么样,你试过吗?
  • Alex 我注释掉了热重载并且覆盖仍然存在。当我对这两种方法执行 console.log 时,每个函数名称都会显示在 F12 控制台中。如果我在其中调用这两种方法,event() 似乎不起作用,但如果我独立添加 openOverlay() 和 closeOverlay() 函数,脚本就可以工作。我必须先防止默认,以免触发它吗?
  • Alex 我在这里codepen.io/krystyna93/pen/rNGRJwR 的codepen 中进行了测试,但是它在做同样的事情,覆盖仍然存在。当你查看它时

标签: javascript html jquery css


【解决方案1】:

您已经在页面加载时将活动类分配给 DOM 元素:

&lt;div class="s-overlay s-overlay--active"&gt;

只需删除该类,您就会看到所需的行为。

<div class="s-overlay">

【讨论】:

  • 嗯,它可以在 codepen 中使用,但是在我的 node.js 环境中,当我单击页面上的搜索图标时,没有任何反应...
  • 当你检查 DOM 元素时,当你点击时,活动类是否被添加到 search-overlay 元素中?
  • 嗨,Alex,我之前从元素中删除了该类,但我只是注释掉了 scripts.js 中的热门模块及其工作......
  • 如何让 jquery 使用 hot module 运行?为什么会冲突?
  • 请尝试以下操作。检查 DOM,找到你的 s-overlay 元素。现在单击搜索图标。您是否发现活动类现在已添加到您的元素中?还是控制台有错误?可能是模块的元素生成了不同的范围,您在其中找不到 DOM 元素。
猜你喜欢
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多