Sorry, just removed the previous post because of an error. It doesn't account for jQuery function calls like slideUp(). I'll repost once fixed and rename Function to JFunction.
On Feb 13, 11:13 am, mdipierro <[email protected]> wrote: > I like it. I would call Function JFunction instead. > > Massion > > On Feb 13, 11:01 am, "mr.freeze" <[email protected]> wrote: > > > What about this? '()' at the end of a JQuery statement terminates the > > line (;). Also added a simple Function wrapper class. Treats 'this' as > > a keyword. > > > Mind you, there is a good chance that these helpers are more difficult > > that just writing jQuery code :) > > > So this: > > print JQuery('#test').click(Function(JQuery("this").hide("slow") > > (),'event'))() > > print JQuery("p").bind("click",Function(JQuery("span").text("Click > > happened!")(),'e'))() > > > Returns this: > > $('#test').click(function(event){$(this).hide("slow");}); > > $('p').bind("click", function(e){$('span').text("Click happened!");}); > > > class JQuery: > > def __init__(self,name,attr=None,*args): > > self.name=name > > self.attr=attr > > self.args=args > > def __str__(self): > > import gluon.contrib.simplejson as json > > def encode(obj): > > if isinstance(obj,JQuery): return str(obj) > > if isinstance(obj,Function): return str(obj) > > return json.dumps(obj) > > if not self.attr: > > return ("$('%s')" % self.name).replace > > ("'this'","this") > > args=', '.join([encode(a) for a in self.args]) > > return '%s.%s(%s)' % (self.name, self.attr, args) > > def xml(self): > > raise AttributeError > > def __getattr__(self,attr): > > def f(*args): > > return JQuery(self,attr,*args) > > return f > > def __call__(self,*args): > > if not args: > > jq = str(JQuery(self)) > > jq = jq[3:] > > jq = jq[:-2] > > return jq + ";" > > > class Function: > > def __init__(self,body,*args): > > self.body = body > > self.args = args > > def __str__(self): > > args=', '.join([str(a) for a in self.args]) > > body=self.body > > return "function(" + args + "){" + body + "}" > > > On Feb 12, 11:18 am, mdipierro <[email protected]> wrote: > > > > This is not an easy one. > > > > On Feb 12, 10:50 am, "mr.freeze" <[email protected]> wrote: > > > > > Maybe a static methodJQuery.function(body, *args) that just wraps a > > > >JQueryobject with function(args){body}? There's probably a better > > > > way. > > > > You would also need to add logic to handle the 'this' keyword and line > > > > termination I think. > > > > > On Feb 12, 9:28 am, mdipierro <[email protected]> wrote: > > > > > > Not quite. This works: > > > > > > printJQuery("a").filter(".clickclass").click('xxx').end().filter > > > > > (".hideclass").click('yyy').end(); > > > > > > but here is no mechanism to pass a function yet.... > > > > > > Massimo > > > > > > On Feb 12, 9:14 am, "mr.freeze" <[email protected]> wrote: > > > > > > > OMG, you just portedJQueryto Python in about 20 lines of code. > > > > > > Speechless... > > > > > > > Would this work for more complicatedjQuerylike this?: > > > > > > $("a") > > > > > > .filter(".clickclass") > > > > > > .click(function(){ > > > > > > alert("web2py rocks!"); > > > > > > }) > > > > > > .end() > > > > > > .filter(".hideclass") > > > > > > .click(function(){ > > > > > > $(this).hide(); > > > > > > return false; > > > > > > }) > > > > > > .end(); > > > > > > > On Feb 12, 12:33 am, mdipierro <[email protected]> wrote: > > > > > > > > from gluon.html import * > > > > > > > > classJQuery: > > > > > > > def __init__(self,name,attr=None,*args): > > > > > > > self.name=name > > > > > > > self.attr=attr > > > > > > > self.args=args > > > > > > > def __str__(self): > > > > > > > import gluon.contrib.simplejson as json > > > > > > > def encode(obj): > > > > > > > if isinstance(obj,JQuery): return str(obj) > > > > > > > return json.dumps(obj) > > > > > > > if not self.attr: > > > > > > > return "$('%s')" % self.name > > > > > > > args=', '.join([encode(a) for a in self.args]) > > > > > > > return '%s.%s(%s)' % (self.name, self.attr, args) > > > > > > > def xml(self): > > > > > > > raise AttributeError > > > > > > > def __getattr__(self,attr): > > > > > > > def f(*args): > > > > > > > returnJQuery(self,attr,*args) > > > > > > > return f > > > > > > > > ### examples > > > > > > > > >>> printJQuery('test').set(1,'',{},JQuery('#12').val()).get(45) > > > > > > > > $('test').set(1, "", {}, $('#12').val()).get(45) > > > > > > > > >>> print > > > > > > > >>> DIV(H1('clickme',_onclick=JQuery('#1').slideToggle()),P('bla > > > > > > > >>> '*10,_id=1)) > > > > > > > > <div><h1 onclick="$('#1').slideToggle()">clickme</h1><p > > > > > > > id="1">bla bla > > > > > > > bla bla bla bla bla bla bla bla </p></div> > > > > > > > > On Feb 11, 11:56 pm, mdipierro <[email protected]> wrote: > > > > > > > > > Try something like this: > > > > > > > > > classJQuery: > > > > > > > > def __init__(self,name,attr=None,*args): > > > > > > > > self.name=name > > > > > > > > self.attr=attr > > > > > > > > self.args=args > > > > > > > > def __str__(self): > > > > > > > > if not self.attr: > > > > > > > > return "$('%s')" % self.name > > > > > > > > import gluon.contrib.simplejson as json > > > > > > > > args=', '.join([json.dumps(a) for a in self.args]) > > > > > > > > return "%s.%s(%s)" % (self.name, self.attr, args) > > > > > > > > def __getattr__(self,attr): > > > > > > > > def f(*args): > > > > > > > > returnJQuery(self,attr,*args) > > > > > > > > return f > > > > > > > > > printJQuery('test').set(1,"",{}).get(45) > > > > > > > > > On Feb 11, 11:37 pm, "mr.freeze" <[email protected]> wrote: > > > > > > > > > > All together now... (gluon/clientutils.py)... > > > > > > > > > > class PageManager(object): > > > > > > > > > def __init__(self, response): > > > > > > > > > self.response = response > > > > > > > > > self.response.scripts=[] > > > > > > > > > self.response.pagescripts=[] > > > > > > > > > self.response.stylesheets=[] > > > > > > > > > def addscript(self,script): > > > > > > > > > if not script in self.response.scripts: > > > > > > > > > self.response.scripts.append(script) > > > > > > > > > def addpagescript(self,pagescript): > > > > > > > > > if not pagescript in response.pagescripts: > > > > > > > > > response.pagescripts.append(pagescript) > > > > > > > > > def addstylesheet(self,stylesheet): > > > > > > > > > if not stylesheet in response.stylesheets: > > > > > > > > > response.stylesheets.append(stylesheet) > > > > > > > > > """ > > > > > > > > > The three methods below should not be used because > > > > > > > > > they require an instance variable in > > > > > > > > > the view making it non-generic. Here for testing. > > > > > > > > > """ > > > > > > > > > def includescripts > > > > > > > > > scripts = '' > > > > > > > > > for script in self.response.scripts: > > > > > > > > > scripts += script > > > > > > > > > return scripts > > > > > > > > > def includepagescripts > > > > > > > > > pagescripts = '' > > > > > > > > > for file in self.response.pagescripts: > > > > > > > > > pagescripts += SCRIPT(_src=file).xml() > > > > > > > > > return pagescripts > > > > > > > > > def includestylesheets > > > > > > > > > stylesheets = '' > > > > > > > > > for file in self.response.stylesheets: > > > > > > > > > stylesheets += LINK(_href=file, > > > > > > > > > _rel="stylesheet", > > > > > > > > > _type="text/css", > > > > > > > > > _charset="utf-8").xml() > > > > > > > > > return stylesheets > > > > > > > > > > Now if I could just mimicjQuery'ssweet chaining in Python... > > > > > > > > > > On Feb 11, 3:55 pm, "mr.freeze" <[email protected]> wrote: > > > > > > > > > > > Sure. I think it would look something like this (in gluon/ > > > > > > > > > > clienttools.py): > > > > > > > > > > > class PageManager(object): > > > > > > > > > > def __init__(self, response): > > > > > > > > > > if not response.scripts: response.scripts = [] > > > > > > > > > > def addscript(self,script): > > > > > > > > > > response.scripts.append(script) > > > > > > > > > > > Then in web2py_ajax.html as the last thing in the > > > > > > > > > > $(document).ready > > > > > > > > > > function: > > > > > > > > > > > {{if response.scripts:}} > > > > > > > > > > {{for s in response.scripts:}} > > > > > > > > > > {{=s}} > > > > > > > > > > {{pass}} > > > > > > > > > > {{pass}} > > > > > > > > > > > Then in your db.py model: > > > > > > > > > > > from gluon.clienttools import PageManager > > > > > > > > > > pagemanager=PageManager(response) > > > > > > > > > > > Then in your controller: > > > > > > > > > > > def index(): > > > > > > > > > > pagemanager.addscript("$('test').hide();") > > > > > > > > > > response.flash=T('Welcome to web2py') > > > > > > > > > > return dict(message=T('Hello World')) > > > > > > > > > > > Ideally, the clienttools module would be chocked full > > > > > > > > > > ofjquery > > > > > > > > > > helpers too :) > > > > > > > > > > > On Feb 11, 1:40 pm, mdipierro <[email protected]> > > > > > > > > > > wrote: > > > > > > > > > > > > Can you write the addscript function? > > > > > > > > > > > > On Feb 11, 1:31 pm, > > ... > > read more » --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" 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/web2py?hl=en -~----------~----~----~----~------~----~------~--~---

