NAME
HTML::JQuery - Generate jQuery/Javascript code in Perl
DESCRIPTION
This module is used to generate jQuery/Javascript code in Perl. What you do with it is up to you. I designed it for a work project where I needed to display certain Perl variables to the page using Javascript, so, instead of ajax calls I designed HTML::JQuery
, which obviously took longer. Go figure. You can quite easily use it in a Perl Web Framework of your choice and display the Javascript it generates into a template, meaning you don't have to code any Javascript (Unless you need something extra).
SYNOPSIS
An example from a Catalyst point of view.
## Inside the Controller
my $j = jquery sub {
function 'testfunc' => sub {
my $name = shift;
alert "Test func called: $name";
};
function 'init' => sub {
my $name = shift;
alert "Document Loaded. Inside $name";
};
onclick '#heading' => sub { fadeout shift; };
dialog '#test' => (
title => 'Click Box!',
body => 'Thanks for clicking :-)',
modal => 1,
autoOpen => 0,
buttons => {
"OK" => function(sub {
dialog '#test', 'close';
alert 'closed!';
}),
"Nah" => function(sub {
alert "Fine. I won't close";
}),
q{'Test Func'} => function(sub {
func 'testfunc';
}),
},
);
onclick '.button' => sub {
dialog '#test', 'open';
};
onclick '.slidey' => sub {
fadein ('#slide_text', 1000,
function(sub {
fadeout '#slide_text', 1000;
})
);
};
keystrokes '*' => ( keys => [qw( alt+ctrl+a )], event => function(sub { alert 'ALT+CTRL+A pressed' }) );
};
$c->stash->{jquery} = $j;
## Inside the template (.tt)
[% jquery %]
jquery
All your HTML::JQuery must be wrapped between the jquery subroutine, like so
my $j = jquery sub {
...
};
Then you can pass the $j
variable to whatever output you need. For example, in Catalyst you might do:
my $j = jquery sub {
function 'init' => sub { alert 'Loaded!'; };
};
$c->stash->{jquery} = $j;
# then in the template
[% jquery %]
jquery_inline
This is emulates an anonymous Javascript function. Like, function() { ... }
Normally you would use these in callbacks.
onclick '#test' => sub {
my $this = shift;
hide $this, 2000, jquery_inline(sub { alert '#test is now hidden'; });
};
onclick
As the name states, this event will be triggered when a given element is clicked. The name of the element is passed in the first argument, if you need it.
onclick '.myclass' => sub {
my $this = shift;
alert "$this was called";
};
alert
A very basic Javascript alert box.
alert 'Huzzah!';
function
Creates a standard Javascript function. Currently arguments are not supported, but will be in the future. The first argument in the subroutine is the name of the function.
function 'boo' => sub {
my $name = shift;
alert "$name was called!";
};
Also, if we create a function called init
, then HTML::JQuery will run it once the document has loaded.
function 'init' => sub {
alert "The page has successfully loaded";
alert "We can now do stuff";
};
As of 0.005, calling function
with no name and just a code reference results in a Javascript callback (like jquery_inline, but with a more relevant name).
func
Simply calls a Javascript function.
function 'myfunc' => sub { alert "Help! I've been ran!"; };
onclick '#runIt' => sub { func 'myfunc'; };
fadeout
Hides the specified element with a "fade" effect. You can set the speed and even provide a callback for when the command has completed. The last two options are completely optional, though.
function 'fadeText' => sub {
fadeout '#text';
fadeout '#text2', 1000;
fadeout '#text3', 'slow';
fadeout '#text4', 2000, function(sub { alert '#text4 is now hidden' });
};
fadein
fadein is the exact same as fadeout
, except it makes an element "re-appear". I won't repeat myself with example code.
slidetoggle
Binds itself to an element so when you click said element it appears by sliding out, then, when clicked again will disappear by sliding in.
onclick '#paragraph' => sub {
slidetoggle '.text', 1000;
};
slidetoggle
also has a duration and callback feature, much the same as fadein
and fadeout
.
keystrokes
JQuery keybindings - a truly fun extension to JQuery. This requires a Javascript file that is included with this module. An example event to make an alert box appear after typing the word alert into your browser..
keystrokes '*' => ( keys => [qw( a l e r t )], event => function(sub { alert 'You typed a l e r t' }) );
Not only can it be triggered by keys pressed one after another, but you can make it work with multiple keys pressed at the same time.
keystrokes '*' => ( keys => [ 'alt+m' ], event => function(sub { alert 'Alt+M was pressed' }) );
It's also possible to mix multiple key presses with single ones if you wish.
dialog
Runs a jQuery dialog box. Let's take a look.
dialog '#test' => (
title => 'My dialog title',
autoOpen => 1, # run when the document has loaded?
modal => 1, # focuses on the window and blocks out everything else until its closed
body => '<p>This is the content within the dialog</p>',
buttons => {
OK => function(sub {
dialog '#test', 'close';
}),
Fade => function(sub {
fadeout 'p', 1000;
alert 'Text faded';
}),
},
);
rel
Just retrieves the rel
attribute from an element.
rel '.somelink';
hide
Similar to fadeout
, but without the actual "fade" effect. It simply hides an element, but doesn't permanently remove it. It will do a CSS equivalent to display:none
. Like most of these types of functions the second argument is the duration and the third is a callback. Both are optional.
hide '#test', 1000, function(sub{ alert 'Hidden #test' });
show
The same as hide
, only shows the element instead if it's hidden
dom_remove
Completely removes the given element from the DOM. This means it won't be able to be used again once it has been removed, unless you reload the page, of course.
onclick 'div' => sub {
hide 'this', 2000, function(sub {
dom_remove 'this'
});
};
datepicker
Binds a fancy calendar to a specific element (Usually an input field). If you pass <auto =
>> 1 in the hash then it will append dateFormat: 'dd/mm/yy', changeMonth: true, changeYear: true
to the datepicker options plus anything you specify.
datepicker '.datefield' => ( dateFormat => 'mm-dd-yy', currentText => 'Now' );
You can see a list of options on jQuery UI's website for datepicker.
appendhtml
Dynamically appends html to a div.
innerhtml '#mydiv', 'Hello, World!';
BUGS
Please e-mail brad@geeksware.net
AUTHOR
Brad Haywood <brad@geeksware.net>
COPYRIGHT & LICENSE
Copyright 2011 the above author(s).
This sofware is free software, and is licensed under the same terms as perl itself.