Your name:
Hello !
<p>Your name: <input type="text" name="name"</p> <p>Hello <span id="name-out"></span>!</p> <script type="text/javascript"> watch.add('name', function(value) { $('#name-out').text(value); }); </script>
How many wheels does a bicycle have? (in words)
Correct! Try again :(
<p>How many wheels does a bicycle have? <input type="text" name="wheels"> (in words)</p> <p> <span class="if" data-if="wheels=two">Correct!</span> <span class="if" data-if="wheels!=two">Try again :(</span> </p>
Choose a make:
Your car will be .
Warning: Red paint will cost an extra $150.00
<p>Choose a make: <select name="make"><option value="vw">Volkswagen</option><option value="toyota">Toyota</option></select></p> <fieldset class="if" data-if="make=vw"><legend>Volkswagen Options</legend> Color: <select name="color"><option value="black">Black</option><option value="silver">Silver</option>;<option value="red">Red</option></select> </fieldset> <fieldset class="if" data-if="make=toyota"><legend>Toyota Options</legend> Color: <select name="color"><option value="white">White</option><option value="red">Red</option></select> </fieldset> <p>Your car will be <span id="color-out"></span>.</p> <p style="color:#f00;" class="if" data-if="color=red"><strong>Warning</strong>: Red paint will cost an extra $150.00</p> <script type="text/javascript"> watch.add('color', function(value) { $('#color-out').text(value); }); </script>
var watch = { check_input: function() { if (!$(this).is(':enabled')) return; watch.set($(this).attr('name'), $(this).val(), this); }, values: {}, triggers: {}, add: function(name, fn) { if ($.type(name) == 'array') { return $.each(name, function() { watch.add(this, fn); }); } if (this.triggers[name] == undefined) { this.triggers[name] = []; $(':input[name='+name+']').change(watch.check_input).keyup(watch.check_input).each(watch.check_input); } this.triggers[name].push(fn); if (this.values[name]) { fn.call(this.values[name][1], this.values[name][0]); } return watch; }, get: function(name) { return this.values[name] && this.values[name][0]; }, set: function(name, value, el) { this.values[name] = [value, el]; for (k in this.triggers[name]) { this.triggers[name][k].call(el, value); } return watch; } };
$(function() { $('.if').each(function() { var div = $(this); // div var full = div.data('if'); var parts = []; $.each(full.split(/ or /i), function(i, condition) { condition = condition.split('='); // condition var not = condition[0][condition[0].length-1] == '!'; if (not) condition[0] = condition[0].substring(0,condition[0].length-1); var test = function(val) { var v = (val == condition[1]); parts[i]['test'] = not ? !v : v; v = false; for (var k = 0; k < parts.length; k++) { v = v || parts[k]['test']; } toggle($(div), v); } parts.push({'test': false, 'watch': condition[0], 'fn': test}); }); for (var i = 0; i < parts.length; i++) watch.add(parts[i]['watch'], parts[i]['fn']); div.data('check', function() { for (var i = 0; i < parts.length; i++) { parts[i]['fn'](watch.get(parts[i]['watch'])); } }); }); function toggle($el, show) { if (show===undefined) show = true; $el.toggleClass('disabled', !show); if (!$el.hasClass('control') || $el.hasClass('if-hide')) { $el.css('display', show ? ($el.is('span') ? 'inline' : 'block') :'none'); } if (show && $el.parents('.disabled').length) { $el.find(':input').attr('disabled','disabled'); }else{ $el.find(':input').attr('disabled',show ? false :'disabled'); $el.find('.disabled :input').attr('disabled','disabled'); // recursively run check if showing el if (show) { $el.find(':input').trigger('change'); $el.find('.if').each(function() { $el.data('check') && $el.data('check')(); }); } } } });