2011-01-07 6 views
1

Ich erzeuge eine HTML-Tabelle mit PHP (mit dem Codeigniter-Framework) und ich versuche, einen Link, der ein Jquery-Dialog mit einigen Informationen öffnen wird ist spezifisch für diese Zeile. Eine Art "Mehr Info" -Typ, der den Dialog öffnet.Wie kann ich einen jQuery-Dialog für jede Zeile in einer HTML-Tabelle hinzufügen

Wenn ich das Dialogfeld div dieser Zeile hinzufüge und die erforderlichen Informationen darin kapsle, bricht es die Tabelle (kann kein div in der Tabelle haben).

Plus, es scheint, ich müsste eine unbekannte Menge von jQuery Dialogfunktionen deklariert ... Ich nehme an, eine Art von Funktion benötigt wird und die ID des Elements, das den Dialog sowie die ID öffnet denn der Dialog würde an die Funktion übergeben werden. Aber es scheint, dass etwas in jQuery für so etwas eingebaut sein sollte.

Fehle ich etwas, und wenn ja, hat jemand irgendwelche Tipps, um mich in die richtige Richtung zu weisen?

+0

Warum erstellen Sie nicht nur einen Dialog bei Bedarf und füllen ihn mit den richtigen Informationen basierend auf der entsprechenden Zeile? Das Erstellen von _x_ Dialogen scheint sehr ineffizient zu sein. –

+0

Können Sie einen Screenshot oder ein URL-Beispiel angeben, wenn Sie von einem Dialog sprechen? – Matrym

Antwort

2

einbetten die Informationen als Metadaten auf der Reihe, a la ...

<tr data-foo="additional data here" data-bar="even more data">…</tr> 

Und in Ihrem Javascript, rief eine wenig Magie .live():

$('#your_table .show_dialog').live('click', function(){ 
    var data_for_dialog = { 
    foo: $(this).closest('tr').attr('data-foo'), 
    bar: $(this).closest('tr').attr('data-bar') 
    } 

    show_dialog(data); // your own code to show the dialog 
}); 

Wo Sie einen <a> Tag mit der Klasse "Show_Dialog" haben. Beachten Sie, dass dies nicht sehr effizient ist, wenn Sie viele Attribute haben oder einige Daten enthalten, die neue Zeilen enthalten müssen. Sie können dies verbessern, indem Sie iterating over each attribute auf diesem <tr> definiert und automatisch die Attribute beginnend mit data- einschließen. Das ist jedoch außerhalb des Rahmens dieser Frage.

Was den Dialog zeigt, so etwas wie dies würde ausreichen, um:

function show_dialog(data) { 
    var $dialog = $('#dialog'); 
    for(var attr in data) { 
    $dialog.find("." + attr).html(data[attr]); 
    } 
    $dialog.show(); 
} 

<div id="dialog"> 
    <p class="data-foo"></p> 
    <p class="data-bar"></p> 
</div> 

Das ungetestet ist, sollte aber zeigen, was gut genug geschieht.

Hinweis: Sie können benutzerdefinierte Attribute in HTML5 definieren, sofern ihnen das Präfix "data" vorangestellt ist.

+0

Wird es ein Problem mit dieser Arbeit in Nicht-HTML-5-Browsern geben? – iddimu

+0

Überhaupt nicht. Die meisten Spezifikationsänderungen von HTML5 dokumentieren die vorhandenen Funktionen in Browsern und standardisieren das Verhalten. Dies ist einer dieser Bereiche. Sie können beliebige Attribute verwenden, die Ihnen gefallen, aber die Daten, die ihnen vorangestellt werden, sind sicher vor Verhaltensänderungen in der Zukunft. – coreyward

+0

Das funktioniert super! Nahm ein paar kleine Änderungen, aber funktioniert danach perfekt ... danke !! – iddimu

1

Ich stimme Tomalaks Kommentar zu, eine Box zu verwenden und den Inhalt darin zu ändern. Wenn Sie das tun wollten, was Sie zu tun versuchen (ohne Ihren Code zu sehen), scheint es, dass Sie das Dialogfeld div im <table>-Tag anstelle eines <td>-Tags einfügen, das wäre das erste zu überprüfende Element.

Zweitens den Dialog öffnen Sie einfach den div neben dem Link verweisen können:

<table> 
    <tr> 
    <td> 
     <span class="MoreInfo">More info</span> 
     <div>stuff for dialog</div> 
    </td> 
    </tr> 
</table> 

$(document).ready(function(){ 
    $('.MoreInfo').next().dialog({ autoOpen: false }) 
    $('.MoreInfo').click(function(){ 
     $(this).next().dialog('open'); 
    }); 
}); 

Edit: Leider die JQuery Ich gehe davon aus Sie verkorkste werden mit dem JqueryUI Dialog

+0

Danke Kumu, ich denke, das wird genau so funktionieren, wie ich es brauche ... aber etwas stimmt nicht mit der .click (function() {... Ich weiß, dass es den Dialog korrekt in der vorherigen Anweisung einstellt, wenn ich autoOpen auf setze True, es wird ausgelöst, wenn die Seite fertig geladen ist. Aber ich kann nicht herausfinden, warum der Dialog nicht beim Klicken geöffnet wird. Wenn ich einen Alarm einlege, wird er ausgelöst ('MoreInfo').Klicken Sie auf, damit ich weiß, dass das Ereignis erfasst wird. Irgendwelche Vorschläge? – iddimu

+0

Oh, und ja ich benutze das jQueryUI Dialog – iddimu

+0

Ich empfehle das nicht. Sie initialisieren potenziell Hunderte von jQuery UI-Dialogen auf Dokument bereit, was Auswirkungen auf die Leistung haben wird. Nicht zu vergessen, es ist nicht sehr anmutig. – coreyward

Verwandte Themen