2011-01-17 3 views
40

Я знаю, что вы можете добавить новые функции JQuery по $.fn.someFunction = function()Добавить функцию JQuery к конкретным элементам

Однако я хочу добавить функции только для определенных элементов. Я попробовал этот синтаксис, и это не работает $('.someElements').fn.someFunction = function()

Я хочу сделать это так, что я могу вызвать функцию как это где-то в коде $('someElements').someFunction();

+0

Я не уверен, что это возможно, но если это так, то почему вы хотите нанести ущерб вашему коду? Если вы хотите ограничить его определенными селекторами, используйте эти селектора. Или, кешируйте результат из '$ ('. SomeElements')' и вызывайте функцию как эту переменную плюс '.someFunction()' позже. – Robert

+0

Проблема: $ (...). Fn не существует, только $ .fn. И просто установка $ (...). SomeFunction не имеет такого же эффекта, потому что он не будет запускать его для каждого элемента в своем собственном контексте. –

+0

@ Робер - да, в конце концов я просто закрепил результат и использовал ссылку для вызова добавленной функции. – peter

ответ

41

Использование .bind() и .trigger()

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


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

По JQuery 1.7, метод .on() является предпочтительным метод для присоединение обработчиков событий к объявлению ocument.

+2

и для получения данных, возвращаемых функцией вместо цепочки jquery, используйте метод triggerHandler – r043v

+8

просто обновление здесь, 'bind' устарел и заменен на 'on' – DMTintner

+0

yes! там указывается ссылка на ... – Reigel

0

я имел представление о том, что я думал, что мог бы работать, чтобы сделать близко к чему вы хотите, но это не сработало, и я пришел к выводу, что это невозможно.

Моя идея состояла в том, чтобы делать то, что вы пытались, но на кэшированных объект JQuery, например:

var a = $("a"); 
a.fn.someFunc = function() {...}; 
a.someFunc();

Но поскольку $(...).fn не существует, это не представляется возможным.

18

лет может сделать выше с этим:

$.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/

+4

он знает, что ... – Reigel

+2

должно быть возвращение этого для того, чтобы цепи – qwertymk

+0

@qwertymk: Я знаю, это должен был сделать точку, а не определять весь плагин jQuery. @Reigil: ibidem, я пытался указать точку maka, что это уже может быть достигнуто с помощью jQuery. Весь ответ не имеет смысла. Вы можете выбрать точный набор с помощью $ (..) вместо того, чтобы пересекать все сопоставленные DOM, чтобы устранить их с помощью новых критериев. – DarkThrone

0

Я также не уверен в своем ответе, если это поможет вам, но просто попытайтесь использовать .live?

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

Yo, необходимо было сделать то же самое, придумал это. его хорошая причина, по которой вы уничтожаете элемент, и функция идет пуф! Я думаю, что ...

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

@ Ответ Рейгеля замечательный! Однако вы можете также использовать синтаксис $.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/

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(); 
+0

Это отличный способ справиться с этим. В частности, это полезно, если вы добавили что-то в DOM (то есть окно переполнения), и вы хотите, чтобы функции присутствовали только для этого элемента DOM. Поэтому, когда вы позже удаляете pop-over, функции исчезают вместе с ним. Вы также можете сделать это следующим образом: '$ ('# menu') [0] .open = function() {...};' Чтобы вы могли получить дескриптор и назначить произвольную функцию для всего этого за один шаг , – JaredC

-1

Я сделал это и его работу отлично ..

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

3

Если Вы желаете эту функцию только для определенных селекторов, следующий будет работать для вас. У меня только был сценарий, в котором я нуждался в этом, и он работает хорошо.

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

    $(this).init.prototype.getUrl = function(){ 
     // do things 
    }; 
}) 

то позже вы можете сделать

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

без определения его как плагин, или использовать данные или BIND/на/инициирующих событий.

Очевидно, что вы можете изменить функцию возврата, содержащего объект, если вы хотите использовать его в цепочки, возвращая this

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

    $(this).init.prototype.getUrl = function(){ 
     // do things 
     return this; 
    }; 
}) 
+1

это приложит getUrl к jquery не только для этого элемента –

+0

Было бы интересно, почему через 3 года кто-то понизит это. Объяснение было бы неплохо –

2

Наиболее очевидным решением является назначение функции в качестве свойства объекта:

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

Затем вызовите его на объект таким образом:

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

Примечание: ваша функция является обратным значением внешнего, : http://api.jquery.com/prop/#prop-propertyName-function

Смежные вопросы