WEBDOOD.COM

Tag: Javascript

Canvas Progress Spinner

by webdood on Mar.01, 2011, under Some Examples

This dynamically-generated HTML5 Canvas Spinner will resize to it’s container. It is very clean, scales to any size and works against any background color. If you are one to use the typical “spinner” gif89a image, you will know that it does not work against colored backgrounds due to dithering issues around the edges of the blades within the image and there are only so many sizes available to “borrow” from the internet.

This HTML5 <CANVAS> tag-based spinner is scalable and works against ny background color:

Leave a Comment :, , , , more...

Javascript Array.remove and Array.indexOf methods

by webdood on Jan.01, 2011, under Javascript, Software Development

I kept finding myself needing to remove items from an array, so developed a quick helper (prototype) method attached to the Array Object to help.
////////////////////////////////////////////////////////////////////////////////
//
// Array.remove( object|string item) - removes an item from an array
//    Example x = ["abc","xyz",1,4]  x.remove("xyz") returns ["abc",1,4]
//    Presumably this will eventually be added to Javascript, but until that day...
////////////////////////////////////////////////////////////////////////////////
if (Array.prototype.remove===undefined) {
  Array.prototype.remove = function( item ) {
    var itemLocation = this.indexOf(item);
    if (itemLocation > -1) {
      this.splice(itemLocation,1);
    }
  }
}
////////////////////////////////////////////////////////////////////////////////
//
// Array.indexOf() - returns integer index where valueToSearchFor is in an Array
//   (believe it or not, not all browsers have this yet ... and it's 2010!
////////////////////////////////////////////////////////////////////////////////
if (Array.prototype.indexOf===undefined) {
  Array.prototype.indexOf = function( valueToSearchFor ) {
    var iEnd = this.length;
    var retVal = -1;
    for (var i=0;i<iEnd; i++) {
      if (this[i] == valueToSearchFor) {
        retVal = i;
        break;
      }
    }
    return retVal;
  };
}

Shannon Norrell

Leave a Comment :, , more...

Javascript Array Detection

by webdood on Oct.06, 2010, under Javascript, Software Development

Turns out the most reliable way to detect an Array is not to use the old standby:

return (typeof foo === ‘object’ && foo.constructor === Array)

but rather to do this:

function isArray(anArray) {
  return Object.prototype.toString.apply(anArray) === "[object Array]";
}

I have to give credit to my friend Doug Crockford, for this.

I recommend his book Javascript: The Good Parts

shannon norrell

Leave a Comment :, , more...

Javascript: Flatten an array containing arrays

by webdood on Sep.08, 2010, under Javascript, Software Development

This quick function takes a an array, whose elements may or may not be other arrays, and flattens it into a single array.

Extremely simple solution, but kind of fun because it’s a chance to use recursion:

<script type=text/javascript>
var a = [1,2,[5,6,7], 8, [9,10,[11,12],13], 14];

function flatten( oArray ) {
  var retVal = [];
  for (var i=0;i<oArray.length;i++) {
    if (!isArray( oArray[i]) ) {
      retVal.push( oArray[i] );
    } else {
      var tempFlatt = flatten(oArray[i]);
      for (var j=0;<tempFlatt.length;j++) {
        retVal.push( tempFlatt[j] );
      }
    }
  }
  return retVal;
}

function isArray( anElement ) {
  return (typeof anElement=="object" && anElement.constructor == Array);
}

alert(flatten(a));
</script>
2 Comments :, , more...

Detect Safari 3

by webdood on Aug.26, 2010, under Javascript, Safari-Specific, Software Development

Today I needed a quick way to detect Safari3 for some specific markup tricks, so I wrote this function.
Thought it might be helpful to someone else.

<script type="text/javascript">
  var isSafari3 = (function() {
    var retval = false;
    if (navigator.vendor && navigator.vendor.indexOf('Apple') > -1) {
      var index=navigator.appVersion.indexOf('Version');
      if (index > -1) {
        retval = (parseInt(navigator.appVersion.substring(index+8))==3);
      }
    }
  return retval;
  })();
alert(isSafari3);
</script>

Shannon Norrell

Leave a Comment :, , more...

HTML5 Showcase

by webdood on Jun.04, 2010, under CSS3, HTML5, Javascript, Software Development

The HTML5 demos we have been working on for Apple.com are now live!

http://www.apple.com/html5/

http://developer.apple.com/safaridemos/

Most of the demos use the DHTML slider we developed and all examples use our library.js code

HTML5 is here to stay!

Leave a Comment :, , , more...

Javascript HTML Tables EnsureMinimumNumberOfRows

by webdood on Apr.20, 2010, under HTML, Javascript, Software Development

Here I present a useful function called “EnsureMinimumNumberOfRows”.
This function operates on a table and effectively clones the last row in the table a given number of times to ensure that a minimum number of rows exist within the table. it does not clone the contents of the cells, but rather the nodes themselves and their classnames (by way of cloneNode(false).

///////////////////////////////////////////////////////////////////////////////
// EnsureMinimumNumberOfRows(element, params)
// ==========================================
// Ensures a table will have minimum number of visible rows.
// Supported params are:
//   numberOfRows - gives the minimum number of rows that will appear
//                          default minimumNumberOfRows is 10
//   rowHeight - height, in pixels for added rows. Default is 30px
//  *NOTE: Does not support empty tables
////////////////////////////////////////////////////////////////////////////////
function EnsureMinimumNumberOfRows(element, params) {
  var minimumNumberOfRows  = params.numberOfRows || 10,
       rowHeight            = params.rowHeight    || 30,
  // Get the first element as $(element).select returns an array
  // *Note this is a rare use of the Prototype Library on my part.
  oTable = $(element).select('div.resultList table')[0],
  numberOfRowsToInsert = minimumNumberOfRows - oTable.rows.length + 1;

  if (numberOfRowsToInsert > 0) {
    var clonedRow   = oTable.rows[ oTable.rows.length - 1 ]
    clonedCells = clonedRow.getElementsByTagName('td');
    for (var i=0;i<numberOfRowsToInsert;i++) {
      var oRow = document.createElement("TR");
      for (j=0;j<clonedCells.length;j++) {
        var oCell = clonedCells[j].cloneNode(false);
        oCell.style.height = rowHeight + "px";
        oCell.appendChild( document.createTextNode("\u00a0") );
        oRow.appendChild(oCell);
      }
      oTable.appendChild( oRow );
    }
  }
}

Shannon Norrell

Now posted on GitHub

Leave a Comment :, , , more...

Javascript addClassName, hasClassName and removeClassName

by webdood on Apr.07, 2010, under Javascript, Software Development

Useful CSS Class handling functions.

Here I present addClassName, hasClass and removeClassName and also my old implementation of Array.indexOf. Since this is built into JS these days, you probably won’t need it.

addClassName and removeClassName are useful functions because you can pass in space separated classNames and it will add/remove them all.

////////////////////////////////////////////////////////////////////////////////
//
// addClassName([object|string] oHTMLElement, string classNameToAdd)
// ===========
//  Adds classNameToAdd to an HTMLElement
//  Guaranteed not to add the same className twice.
//  - classNameToAdd can be a space separated list of classNames.
//  - You can pass in the id to an object or the actual object
//
////////////////////////////////////////////////////////////////////////////////
function addClassName(oHTMLElement, classNameToAdd) {
  if (typeof(oHTMLElement)=="string")  {
    oHTMLElement = document.getElementById(oHTMLElement);
  }
  if (oHTMLElement) {
    var theClassName = oHTMLElement.className;
    // If oHTMLElement already has a class name, some more work is needed
    if (theClassName && (theClassName.length > 0)) {
      var classNamesToAdd = classNameToAdd.split(" ");
      // If we only have one className to potentially add, take the "less work" approach
      if (classNamesToAdd.length===1 && ((" " + theClassName + " ").lastIndexOf(" " + classNameToAdd + " ") === -1) ) {
        oHTMLElement.className = oHTMLElement.className + " " + classNameToAdd;
      } else {
        var theClassNames = theClassName.split(" "),
              iEnd = classNamesToAdd.length,
              aClassName,
              theClassNamesToAddArray = [];
        for (var i=0;i<iEnd;i++) {
           aClassName = classNamesToAdd[i];
           if (theClassNames.indexOf(aClassName)===-1) {
             theClassNamesToAddArray.push( aClassName );
           }
        }
        oHTMLElement.className = oHTMLElement.className + " " +((theClassNamesToAddArray.length > 1) ? theClassNamesToAddArray.join(" ") : theClassNamesToAddArray[0]);
      }
    } else {
      // If oHTMLElement did not already have a class name, just add it
      oHTMLElement.className = classNameToAdd;
    }
  }
}

////////////////////////////////////////////////////////////////////////////////
//
// hasClassName([object|string] oHTMLElement, string classNameOfInterest)
//           Returns a boolean value of if an HTMLElement has the className of interest
//           You can pass in the id to an object or the actual object
//
////////////////////////////////////////////////////////////////////////////////
function hasClassName(oHTMLElement, classNameOfInterest) {
  return ((" " + oHTMLElement.className + " ").lastIndexOf(" " + classNameOfInterest + " ") > -1);
}
////////////////////////////////////////////////////////////////////////////////
//
// removeClassName([object|string] oHTMLElement, string classNameToRemove)
//           Removes classNameToRemove from an HTMLElement, if it exists.
//        - classNameToRemove can be a space separated list of classNames.
//        - You can pass in the id to oHTMLElement or the actual object
//
////////////////////////////////////////////////////////////////////////////////
function removeClassName(oHTMLElement, classNameToRemove) {
  if (typeof(oHTMLElement)=="string")  {
    oHTMLElement = document.getElementById(oHTMLElement);
  }
  if (oHTMLElement) {
    var theClassName = oHTMLElement.className;
    if (theClassName && (theClassName.length > 0)) {
      var theClassNameArray = theClassName.split(" "),
           classNamesToRemove = classNameToRemove.split(" "),
           iEnd = theClassNameArray.length,
           aClassName,
           theNewClassNameArray = [];
      for (var i=0;i<iEnd;i++) {
        aClassName = theClassNameArray[i];
        if (classNamesToRemove.indexOf(aClassName)===-1) {
          theNewClassNameArray.push( aClassName );
        }
      }
      switch (true) {
        case (theNewClassNameArray.length>1) :
          oHTMLElement.className = theNewClassNameArray.join(" ");
          break;
        case (theNewClassNameArray.length==1) :
          oHTMLElement.className = theNewClassNameArray[0];
          break;
        case (theNewClassNameArray.length==0) :
          oHTMLElement.className = "";
          break;
      }
    }
  }
}
////////////////////////////////////////////////////////////////////////////////
//
// Array.indexOf() - returns integer index where valueToSearchFor is in an Array
//
////////////////////////////////////////////////////////////////////////////////
if (Array.prototype.indexOf===undefined) {
  Array.prototype.indexOf = function( valueToSearchFor ) {
    var iEnd = this.length;
    var retVal = -1;
    for (var i=0;i<iEnd; i++) {
      if (this[i] == valueToSearchFor) {
        retVal = i;
        break;
      }
    }
    return retVal;
  };
}

by Shannon Norrell

Leave a Comment :, , , , , , , more...

showOrHide algorithm

by webdood on Mar.01, 2010, under Javascript, Software Development

Making it easier for me to look up my own most useful block of code for displaying/hiding elements. This is the same bit of code I wrote for Microsoft that shipped with Vista and now Windows 7 with the Sidebar gadgets.

////////////////////////////////////////////////////////////////////////////////
//
// showOrHide([object|string] oHTMLElement, boolean bShowOrHide)
//           Shows or Hides an HTMLElement.
//           You can pass in the id to an object or the actual object
//
////////////////////////////////////////////////////////////////////////////////
function showOrHide(oHTMLElement, bShowOrHide) {
  try   {
    if (typeof(oHTMLElement)=="string")  {
      oHTMLElement = document.getElementById(oHTMLElement);
    }
    if (oHTMLElement && oHTMLElement.style) {
      if (bShowOrHide == 'inherit') {
        oHTMLElement.style.visibility = 'inherit';
      } else {
        if (bShowOrHide) {
          if (oHTMLElement.nodeName == 'TR') {
            oHTMLElement.style.visibility = 'inline-table';
          } else {
            oHTMLElement.style.visibility = 'visible';
          }
        } else {
          oHTMLElement.style.visibility = 'hidden';
        }
         try {
           if (bShowOrHide) {
             oHTMLElement.style.display = 'block';
           } else {
             oHTMLElement.style.display = 'none';
           }
         }
         catch (ex) {
         }
       }
     }
  }
  catch (ex) {
  }
}

Shannon Norrell

Now on GitHub

UPDATE TO THIS POSTING 4/14/2011
I have now taken to adding and removing a special className (usually called “hidden”) to oHTMLElements to show or hide them.

For example:

Assume in your CSS, there is a declaration like this:
.hidden { display:none; }

function showOrHide( oHTMLElement, bVisible ) {
  if (typeof(oHTMLElement)=="string")  {
    oHTMLElement = document.getElementById(oHTMLElement);
  }
  if (oHTMLElement) {
    if (!bVisible) {
      addClassName( oHTMLElement, 'hidden' );
    } else {
      removeClassName( oHTMLElement, 'hidden' );
  }
}

See our link about addClassName and removeClassName for more information on this technique.

Shannon Norrell

Leave a Comment :, , , more...

Unified Javascript disableTextSelection | enableTextSelection

by webdood on Dec.08, 2009, under Javascript, Software Development

Unified Text Selection Disable/Enable Routine

If you’re doing any kind of drag and drop operation in Javascript/DHTML, you will need to temporarily disable and re-enable text selection in your document while the drag operation is going on.

I wrote this block of code today and it was such a tedious hassle, I thought it worth blogging so others wouldn’t have to endure my pain :{.

This works in all browsers except PC Opera.

It DOES work in Mac OSX Safari, Firefox, Chrome and on PC Internet Explorer, Safari, Firefox and Chrome.

////////////////////////////////////////////////////////////////////////////
// UTILITIES - Section contains general-purpose utilties
// =========
////////////////////////////////////////////////////////////////////////////
utilities : {
  // savedValueOf will hold "original" values that we override/restore as needed
  savedValueOf : new Object(),
  disableTextSelection : function() {
    switch (true) {
      case ( typeof document.onselectstart!="undefined" ) : // IE
        this.savedValueOf["onselectstart"] = document.onselectstart;
        document.onselectstart=function() { return false; };
        break;
      case ( typeof document.body.style.MozUserSelect != "undefined" ) : // Firefox
        this.savedValueOf["-moz-user-select"] = document.body.style.MozUserSelect || "text";
document.body.style.MozUserSelect="none";
        break;
      case ( document.body.style["-khtml-user-select"] != "undefined" ) : // Safari
        this.savedValueOf["-khtml-user-select"] = document.body.style["-khtml-user-select"];
        document.body.style["-khtml-user-select"] = 'none';
        break;
    }
  },
  // enableTextSelection -simply restores *whatever* the previous selection mode was
  // ===============  for the particular browser
  enableTextSelection : function() {
    switch (true) {
      case ( typeof document.onselectstart!="undefined" ) : // IE
        document.onselectstart = this.savedValueOf["onselectstart"]
        break;
      case (typeof document.body.style.MozUserSelect != "undefined") :  // Firefox
        document.body.style.MozUserSelect = this.savedValueOf["-moz-user-select"]
        break;
      case ( document.body.style["-khtml-user-select"]!="undefined" ) : // Safari
        document.body.style["-khtml-user-select"] = this.savedValueOf["-khtml-user-select"];
        break;
    }
  }
}

Shannon Norrell

This posting now also on GitHub

Leave a Comment :, , , more...

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Blogroll

A few highly recommended websites...

  • A List Apart
  • Dive into HTML5
  • Javascript: The Good Parts
  • QuirksMode.org