Index: misc/ajax.js =================================================================== RCS file: /cvs/drupal/drupal/misc/ajax.js,v retrieving revision 1.17 diff -u -p -r1.17 ajax.js --- misc/ajax.js 16 May 2010 19:08:08 -0000 1.17 +++ misc/ajax.js 14 Jun 2010 22:37:29 -0000 @@ -325,10 +325,27 @@ Drupal.ajax.prototype.commands = { var method = response.method || ajax.method; var effect = ajax.getEffect(response); - // Manually insert HTML into the jQuery object, using $() directly crashes - // Safari with long string lengths. http://dev.jquery.com/ticket/3178 + // We don't know what response.data contains: it might be a string of text + // without HTML, so don't rely on jQuery correctly iterpreting + // $(response.data) as new HTML rather than a CSS selector. Also, if + // response.data contains top-level text nodes, they get lost with either + // $(response.data) or $('
').replaceWith(response.data); var new_content = $('').html(response.data); + // For legacy reasons, the effects processing code assumes that new_content + // consists of a single top-level element. Also, it has not been + // sufficiently tested whether attachBehaviors() can be successfully called + // with a context object that includes top-level text nodes. However, to + // give developers full control of the HTML appearing in the page, and to + // enable AJAX content to be inserted in places where DIV elements are not + // allowed (e.g., within TABLE, TR, and SPAN parents), we remove the + // container DIV created above in cases where response.data consists of a + // single top-level element. For more information, please see + // http://drupal.org/node/736066. + if (new_content.contents().length == 1 && new_content.contents().get(0).nodeType == 1) { + new_content = new_content.contents(); + } + // If removing content from the wrapper, detach behaviors first. switch (method) { case 'html':