将jQuery函数添加到特定元素

48 jquery function add

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

但是,我想只为特定元素添加函数.我尝试了这种语法,但它不起作用$('.someElements').fn.someFunction = function()

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

Rei*_*gel 48

使用.bind().trigger()

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


$('button').click(function(){
    $(this).trigger('someFunction');
});
Run Code Online (Sandbox Code Playgroud)

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

  • 这里只是一个更新,'bind'已被弃用并替换为'on' (8认同)
  • 它不是'someFunction`.这是`someEvent`.绑定自定义事件的事件处理程序并触发事件.触发事件和调用插件函数是两回事. (3认同)
  • 并获取函数返回的数据而不是jquery链接使用triggerHandler方法 (2认同)

Dar*_*one 19

你可以这样做:

$.fn.testFn = function(){
    this.each(function(){
        var className = $(this).attr('class');
        $(this).html(className);
    });    
};

$('li').testFn(); //or any element you want
Run Code Online (Sandbox Code Playgroud)

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

  • 应该有一个回报,以便链 (2认同)

小智 10

哟,需要做同样的事情,想出了这个.它很好的原因你破坏元素和功能噗!我认为...

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


Fri*_*ike 8

@ 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();            
Run Code Online (Sandbox Code Playgroud)

见工作jsfiddle:http://jsfiddle.net/AKnKj/3/


dan*_*son 8

如果您只想为特定选择器使用此功能,以下内容将适合您.我刚刚有一个场景,我需要这个并且它很好用.

$('.my-selector').each(function(){

    $(this).init.prototype.getUrl = function(){
        // do things
    };
})
Run Code Online (Sandbox Code Playgroud)

然后你可以做

$('.my-selector').getUrl()
Run Code Online (Sandbox Code Playgroud)

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

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

$('.my-selector').each(function(){

    $(this).init.prototype.getUrl = function(){
        // do things
        return this;
    };
})
Run Code Online (Sandbox Code Playgroud)

  • 这会将getUrl附加到jquery上,而不仅仅是该元素 (2认同)
  • @danrichardson,当我寻找问题的答案时,我仍然找到了这个答案,所以,不,我认为告诉其他有同样问题的人您发布的解决方案不起作用是一个坏主意,并且显然在 14 年 9 月也没有工作...... (2认同)

cha*_*ons 7

我实际上也有这个用例,但是有一个缓存的对象.所以我已经有了一个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();
Run Code Online (Sandbox Code Playgroud)