Thanks it works(returns the wrapped set and allows chaining) when I
return the selector straight away from within the plugin but when I
try and return a filtered set

$.recurse({source:"a_1"}).setDisabled(true)

it will not allow chaining and I get

TypeError: $.recurse({source: "a_1"}) is undefined

(function($) {

    $.recurse = $.fn.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) {

            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;

            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);

        // return $(":input[id^=" + settings.source + "]") // this
works ok

        $(":input[id^=" + settings.source + "]").filter(function()
{ //  this is not working
            return $(this).attr("id").match(regEx);
        });

    };

})(jQuery);

Thanks

On May 6, 9:10 pm, Eric Garside <gars...@gmail.com> wrote:
> 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