Fixed #1039 and #1733 by going through the core API and making them text node and comment node safe.
This commit is contained in:
parent
12ef255ffd
commit
ffbedf0262
8 changed files with 188 additions and 64 deletions
29
src/core.js
29
src/core.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 ) {
|
||||
|
|
15
src/event.js
15
src/event.js
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue