Jan 29, 2014
This blog has moved on
In an effort to be a better blogger I've moved on. http://jsatt.com
Making GEEK sexy again!
In an effort to be a better blogger I've moved on. http://jsatt.com
Posted by Unknown around 4:53 PM 0 comments
One Last Update: It's been a good while since I gave a good update on this project's state, so here's the deal. I started this project to fulfill a need I had at the time and opensourced it so someone might have a something to start with to fulfill a similar need. Turns out Mottie had a similar need and found this a good starting point. He has now built an on-screen keyboard widget much better than anything I had intended to develop. This post is staying here for reference, but I highly recommend going over to Github and get the latest version of Mottie's branch instead.
A while back I came to a project which I was developing for a small touchscreen device with a limited Linux install which may or may not have a physical keyboard attached. While our overall plan for the project was to not have any forms to fill out and thus no requirement for a keyboard, we saw a potential need down the road and rather than wait until we must have it I set out to see what kind of touchscreen keyboard jQuery could make possible.
Now, as a touchscreen with no keyboard is a very limited need in the jQuery world there were very few examples out there and none that took full advantage of many of the things build into jQuery UI. So, I new pretty early that I'd be building something from scratch. I wanted it to not just be a function you call that happened to use jQuery, but rather built as a true widget much like the datepicker built into jQuery UI. I also wanted it to be very customizable: resize with the reset of the page, have multiple keyboard layouts, even allow users to define their own keyboard layout. After a little planning and a couple days of coding here and there I came up with this:
Samples removed due to jQuery plugins site being erased
With a simple jQuery call and a few additional lines of css you can have any keyboard layout you could possibly need.
$('input[type=text], input[type=password], textarea') .keyboard({ layout:"qwerty", customLayout: [["q w e r t y {bksp}","Q W E R T Y {bksp}"], ["s a m p l e {shift}","S A M P L E {shift}"], ["{accept} {space} {cancel}","{accept} {space} {cancel}"]] });
It has been tested on most browsers supported by jQuery UI and works. At this time the keyboard will center itself top-to-bottom on the left side of the screen, this is a feature I plan to change so that the keyboard appears from the field you are actually editing. I have they entire source available for download at both jQuery Plugins and Snipplr. Feel free to give any feedback you may have.
Creative Commons Attribution-Share Alike 3.0 Unported License
Update: It seems something in Blogger's style are forcing the keyboard to only appear at the top of the page. I'm working on it quickly, until then you are able to scroll to the top when it appears and use it.
Update: Fixed!
Update: After a little more tweeking, the positioning of the keyboard works much better across the board. All sources have been updated.
Today, we came across a need for a set of cascading select boxes to filter through a list of Organizations, Territories and Location. When I've come across this need in the past I tended to use ajax calls to load a new list into the select box based on the selection. While the ajax option is good for very large sets of data to keep the initial load time of the page down, it creates a few minor issues for smaller data sets.
For our smaller data set we felt it would be more beneficial to start by loading all available options during page load and use jQuery to quickly filter and show only the options we need from the options already loaded into the browser. I came up with this function to do just this.
function cascadeSelect(parent, child){ var childOptions = child.find('option:not(.static)'); child.data('options',childOptions); parent.change(function(){ childOptions.remove(); child .append(child.data('options').filter('.sub_' + this.value)) .change(); }) childOptions.not('.static, .sub_' + parent.val()).remove(); }
I was shocked at the ridiculously small amount of code needed to provide this functionality. After pre-building may page with a form containing the select boxes and added a class to each option in the child select to define which option from the parent it was associated with ("sub_1" where parents value is "1"), simply call the function with the parent and child defined as jquery objects:
And voila:cascadeForm = $('.cascadeTest'); orgSelect = cascadeForm.find('.orgSelect'); terrSelect = cascadeForm.find('.terrSelect'); locSelect = cascadeForm.find('.locSelect'); cascadeSelect(orgSelect, terrSelect); cascadeSelect(terrSelect, locSelect);
I've posted a full sample html at Snipplr. Feel free to comment and give suggestions there. As with all my code it's licensed as Creative Commons Attribution-Share Alike 3.0 Unported License. Feel free to consume and improve accordingly.
Update: ::face-palm:: In my joy of completing a task that seemed to good to be true, I posted this before realizing it was to good to be true. At this time I've only had a chance to test this code in Firefox. After an attempt to show it off, it appears to not work properly in WebKit browsers and maybe others. I will run it through the full gauntlet soon and do by best to ensure cross-browser compatibility for all browsers officially support by jQuery.
Update 2: After a little work and a better understanding of what doesn't work to "hide" options in browsers other than Firefox, I now have code that does just as I explained above but works cross-browser. I have updated the code above as well as the full example on Snipplr. Again, please feel free to give any feedback you might have.
Confirmed Working:
After much difficult searching to no avail, I finally have completed a jQuery based process to create a scrollable table with fixed headers. The following code requires the header rows to be within a "thead" tag, the table body in a "tbody" tag and the entire table in a tag with the "overflow" style set to "auto" or "scroll".
This script creates a new table cloning the "thead" section and attaching it to the absolute top of the containing element so that it does not move when the containing element is scrolled.
As always I release this script under Creative Commons license, and is compatible with all browsers which are compatible with jquery except for Firefox 2.0 (a few minor alignment issues i plan to fix when i have time).
EDIT: Code Move to Snipplr
Tested and working with:
Tested and having issues with:
It was brought to my attention that I forgot to include an example. So here's a quick and dirty one. I've tried to mark it clearly in the source so it will be easy to grab.
I will try to type up some better documentation on this and clean up the code a bit, but in the mean time please let me know of any issues you may run into so that I can fix them soon.
Column 1 | Column 2 | Column 3 | Column 4 |
---|---|---|---|
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
data 1 | data 2 | data 3 | data 4 |
Posted by Unknown around 11:41 AM 6 comments
Tags: design , fixed header , header , jquery , scroll , scrolling , stationary , table