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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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);