Skip to content
Permalink
Browse files

Fixed #1039 and #1733 by going through the core API and making them t…

…ext node and comment node safe.
  • Loading branch information
davids549 committed Dec 7, 2007
1 parent 12ef255 commit ffbedf0262b3eea906f39c0115b818d7456a3994
Showing with 188 additions and 64 deletions.
  1. +20 −9 src/core.js
  2. +13 −2 src/event.js
  3. +6 −0 src/fx.js
  4. +3 −3 src/selector.js
  5. +1 −0 test/index.html
  6. +133 −48 test/unit/core.js
  7. +6 −1 test/unit/event.js
  8. +6 −1 test/unit/fx.js
@@ -251,13 +251,15 @@ jQuery.fn = jQuery.prototype = {

append: function() {
return this.domManip(arguments, true, false, function(elem){
this.appendChild( elem );
if (this.nodeType == 1)
this.appendChild( elem );
});
},

prepend: function() {
return this.domManip(arguments, true, true, function(elem){
this.insertBefore( elem, this.firstChild );
if (this.nodeType == 1)
this.insertBefore( elem, this.firstChild );
});
},

@@ -402,6 +404,9 @@ jQuery.fn = jQuery.prototype = {

} else
return this.each(function(){
if ( this.nodeType != 1 )
return;

if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
this.checked = (jQuery.inArray(this.value, value) >= 0 ||
jQuery.inArray(this.name, value) >= 0);
@@ -722,18 +727,19 @@ jQuery.extend({
// internal only, use addClass("class")
add: function( elem, classNames ) {
jQuery.each((classNames || "").split(/\s+/), function(i, className){
if ( !jQuery.className.has( elem.className, className ) )
if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
elem.className += (elem.className ? " " : "") + className;
});
},

// internal only, use removeClass("class")
remove: function( elem, classNames ) {
elem.className = classNames != undefined ?
jQuery.grep(elem.className.split(/\s+/), function(className){
return !jQuery.className.has( classNames, className );
}).join(" ") :
"";
if (elem.nodeType == 1)
elem.className = classNames != undefined ?
jQuery.grep(elem.className.split(/\s+/), function(className){
return !jQuery.className.has( classNames, className );
}).join(" ") :
"";
},

// internal only, use is(".class")
@@ -1014,6 +1020,10 @@ jQuery.extend({
},

attr: function( elem, name, value ) {
// don't set attributes on text and comment nodes
if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
return undefined;

var fix = jQuery.isXMLDoc( elem ) ?
{} :
jQuery.props;
@@ -1267,7 +1277,8 @@ jQuery.each({
jQuery.each({
removeAttr: function( name ) {
jQuery.attr( this, name, "" );
this.removeAttribute( name );
if (this.nodeType == 1)
this.removeAttribute( name );
},

addClass: function( classNames ) {
@@ -8,6 +8,9 @@ jQuery.event = {
// Bind an event to an element
// Original by Dean Edwards
add: function(element, type, handler, data) {
if ( element.nodeType == 3 || element.nodeType == 8 )
return;

// For whatever reason, IE has trouble passing the window object
// around, causing it to be cloned in the process
if ( jQuery.browser.msie && element.setInterval != undefined )
@@ -83,6 +86,10 @@ jQuery.event = {

// Detach an event or set of events from an element
remove: function(element, type, handler) {
// don't do events on text and comment nodes
if ( element.nodeType == 3 || element.nodeType == 8 )
return;

var events = jQuery.data(element, "events"), ret, index;

// Namespaced event handlers
@@ -147,6 +154,10 @@ jQuery.event = {

// Handle triggering a single element
} else {
// don't do events on text and comment nodes
if ( element.nodeType == 3 || element.nodeType == 8 )
return;

var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
// Check to see if we need to provide a fake event, or not
event = !data[0] || !data[0].preventDefault;
@@ -273,7 +284,7 @@ jQuery.event = {
if ( event.pageX == null && event.clientX != null ) {
var doc = document.documentElement, body = document.body;
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientLeft || 0);
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientLeft || 0);
}

// Add which for key events
@@ -437,7 +448,7 @@ function bindReady(){

// If Safari or IE is used
// Continually check to see if the document is ready
if (jQuery.browser.msie || jQuery.browser.safari ) (function(){
if (jQuery.browser.msie || jQuery.browser.safari ) (function(){
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
@@ -69,6 +69,9 @@ jQuery.fn.extend({
var optall = jQuery.speed(speed, easing, callback);

return this[ optall.queue === false ? "each" : "queue" ](function(){
if ( this.nodeType != 1)
return false;

var opt = jQuery.extend({}, optall);
var hidden = jQuery(this).is(":hidden"), self = this;

@@ -135,6 +138,9 @@ jQuery.fn.extend({
return queue( this[0], type );

return this.each(function(){
if ( this.nodeType != 1)
return;

if ( fn.constructor == Array )
queue(this, type, fn);
else {
@@ -96,9 +96,9 @@ jQuery.extend({
if ( typeof t != "string" )
return [ t ];

// Make sure that the context is a DOM Element
if ( context && !context.nodeType )
context = null;
// check to make sure context is a DOM element or a document
if ( context && context.nodeType != 1 && context.nodeType != 9)
return [ ];

// Set the correct context (if none is provided)
context = context || document;
@@ -171,6 +171,7 @@ <h2 id="userAgent"></h2>
<input type="checkbox" name="checkedtestcheckboxes" />
</div>
</form>
<div id="nonnodes"><span>hi</span> there <!-- mon ami --></div>
</div>
</div>
</dl>

0 comments on commit ffbedf0

Please sign in to comment.
You can’t perform that action at this time.