clean: function(a) {
var r = [];
for ( var i = 0; i < a.length; i++ ) {
- if ( a[i].constructor == String ) { // Convert html string into DOM nodes
+ var arg = a[i];
+ if ( arg.constructor == String ) { // Convert html string into DOM nodes
// Trim whitespace, otherwise indexOf won't work as expected
- var s = jQuery.trim(a[i]), div = document.createElement("div"), wrap = [0,"",""];
+ var s = jQuery.trim(arg), div = document.createElement("div"), wrap = [0,"",""];
if ( !s.indexOf("<opt") ) // option or optgroup
wrap = [1, "<select>", "</select>"];
// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + s + wrap[2];
while ( wrap[0]-- ) div = div.firstChild;
- a[i] = div.childNodes;
- }
-
- if ( a[i].length != undefined && !a[i].nodeType ) // Handles Array, jQuery, DOM NodeList collections
- for ( var n=0; n < a[i].length; n++ )
- r.push(a[i][n]);
- else if ( a[i] !== null )
- r.push( a[i].nodeType ? a[i] : document.createTextNode(a[i].toString()) );
+
+ // Have to loop through the childNodes here to
+ // prevent a Safari crash with text nodes and /n characters
+ for ( var j = 0; j < div.childNodes.length; j++ )
+ r.push( div.childNodes[j] );
+ }
+ else if ( arg.length != undefined && !arg.nodeType ) // Handles Array, jQuery, DOM NodeList collections
+ for ( var n = 0; n < arg.length; n++ )
+ r.push(arg[n]);
+ else
+ r.push( arg.nodeType ? arg : document.createTextNode(arg.toString()) );
}
return r;
},
fix: function(event) {
- if ( event ) {
- event.preventDefault = function() {
- this.returnValue = false;
- };
-
- event.stopPropagation = function() {
- this.cancelBubble = true;
- };
+ // check IE
+ if(jQuery.browser.msie) {
+ // get real event from window.event
+ event = window.event;
+ // fix target property
+ event.target = event.srcElement;
+ // check safari and if target is a textnode
+ } else if(jQuery.browser.safari && event.target.nodeType == 3) {
+ // target is readonly, clone the event object
+ event = jQuery.extend({}, event);
+ // get parentnode from textnode
+ event.target = event.target.parentNode;
}
-
+ // fix preventDefault and stopPropagation
+ event.preventDefault = function() {
+ this.returnValue = false;
+ };
+ event.stopPropagation = function() {
+ this.cancelBubble = true;
+ };
return event;
}
*
* It only returns the immediately previous sibling, not all previous siblings.
*
- * @example $("p").previous(".selected")
+ * @example $("p").prev(".selected")
* @before <div><span>Hello</span></div><p class="selected">Hello Again</p><p>And Again</p>
* @result [ <div><span>Hello</span></div> ]
*