2010-11-15 4 views
0

Une requête AJAX renvoie une chaîne HTML contenant 2 tables.Deux tables d'une variable String de HTML

Je veux mettre table1dansdiv1 et table2dansdiv2

Si le code HTML représentant les deux tables (ils sont séquentiels, non imbriquées ou quoi que ce soit drôle comme ça) est stocké dans la variable twoTables, comment puis-je utiliser les sélecteurs jQuery (ou toute autre méthode, bien que j'essaie d'éviter la manipulation directe de chaîne) pour scinder la variable?

modifier: données ressemble

<table id="table1"> ... </table><table id="table2"> ... </table> 
+0

Pouvez-vous ajouter un exemple de données renvoyées? – wajiw

+0

Pouvez-vous donner un exemple du code HTML que vous obtenez de votre appel ajax? Est-il similaire à "

..
...
"? –

+0

Y a-t-il une chance que vous le changiez en retournant une seule chaîne pour retourner un objet JSON? –

Répondre

1
var $tables = $(twoTables); 

$('#div1').append($tables[0]); 
$('#div2').append($tables[1]); 

Exemple:http://jsfiddle.net/VhAzV/

Depuis twoTables représente une chaîne HTML de 2 tables séquentiels, il suffit d'envoyer la chaîne à un objet jQuery, puis sélectionnez chaque table élément DOM par son indice de base zéro.

Ou vous pouvez use .eq() pour obtenir la table enveloppée dans un objet jQuery.

var $tables = $(twoTables); 

$tables.eq(0).appendTo('#div1'); 
$tables.eq(1).appendTo('#div2'); 

est ici une version sans jQuery qui utilise encore l'analyseur HTML natif du navigateur:

Exemple:http://jsfiddle.net/patrick_dw/VhAzV/2/

var twoTables = '<table><tr><td>table one</td></tr></table><table><tr><td>table two</td></tr></table>'; 
var $tables = document.createElement('div'); 
$tables.innerHTML = twoTables; 

document.getElementById('div1').appendChild($tables.firstChild); 
document.getElementById('div2').appendChild($tables.firstChild); 

EDIT: ont rendu vraiment pas jQuery dans l'insertion DOM.

+0

C'est génial à savoir! Y at-il une liste des éléments qui en font des références DOM? Évidemment, un saut de ligne ou une étiquette forte ne pourrait pas être référencée via les indications de l'élément DOM, n'est-ce pas? – sova

+0

@sova - En fait, à peu près n'importe quel tag/texte est converti en un élément DOM (même les commentaires de code). Parce que le DOM est la représentation d'objet des éléments de page, tout doit avoir une certaine représentation. Ainsi, même si vous insérez du texte entre les deux tables, un nœud de texte pourrait être créé et pourrait être référencé. Il existe des différences mineures entre certains navigateurs en ce qui concerne l'espace vide entre les balises ou les corrections apportées pour un balisage non valide. – user113716

+0

ah je vois. Cool, merci pour l'info man – sova

0

Comme par http://api.jquery.com/load/

$('#result').load('ajax/test.html #container'); 

Vous pouvez le faire deux fois pour deux tables.

+0

Cela ne fonctionnera pas. –

0

Si vous avez une chaîne qui ressemble à quelque chose comme ceci:

var foo = "<table><tr><td>1</td></tr></table><table><tr><td>2</td></tr></table>"; 

d'abord en faire un objet jQuery:

foo = $(foo); 

Ensuite, vous pouvez obtenir chaque table et les insérer où vous voulez :

$("#div1").append(foo[0]); // First table 
$("#div2").append(foo[1]); // Second table 
0

Ceci pourrait être moche mais c'est la première chose qui me vient à e solution élégante:

var tableEnd = '</table>'; 

var arr = twoTables.split(tableEnd); 

var t1 = arr[0].concat(tableEnd), t2 = arr[1].concat(tableEnd); 

div1.innerHTML = t1; 

div2.innerHTML = t2; 

bonus: pas de frais généraux jQuery!:)

+0

L'utilisation de la balise de fin est une solution intéressante tant que l'on sait que ça va ressembler exactement à ça. Une chose à considérer serait cependant la possibilité de tables imbriquées. Je ne sais pas si c'est le cas ici, mais si cela devait être le cas, cela risquerait de jeter un gros coup dans l'opération. : o) – user113716

+0

l'OP a déclaré qu'il n'y avait pas de tables imbriquées. De plus, ceci est plus rapide et n'a pas du tout besoin de jQuery –

+0

Eh bien, les tables à séparer n'étaient pas imbriquées. Mais je reconnais que dans cette situation il n'y en a probablement pas d'autres imbriquées. En ce qui concerne la performance, cela dépend, bien que je conviendrais que jQuery le ralentirait. En utilisant l'API native, [il semble être plus rapide] (http://jsperf.com/table-via-dom-parsing-vs-regex) d'utiliser l'analyseur HTML, étant donné que OP a l'intention de transformer les tables en Éléments DOM. – user113716

2

Vous pouvez diviser les deux tables en un tableau. Consultez les liens suivants:

var s = "<table>Dude!</table><table>What?</table>"; 
var a = s.match(/<table>.*?<\/table>/gi); 
alert(a); 

Donc, la table ne sera dans un [0], et une table à deux dans un [1].

+0

Nice regex !! +1 –

+0

Considérons [cette réponse] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) en ce qui concerne l'analyse HTML via regex. – user113716

+0

@patrick dw: Sova obtient une chaîne d'un serveur via XHR. En supposant qu'il contrôle la réponse du serveur, il doit simplement être considéré comme une chaîne aussi prévisible qu'il le souhaite, plutôt que comme un document HTML démoniaque non comparable. – Brendan