WordPress style save confirmation
WordPress heeft bij het bewerken of aanmaken van een nieuwe blogpost een melding die je om bevestiging vraagt als je probeert de pagina te verlaten zonder iets op te slaan. Nooit echt bewust over nagedacht maar leek me een leuke toevoeging qua user experience in een nieuw project. Even een beetje nagedacht hoe ik dit in mijn Jquery wereld kon "opbergen" zonder dat het in de weg zou zitten en kwam met de volgende oplossing;
// Set the default state to false
jQuery.data(document.body, 'confirmationPrompt', false);
// On a keypress in any form field set confirmation to true
$('input,textarea').keypress(function() {
jQuery.data(document.body, 'confirmationPrompt', true);
});
// On change of a select or any other form element (like radio buttons etc)
// Set confirmation to true
$('input,select').change(function() {
jQuery.data(document.body, 'confirmationPrompt', true);
});
// On any form submit set confirmation to false
$('form').submit(function() {
jQuery.data(document.body, 'confirmationPrompt', false);
});
// Check if confirmation is needed before unloading
window.onbeforeunload = function(){
if(jQuery.data(document.body, 'confirmationPrompt')){
return 'Are you sure?';
}
};
Dit dekt op zich aardig de lading zo. De reden dat ik jquery.data() gebruik en niet gewoon een losse variabel is dat ik op deze manier ook vanuit andere functies de confirmationPrompt var op false kan zetten. Bijvoorbeeld als je sommige forms middels een AJAX call opslaat waardoor er geen formele form submit voorbij komt.
Jquery fadeIn loop (supersimpel)
Wilde net even twee blokken met tekst in elkaar laten overlopen. Leek me overkill hiervoor een cycle plugin te gebruiken dus ging even kijken wat voor leuks ik nog niet had toegepast/ontdekt in Jquery. Nu blijkt dat je met delay() functie in combi met fadeIn/out erg leuke dingen kunt doen.
HTML:
<div id="blockHolder">
<div id="block1">Tekst 1</div>
<div id="block2">Tekst 2</div>
</div>
CSS:
#blockHolder {
width: 100px;
height: 200px;
border: 1px solid red;
position: relative;
}
#block1,
#block2 {
background-color: white;
position: absolute;
left: 0;
top: 0;
}
Jquery code:
function fadeLoop(){
$('#block1').fadeIn().delay(3000).fadeOut('slow', fadeLoop).delay(3000);
}
$(document).ready(function() {
fadeLoop();
});
Op zich redelijk basic maar werkt wel leuk zo. Wat de fadeLoop() nu doet is eigenlijk #block1 transparant maken, 3 seconde wachten, weer zichtbaar maken, 3 seconde wachten en weer zichzelf aanroepen voor een herhaling. Dit werkt prima met blokken die over elkaar gepositioneerd staan via CSS en waarbij de voorste transparant/niet-transparant wordt waardoor de achterste zichtbaar wordt.
BMI calculator met Jquery
Voor een project wat nog in ontwikkeling is moest ik een BMI calculator maken. Ik had er ooit wel eens één gemaakt maar die werkte via een POST en 'berekende' alles met PHP. Het leek me leuk dit keer Jquery te gebruiken.
De oude BMI calculator
Zoals je ziet op zich prima maar een beetje statisch. Tevens niet echt superduidelijk. Er zit een 1 px wit lijntje wat je huidige BMI aanduidt maar je moet wel goed opletten om die te zien.
De nieuwe BMI calculator
Zoals je ziet wel wat overeenkomsten (zelfde opdrachtgever dus moest zelfs alles een beetje gelijk houden) maar toch net even wat frisser. Een duidelijkere pointer voor je BMI en in plaats van invulvelden en een submitbutton gewoon twee Jquery UI sliders.
De code
Wat heb je in iedere geval nodig?
- Jquery
- Jquery UI
- Een BMI afbeelding voor de achtergrond
- Eventueel een leuke afbeelding voor de pointer
Voor het gemak kun je het hele gebruikte pakketje voor deze implementatie hier downloaden.
De te includen bestanden in de header
- reset.css
- screen.css
- jquery-ui-1.8.16.custom.css
- jquery.1.6.1.min.js
- jquery-ui-1.8.16.custom.min.js
- bmi.js
De HTML
Dit is de kale HTML voor de slider met tabel etc.
<div id="lengthSlider"></div>
<label for="length">Uw lengte is <input type="text" id="length" /> centimeter</label>
<div id="weightSlider"></div>
<label for="weight">Uw gewicht is <input type="text" id="weight" /> kilogram</label>
<div id="bmiScale">
Uw Body Mass Index is
<div id="bmiScalePointer"></div>
</div>
<div id="bmiInformation">
<h4>Wat is een gezonde BMI?</h4>
<table border="0" cellpadding="0" cellspacing="0" width="500">
<tbody>
<tr>
<td width="10"><img src="</assets/images/bmi-yellow.gif" alt="ondergewicht" height="10" width="10"></td>
<td width="130">Tussen 16 - 20</td>
<td width="240">Uw BMI is iets te laag</td>
</tr>
<tr>
<td><img src="/assets/images/bmi-green.gif" alt="gezond gewicht" height="10" width="10"></td>
<td>Tussen 20 - 25</td>
<td>gezond gewicht</td>
</tr>
<tr>
<td><img src="/assets/images/bmi-yellow.gif'" alt="normaal - licht overgewicht" height="10" width="10"></td>
<td>Tussen 25 – 27</td>
<td>normaal - licht overgewicht</td>
</tr>
<tr>
<td><img src="/assets/images/bmi-orange.gif" alt="normaal - overgewicht" height="10" width="10"></td>
<td>Tussen 27 -29</td>
<td>normaal - overgewicht</td>
</tr>
<tr>
<td><img src="/assets/images/bmi-red-orange.gif'" alt="overgewicht" height="10" width="10"></td>
<td>Boven de 30</td>
<td>overgewicht</td>
</tr>
<tr>
<td><img src="/assets/images/bmi-red.gif" alt="ernstig overgewicht" height="10" width="10"></td>
<td>Boven de 40</td>
<td>ernstig overgewicht</td>
</tr>
</tbody>
</table>
</div>
De Jquery code
De volgende code berekend de BMI, verplaatst de pointer etc.
Zie ook de opmerkingen ertussen.
// Function to calculate the BMI using lenght in centimeters and weight in kilograms
function calculateBMI(lenght, weight)
{
// Calculate the BMI and round at 1 decimal
var result = Math.round(weight / (lenght/100 * lenght/100)*10)/10;
// Determine the left position of the bmiScalePointer (and subtract 50% of it's width)
var leftPos = (result*10)-22;
// If the leftpos is > 450 it would run out of the scale so stop it here
if(leftPos > 450) {
leftPos = 450;
result = Math.round(result);
}
// Update the bmiScalePointer value
$('#bmiScalePointer').html("BMI<br/><br/>" + result);
// Move the bmiScalePointer to it's new position
$('#bmiScalePointer').css('left', leftPos);
}
$(document).ready(function() {
// Just plain Jquery UI slider functionalitiy
$("#lengthSlider").slider({
value: 175,
min: 130,
max: 220,
step: 1,
slide: function( event, ui ) {
// Initiate the calculation function on sliding
calculateBMI(ui.value, $('#weight').val());
$("#length").val(ui.value);
}
});
$("#length").val($("#lengthSlider").slider("value"));
$("#weightSlider").slider({
value: 75,
min: 24,
max: 250,
step: 1,
slide: function( event, ui ) {
// Initiate the calculation function on sliding
calculateBMI($('#length').val(), ui.value);
$("#weight").val(ui.value);
}
});
$("#weight").val($("#weightSlider").slider("value"));
// Do a initial calculation
calculateBMI($('#length').val(), $('#weight').val());
});
Nogmaals voor het gemakt: Het hele gebruikte pakketje voor deze implementatie kun je hier downloaden.
Jquery alle hyperlinks naar afbeeldingen koppelen aan Fancybox
Een tijdje terug heb ik voor een klant als service een microstukje javascript gemaakt met Jquery om alle hyperlinks in de content te hooken aan Fancybox (of welk ander script dan ook voor de weergave van foto's). Wat hij doet is alle a elementen in de dom (of een selectie daarvan) opzoeken, kijken of ze een href hebben en of die linkt naar een afbeelding en zo ja, Fancybox eraan hangen. Normaal doe je dit gewoon door een class of iets aan de afbeelding te hangen die je gebruikt als selector maar ik wilde dat alle via het CMS ingevoerde links naar afbeeldingen ook meegepakt werden. Om de klant niet te hoeven uitleggen wat hij moest doen om afbeeldingen te linken kwam ik hierop uit.
$(document).ready(function() {
$("a").filter(function(){
if($(this).attr('href').match(/\.(jpe?g|png|gif)/i)) {
$(this).fancybox();
}
});
});
ps. Als je sommige afbeeldingen eruit wilt houden kun je altijd nog iets toevoegen als een not()conditie (waarbij je in dit geval dus aan de hyperlink de class .noFancy meegeeft:
$(document).ready(function() {
$("a:not(.noFancy)").filter(function(){
if($(this).attr('href').match(/\.(jpe?g|png|gif)/i)) {
$(this).fancybox();
}
});
});
Jquery tagedit plugin
De jQuery Plugin tagedit die gemaakt is door Oliver Albrecht biedt een gemakkelijke manier om tags toe te voegen, bewerken en verwijderen mbv. lijsten van zoekwoorden.
Trefwoorden kunnen worden getoond aan de gebruiker dmv een autocomplete lijst.
Bekijk de screencast op youtube of download de code op GitHub.
Een demo en alle informatie is terug te vinden op tagedit.webwork-albrecht.de/
PHP & AJAX met Jquery tutorial
Recent hadden voor een project een creatieve oplossing gemaakt om bepaalde velden in het CMS standaard te "locken" en alleen mensen met een bepaalde user-role mochten de velden unlocken en bewerken. Denk hierbij aan velden als permanames. Omdat dit meer een stukje bescherming van gebruikers dan een echte security kwestie was (in dit geval) leek het ons wel leuk dit met een eenvoudige AJAX call te doen. Met Jquery zijn dit soort opties binnen het handbereik van iedere developer gekomen.
Erover nadenkend hoe lastig dit vroeger was en hoe leuk het nu was realiseerde ik me dat het misschien voor sommige mensen nog niet zo voor de hand liggend was. Daarom deze "super recht toe recht aan" tutorial / voorbeeldcode hoe je een simpele AJAX call naar een PHP script doet vanuit je HTML en het resultaat teruggooit naar de HTML.
De HTML code
Jquery AJAX call example
Klik op een woord hieronder om het resultaat van dat woord op te halen via AJAX en terug te geven als result.
- Appels
- Peren
- Bananen
- Kersen
- Pinguins
De PHP code
$fruits = array('Appels', 'Peren', 'Bananen', 'Kersen');
if(in_array($_POST['ajaxableVar'], $fruits)){
echo 'Eet veel ' . $_POST['ajaxableVar'] . ' dat is gezond!';
return;
}
echo $_POST['ajaxableVar'] . ' kun je niet eten!';
return;
Ditzelfde principe kun je ook neerzetten met JSON zodat je bijvoorbeeld een boolean terug kunt geven aan je Jquery code om bepaalde acties wel / niet uit te voeren. Eigenlijk zijn de mogelijkheden redelijk ruim.
* Let op! Het voorbeeld is ZEER basic en vereist wel enige configuratie en mutaties om hem veilig te maken voor je website maar als voorbeeld van het principe dekt het de lading prima.
Jquery masonry
Ik kwam een grappige Jquery plugin tegen die werkt als een soort CSS floats maar dan leuker. Waar je met floats alleen horizontaal de stukjes in elkaar kunt schuiven doet Masonry dat ook verticaal zodat je heerlijk in elkaar geschoven blok van elementen krijgt.
Het effect
Ga naar de website van deze plugin




