【问题标题】:Using event in jQuery custom function在 jQuery 自定义函数中使用事件
【发布时间】:2017-12-25 04:01:54
【问题描述】:

我正在制作一个弹出系统,但在我的自定义函数中使用 event 作为属性时遇到了一些问题。这是我的代码:

var openLayoutPopup = function(event){
    event.preventDefault();
    var target = $(event.target);
    var flexible_field = target.closest('.acf-field-flexible-content').attr('data-key');
    var popup = $('.'+flexible_field);
    var overlay = $('.bbh-popup-overlay');

    popup.addClass('open').fadeIn();
    overlay.fadeIn();

}

$('.my-class').click(openLayoutPopup(event));

但是我的控制台给了我以下错误,说事件未定义:

ReferenceError: 事件未定义

我之前使用过event.targetevent.which,但仅用于未命名的函数。

另外,我还有另一个类似的函数,我需要在其中传递event 和一个辅助布尔参数:

function closeLayoutPopup(event, openLayout){
    event.preventDefault();

    var popup = $(event.target).closest('.bbh-popup');
    var overlay = $('.bbh-popup-overlay');

    popup.removeClass('open').fadeOut();
    overlay.fadeOut();
    if(open == true){
        var dataLayout = target.attr('data-layout');

        acf.fields.flexible_content.add(dataLayout);
    }
}

同样,我对如何传递参数感到困惑。

编辑:

我试图做的很快解释是让一个按钮打开一个弹出窗口。弹出窗口有两个按钮,一个用于关闭弹出窗口,一个用于将布局添加到页面并随后关闭。问题是我错误地调用了函数,而没有意识到我的解决方案不合逻辑。

感谢@Raibaz,我修复了点击事件。然后我将closeLayoutPopup 添加到addLayout 函数中,而不是合并它们:

/*==============================================
=            Function - Close popup            =
==============================================*/
function closeLayoutPopup(event){
    event.preventDefault();
    var popup = $(event.target).closest('.bbh-popup');
    var overlay = $('.bbh-popup-overlay');

    popup.removeClass('open').fadeOut();
    overlay.fadeOut();
}

/*=============================================
=            Function - Open popup            =
=============================================*/
var openLayoutPopup = function(event){
    event.preventDefault();
    var target = $(event.target);
    var flexible_field = target.closest('.acf-field-flexible-content').attr('data-key');
    var popup = $('.'+flexible_field);
    var overlay = $('.bbh-popup-overlay');

    popup.addClass('open').fadeIn();
    overlay.fadeIn();

}

/*=============================================
=            Function - Add Layout            =
=============================================*/
var addLayout = function(event){
    event.preventDefault();
    var target = $(event.target);
    var dataLayout = target.attr('data-layout');                

    acf.fields.flexible_content.add(dataLayout);
    closeLayoutPopup();
}

/*----------  add section click - open popup  ----------*/
$('.acf-field-flexible-content .acf-flexible-content > .acf-actions a.acf-button').on('click',openLayoutPopup);     

/*----------  Close button click  ----------*/
$('.layout-picker-close').on('click', closeLayoutPopup);

/*----------  Add layout  ----------*/
$('.bbh-popup a.add-layout-button').on('click', addLayout);

【问题讨论】:

  • 这是什么? $('.my-class(openLayoutPopup(event)); 错字???我不确定你的意图是什么。
  • @Kosch 是的,那是当年的错字。我正在删除一个非常长的选择器,并且对退格按钮感到有点高兴。现在已经恢复正常了。 @t.niese 如果我将event 作为'.my-class' 的点击事件的参数传递,我会收到该行的错误。如果我没有传递任何东西,我会在函数event.preventdefault() 的第一行得到错误

标签: javascript jquery function parameter-passing


【解决方案1】:

我假设您想在单击具有my-class 类的元素时打开布局弹出窗口,因此您的代码应该是这样的:

$('.my-class').on('click', openLayoutPopup);

在调用openLayoutPopup回调函数时,会将事件参数传递给函数。

您可以查看jQuery.on 的文档以供参考。

至于另一个函数,您可以使用自定义 CSS 类或数据属性来指示有一个打开的弹出窗口,而不是将第二个布尔参数传递给 click 事件处理程序,因此您的 openLayoutPopup 函数可以包含一些东西像这样:

$('body').addClass('has-popup')

在您的closeLayoutPopup 中,您可以检查该类是否存在以确定是否存在打开的弹出窗口,并最终在关闭弹出窗口时将其删除。

【讨论】:

  • 我觉得我尝试了您的第一个示例,但显然我搞砸了。可能是on('click', myFunction(event))。但是效果很好,谢谢!关于另一个选项,我意识到我完全不需要第二个参数,因为我可以从执行所有其他操作的函数中运行 closePopup 函数,这是我试图区分的。使用操作或不使用操作关闭弹出窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
相关资源
最近更新 更多