【问题标题】:Add jQuery function to specific elements将 jQuery 函数添加到特定元素
【发布时间】:2011-06-10 05:41:40
【问题描述】:

我知道你可以通过$.fn.someFunction = function()添加新的jQuery函数

但是,我只想向特定元素添加功能。我试过这个语法,它不起作用$('.someElements').fn.someFunction = function()

我想这样做,以便我可以在代码$('someElements').someFunction(); 的某处调用这样的函数

【问题讨论】:

  • 我不确定这是否可能,但如果是的话,你为什么要削弱你的代码?如果要将其限制为某些选择器,请使用这些选择器。或者,缓存来自$('.someElements') 的结果,然后将该函数作为该变量加上.someFunction() 稍后调用。
  • 问题是 $(...).fn 不存在,只有 $.fn。并且仅仅设置 $(...).someFunction 并没有相同的效果,因为它不会在每个元素上运行它自己的上下文。
  • @Robert 我不知道为什么 OP 想要它,但我想将函数绑定到元素,以便调用函数不需要区分元素。我有多个字段类型,每个都调用它自己的验证方法——因为我的 AJAX 调用主要是在没有 AJAX 的情况下复制表单所做的事情,所以编写一个可以调用验证函数的函数是有意义的,然后只需使用 name 属性和如果我使用 HTML 提交按钮,构建将发送的 POST 数据的值。这样看起来更像是 OOP。
  • 简单:var someElements = $('.someElements'); someElements.myFunc = function() { /* code here */ };

标签: jquery function add


【解决方案1】:

使用.bind().trigger()

$('button').bind('someFunction',function() {
    alert('go away!')
});


$('button').click(function(){
    $(this).trigger('someFunction');
});

从 jQuery 1.7 开始,.on() 方法是 将事件处理程序附加到文档。

【讨论】:

  • 并获取函数返回的数据,而不是 jquery 链接使用 triggerHandler 方法
  • 这里只是一个更新,'bind' 已被弃用并替换为 'on'
  • 不是someFunction。它是someEvent。您为自定义事件绑定事件处理程序并触发事件。触发事件和调用插件函数是两件不同的事情。
【解决方案2】:

最明显的解决方案是分配一个函数作为对象的属性:

obj.prop("myFunc", function() {
  return (function(arg) {
    alert("It works! " + arg);
  });
});

然后以这种方式在对象上调用它:

obj.prop("myFunc")("Cool!");

注意:你的函数是外层的返回值, 见:http://api.jquery.com/prop/#prop-propertyName-function

【讨论】:

    【解决方案3】:

    如果您只想为特定的选择器使用此功能,以下内容将适用于您。我刚刚遇到了一个我需要它的场景,并且效果很好。

    $('.my-selector').each(function(){
    
        $(this).init.prototype.getUrl = function(){
            // do things
        };
    })
    

    以后你可以做

    $('.my-selector').getUrl()
    

    无需将其定义为插件,或使用数据或绑定/开启/触发事件。

    如果你想通过返回this在链接中使用它,显然你可以改变函数以返回包含对象

    $('.my-selector').each(function(){
    
        $(this).init.prototype.getUrl = function(){
            // do things
            return this;
        };
    })
    

    【讨论】:

    • 这会将getUrl附加到jquery而不仅仅是那个元素
    • 很想知道为什么 3 年后,有人对此投了反对票。一个解释会很好
    • 我不是那个投反对票的人,但投反对票可能是因为这不会只为特定的选择器附加此功能,它会将其附加到所有元素(如@JithinJose 评论的那样,这将将 getURL 附加到 jQuery,而不仅仅是元素)。这里有一个 jsfiddle:jsfiddle.net/xpvt214o/563274
    • @patrick 老实说,我不知道以前是否这样做过,但是您是否停下来认为在 3 到 4 年内框架实际上可能也发生了变化? 7 年后,我认为 stackoverflow 不应该成为当前软件版本的技术信息预言机!想想吧。
    • @danrichardson,当我在寻找问题的答案时,我仍然找到了这个答案,所以,不,我认为告诉其他有同样问题的人不是一个坏主意您发布的解决方案不起作用,而且显然在 14 年 9 月也不起作用......
    【解决方案4】:

    我做了这个并且它工作正常..

     function do_write(){
         $("#script").append("<script> $(\'#t"+(id_app+4)+"\').change(function(){  alert('Write Your Code here');    });<\/script>");
         console.log("<script> $(\'#t"+(id_app+4)+"\').change(function(){  alert('hello');    });<\/script>");
    }
    

    并从您的动态函数中调用函数,该函数在 html 中创建动态控件

    【讨论】:

      【解决方案5】:

      我实际上也有这个用例,但是有一个缓存对象。所以我已经有了一个 jQuery 对象,一个可切换的菜单,我想将两个函数附加到该对象,“打开”和“关闭”。保留元素本身范围所需的功能就是这样,所以我希望this 成为菜单对象。无论如何,您可以随意添加函数和变量,就像任何其他 javascript 对象一样。有时我会忘记这一点。

      var $menu = $('#menu');
      $menu.open = function(){
         this.css('left', 0);
         this.is_open = true; // you can also set arbitrary values on the object
      };
      $menu.close = function(){
         this.css('left', '-100%');
         this.is_open = false;
      };
      
      $menu.close();
      

      【讨论】:

      • 这是处理它的好方法。如果您向 DOM 添加了一些东西(即弹出窗口)并且您只希望为该一个 DOM 元素提供功能,这尤其有用。因此,当您稍后删除弹出框时,这些功能也会随之消失。您也可以这样做:$('#menu')[0].open = function(){ ... }; 这样您就可以一步获得句柄并为其分配任意函数。
      【解决方案6】:

      哟,需要做同样的事情,想出了这个。这很好,因为您破坏了元素并且功能变得很糟糕!我觉得……

      var snippet=jQuery(".myElement");
      snippet.data('destructor', function(){
          //do something
      });
      snippet.data('destructor')();
      

      【讨论】:

      • 如果 snippet 不是全局的(大多数 UI 代码都是这种情况),您的析构函数将在其他函数和事件中不可用
      【解决方案7】:

      @Reigel 的回答很棒!但是,您也可以使用 $.fn 语法并让您的函数只处理某些元素:

      $.fn.someFunction = function(){
          this.each(function(){
              // only handle "someElement"
              if (false == $(this).hasClass("someElement")) {
                  return; // do nothing
              }
      
              $(this).append(" some element has been modified");
      
              return $(this); // support chaining
          });    
      };
      
      // now you can call your function like this
      $('.someElement').someFunction();            
      

      查看工作中的 jsfiddle:http://jsfiddle.net/AKnKj/3/

      【讨论】:

        【解决方案8】:

        我也不确定我的回答是否会对您有所帮助,但只是尝试一下使用 .live 怎么样?

        $(selector).live(click,function(){
            //some codes here
        });
        

        【讨论】:

          【解决方案9】:

          你可以这样做:

          $.fn.testFn = function(){
              this.each(function(){
                  var className = $(this).attr('class');
                  $(this).html(className);
              });    
          };
          
          $('li').testFn(); //or any element you want
          

          测试:http://jsfiddle.net/DarkThrone/nUzJN/

          【讨论】:

          • 应该有一个 return this 才能上链
          • @qwertymk:我知道,这是为了说明问题,而不是定义一个完整的 jQuery 插件。 @Reigil:同上,我试图指出,这已经可以通过 jQuery 实现。整个答案毫无意义。您可以使用 $(..) 选择确切的集合,而不是遍历所有匹配的 DOM 以通过新条件消除。
          • @DarkThrone 如果我想为函数添加参数怎么办?我试过把它放在 function() 中,但它不起作用。
          猜你喜欢
          • 2023-03-15
          • 2015-05-24
          • 2012-02-05
          • 1970-01-01
          • 1970-01-01
          • 2018-01-10
          • 1970-01-01
          • 2015-11-08
          • 1970-01-01
          相关资源
          最近更新 更多