jQuery plugin ... Ariel, just try if you like, forget if you don't.
I am sure it is possible to optimize the procedure, rught now I am focused
on its functionality.
(function($){ // Andrea Giammarchi Ultra Chain Suggestion
var slice = Array.prototype.slice;
$.fn.extend({
If:function(fn){
var _filter = this.filter(fn);
_filter._filter = this.filter(function(){return !~_filter.index(this)});
_filter._parent = this;
_filter._removed = _filter;
return _filter;
},
ElseIf:function(fn){
var filter = function(){return !~_filter.index(this)},
_filter = this,
self = this._parent.filter(filter);
_filter = self.filter(fn);
_filter._filter = self.filter(filter);
_filter._parent = this._parent;
_filter._removed = $(slice.call(this._removed,
0).concat(slice.call(_filter, 0)));
return _filter;
},
Else:function(){
var _filter = this._removed;
return this._parent.filter(function(){return !~_filter.index(this)});
},
Do:function(fn){
this.each(fn);
return this;
}
})})(jQuery);
// Example
$(function(){
$("div")
.If(function(){return $(this).text() == "3" || $(this).text() ==
"5"})
.text("match the 3 or 5 check")
.ElseIf(function(){return $(this).text() & 1})
.text("odd numbers")
.ElseIf(function(){return $(this).text() == 2})
.Do(function(){
$(this).text("text is equal 2");
})
.ElseIf(function(){return $(this).text() == 6})
.text("match the 6 condition")
.Else()
.text("this is 4 or 8");
;
})
Best Regards,
Andrea
On Mon, Oct 27, 2008 at 11:09 AM, Andrea Giammarchi <
[EMAIL PROTECTED]> wrote:
> Ok, test completed, this is the idea as working example:
>
> [snip]
> Array.prototype.If = function(callback){
> var _filter = this.filter(callback);
> _filter._filter = this.filter(function(value){return
> !~_filter.indexOf(value)});
> _filter._parent = this;
> _filter._removed = _filter;
> return _filter;
> };
> Array.prototype.ElseIf = function(callback){
> var _filter = this,
> self = this._parent.filter(function(value){return
> !~_filter.indexOf(value)});
> _filter = self.filter(callback);
> _filter._filter = self.filter(function(value){return
> !~_filter.indexOf(value)});
> _filter._parent = this._parent;
> _filter._removed = this._removed.concat(_filter);
> return _filter;
> };
> Array.prototype.Else = function(callback){
> var _filter = this._removed;
> return this._parent.filter(function(value){return
> !~_filter.indexOf(value)});
> };
> Array.prototype.Do = function(){
> alert("Value: " + this);
> return this;
> };
>
> ([1,2,3,4,5,6,7,8])
> .If(function(v){return v === 3 || v === 5})
> .Do() // 3, 5
> .ElseIf(function(v){return v & 1})
> .Do() // 1, 7
> .ElseIf(function(v){return v === 2})
> .Do() // 2
> .ElseIf(function(v){return v === 6})
> .Do() // 6
> .Else()
> .Do() // 4, 8
> ;
>
> That's it, a "chain nightmare" but at the end an expected result in ultra
> chain. Dunno about performances, it is more an experiment than something
> else, at least it works, so get as is :-)
>
> Kind Regards
>
>
> On Mon, Oct 27, 2008 at 10:32 AM, Andrea Giammarchi <
> [EMAIL PROTECTED]> wrote:
>
>> Sorry Ariel, there is a logical chain error in my example, I'll prepare a
>> better one with a couple of Array prototypes and you'll deciede if it is
>> interesting or not, is it fine?
>>
>> Regards
>>
>>
>> On Mon, Oct 27, 2008 at 9:21 AM, Andrea Giammarchi <
>> [EMAIL PROTECTED]> wrote:
>>
>>> Ariel, thanks for the link, i quickly read it and it seems other people
>>> thought about that idea before.
>>> Anyway, my vision is more semantic and less complicated, since with a
>>> callback inside the if you can define many expressions, do operations, and
>>> then return true or false.
>>>
>>> What I mean is that your if().hasClass is limited to one or more jQuery
>>> operation, while if(callbackInScope) has no limits at all and inside you can
>>> return $(this).hasClass("whatever").
>>>
>>> In any case and for performances improvement, for the if else I would
>>> create a jQuery istance instead of callback
>>>
>>> this.if = jQuery(this);
>>> this.if._condition = 1; // as first condition to evaluate (make
>>> if(this._condition) check simpler)
>>>
>>> so te call will be something like
>>> $(elm).on("click")
>>> .if
>>> .hasClass('foo')
>>> .then()..
>>>
>>> As I said before, this implementation suffer about And or Or
>>> possibilities
>>>
>>> $(elm).on("click")
>>> .if
>>> .hasClass('foo')
>>> .And
>>> .text()
>>> .then()..
>>>
>>> as last limitation, you cannot compare properties:
>>>
>>> if.text() == "something"
>>>
>>> for this reason I suppose that the callback inside the
>>> If(whateverCallback) that as implementation will be simply a filter inside
>>> the method if
>>> something like
>>>
>>> If:function(fn){ // set first list of elements
>>> this._succeded = jQuery(this).filter(fn);
>>> return this._succeded;
>>> },
>>> ElseIf:function(fn){ // exclude precedent elements
>>> var _succeded = this._succeded,
>>> result = jQuery(this).filter(fn).filter(function(i, elm){return
>>> ~_succeded.indexOf(elm)});
>>> this._succeded =
>>> this._succeded.concat(Array.prototype.slice.call(result, 0));
>>> return result;
>>> },
>>> Else:function(){ // return only last list of elements
>>> var _succeded = this._succeded;
>>> returh this.filter(function(i, elm){return ~_succeded.indexOf(elm)});
>>> }
>>>
>>> I did not test above code, it is only to demonstrate the ligic behind. It
>>> does not seem to be that complicated but for sure it is more intense for CPU
>>> and could be more problematic for mem leaks
>>>
>>> Regards
>>>
>>>
>>> On Sun, Oct 26, 2008 at 11:42 PM, Ariel Flesler <[EMAIL PROTECTED]>wrote:
>>>
>>>> Andrea
>>>>
>>>> The if/else thing seems to make the code larger I think. If you need to
>>>> pass a lambda to If, then another to else of elseIf...
>>>>
>>>> It's an interesting idea and it came up before. I'm not so sure it's
>>>> brings clarity to code, though.
>>>>
>>>> Maybe .if().hasClass('foo').then()... but uhmm... seems to complicated.
>>>>
>>>> Here you have the old post I mentioned, maybe it gives you some cool
>>>> idea :)
>>>>
>>>> http://groups.google.com/group/jquery-en/browse_thread/thread/43a69fa41f6e7089/6cebfee318992fe6
>>>>
>>>> Brandon disagreed back then as well... that's a good thing I think :D
>>>>
>>>>
>>>
>>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"jQuery Development" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/jquery-dev?hl=en
-~----------~----~----~----~------~----~------~--~---