Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用一些自定义函数包装单击事件_Javascript_Jquery_Javascript Events - Fatal编程技术网

Javascript 如何使用一些自定义函数包装单击事件

Javascript 如何使用一些自定义函数包装单击事件,javascript,jquery,javascript-events,Javascript,Jquery,Javascript Events,我有一个名为“创建项目”的按钮,当用户单击该按钮时,我希望发生两件事 一个ajax调用,用于检查是否允许用户创建项目 如果允许,则正常执行按钮,如果不允许,则弹出一个模式对话框,说明不允许创建新项目 我有以下代码 $('.create_project').click(function(e) { e.stopDefault(); $.getJSON('/check_user_limit', function(data){ if(data.allow_to_create_

我有一个名为“创建项目”的按钮,当用户单击该按钮时,我希望发生两件事

  • 一个ajax调用,用于检查是否允许用户创建项目
  • 如果允许,则正常执行按钮,如果不允许,则弹出一个模式对话框,说明不允许创建新项目 我有以下代码

    $('.create_project').click(function(e) {
       e.stopDefault();
       $.getJSON('/check_user_limit', function(data){
            if(data.allow_to_create_project){
               //trigger the click here
            }else{
               //modal here
            }
        }
    });
    

    在上面的代码中使用“trigger”将不起作用,因为它将成为一个无限循环。取消绑定第一次起作用,但第二次不起作用,因为foo不再绑定到函数

    我不知道你为什么不想这样做:

    $('.foo').click(function(e) {
        $(this).href = "/bar";
    });
    

    很简单,您只需执行以下操作:

    $('.foo').click(function(e) {
       $(this).href = "/bar"; # done something else before the click
    
       return true;
    });
    
    如果您想截获click事件而不是传播它,那么只需返回false即可。我注意到您使示例更加明确,但解决方案仍然有些相似。我们没有返回true来传播事件,而是手动触发click,同时告诉click函数通过返回false吞下事件。然后,代码将如下所示:

    $('.create_project').click(function(e) {
       $.getJSON('/check_user_limit', function(data) {
            if (data.allow_to_create_project) {
               e.click();
            } else {
               //modal here
            }
       }
       return false;
    });
    

    然而,发出AJAX请求以验证某个特性是否可用通常不是一个好主意。如果服务器已经知道用户无法创建项目,那么为什么首先要单击按钮?用适当的状态更新控件。

    我有点困惑。您提到解除绑定,但实际代码中没有实际的事件解除绑定

    如果您只是试图执行某个元素的代码预单击,那么您的做法是错误的

    $('.foo').click(function(e)
    {
        $(this).href = "/bar";
        return true; // this is implicit, but you could return false to cancel the event
    });
    

    如果您正在尝试做其他事情,那么我建议使用两个单独的事件,其中一个是自定义事件名称。

    为什么要为此使用客户端代码

    从可用性的角度来看,最好使用服务器端代码检查用户权限,如果出现问题,在页面加载时在禁用按钮旁边显示一条消息。此消息还将提到为该用户启用项目创建可以执行的操作


    有时候,你只需要评估一个特定的工具是否是实现目标所必需的。

    你到底想实现什么?这看起来有点像bass ackwards,可能还有更好的方法。你只是想让事件冒泡起来,这样点击就好像你什么都没做一样?然后在事件处理程序的末尾执行“returntrue”,我认为不应该在同一个方法中附加和触发单击。您不能将单击附加到其他位置吗?您正在单击的此元素是一个锚点(链接)?你想在你真正跟随链接之前改变链接路径中的一些东西吗?如果这是真的,那似乎是可疑的行为。作为一名网络用户,如果我点击的链接在点击时发生了变化,因此将我发送到了一个与我预期不同的地方(如果这是可能的话),我会感到不安。我有签入服务器端,客户端只是试图提供一个良好的用户体验,以拥有一个模态对话框。模态对话框并不总是等同于良好的用户体验。既然您正在检查服务器端,为什么不利用该检查并立即给出反馈,而不是让用户进行额外的查询呢?谢谢,但因为我需要发出一个ajax调用,所以我需要先执行e.preventDefault,“return true”在“e.preventDefault”之后不起作用。