You can return the jQuery object, but jQuery will throw undefined if
you attempt to call

$('.selector').recurse

You'd have to call $.recurse

You can implement a pretty quick fix, if you don't plan on doing much
else with the function. Try:

$.recurse = $.fn.recurse = function(options){
    ...
}

On May 6, 3:51 pm, AndyCramb <andycr...@googlemail.com> wrote:
> Thanks Eric
>
> So is the only way to chain from an extended function in jQuery is to
> use $.fn.recurse= function(){}
> I cannot uses $.recurse = function() { } and return the jQuery object
> from within this function?
>
> Thanks
> andy
>
> On May 6, 3:13 pm, Eric Garside <gars...@gmail.com> wrote:
>
> > Your "recurse" function is not a method of the jQuery.fn object, so it
> > can't work on elements.
>
> > The line:
>
> > $.recurse = function(options) {
>
> > should be
>
> > $.fn.recurse = function(options) {
>
> > On May 6, 9:00 am, AndyCramb <andycr...@googlemail.com> wrote:
>
> > > I am trying to write a plugin that will eventually match a specific
> > > string pattern on the id attribute of all form element(s)
> > > I aim to get a collection of all elements that I want to return for
> > > chaining
> > > I generate a regular expression on the fly based on the arguments
> > > passed in and use this to find an initial set of elements
> > > I have this returning jquery objects using this
>
> > >         $(":input").filter(function() {
> > >         //return this.id.match(regEx);
> > >             return $(this).attr("id").match(regEx);
> > >         })
>
> > > this also works
>
> > >         $(":input").filter(function() {
> > >             return $(this).attr("id").match(regEx);
> > >         }).setDisabled(true);
>
> > > But when I use this  $("#a_1").recurse({source:"a_1"}).setDisabled
> > > (true); ,my plugin function I get this
>
> > > TypeError: $("#a_1").recurse is not a function
>
> > > Its my first attempt at a plugin and I guess I am not returning the
> > > jquery object and I am not sure if this is the correct approach
> > > Anyway any advice would be much appreciated
> > > Full code below
>
> > > (function($) {
>
> > >     $.recurse = function(options) {
>
> > >         var defaults = {
> > >             delimeter: "_"
> > >             , level: 1
> > >             , dir: "down"
> > >             , source: "body"
> > >         }
>
> > >         var settings = $.extend({}, defaults, options);
>
> > >         // funtion to find regEx
> > >         function generateRegEx(delimeter, src, direction) {
>
> > >             console.log(src.split(delimeter));
> > >             console.log(src.length);
>
> > >             // need to have the concept of next and prev
> > >             // so for prev or back take away a wholePattern match
> > >             // and fro next or forward add a pattern match
> > >             // so based on src and the up or down param
> > >             var dir = direction
>
> > >             arr = src.split(delimeter);
> > >             var arrLength = arr.length;
> > >             console.log(arrLength);
>
> > >             if (arrLength <= 1 && direction == "up") {
> > >                 //alert("the only way is forward");
> > >                 throw Error("you can only go up from here");
> > >                 direction = "up";
> > >             }
>
> > >             arrLength = (direction == "up") ? arrLength - 2 :
> > > arrLength;
>
> > >             //^([0-9a-zA-Z-]+\_){3}$ - this gets all the pattern does
> > > ntot take account of src
> > >             // supercedes the one above ^a_1(\_[0-9a-zA-Z-]+){2}$
> > >             var delPattern = src + "(\\" + delimeter + "[0-9a-zA-Z-]
> > > +)"; //this will match the character that separates the levels
> > >             var numerOfPattern = "{" + arrLength + "}"; //this matches
> > > all alpha-numeric characters in between the delimeters
> > >             var wholePattern = delPattern + numerOfPattern; // this
> > > combines them both
>
> > >             console.log(wholePattern);
>
> > >             var pattern = "^"
>
> > >             pattern += wholePattern;
> > >             pattern += "$";
>
> > >             console.log(pattern);
> > >             return new RegExp(pattern);
> > >         };
>
> > >         var regEx = generateRegEx(settings.delimeter, settings.source,
> > > settings.dir);
>
> > >         $(":input").filter(function() {
> > >         //return this.id.match(regEx);
> > >             return $(this).attr("id").match(regEx);
> > >         })
>
> > >     };
>
> > > })(jQuery);

Reply via email to