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