Nachträglich erfasste Links dynamisch ansprechen?
Sh4itan
- javascript
Hallo Leute,
ich habe ein Problem und hoffe, das jemand dazu die Antwort weiß :D
Da wir im Unternehmen neuerdings mit jQuery arbeiten dachte ich mir, erstelle ich eine Anwendung, die nur eine Seite besitzt und über JavaScript/jQuery immer nur neu mit Inhalt befüllt wird. Gesagt, getan:
Meine Seite lädt, wird auf Link-Klick auch neu ersstellt bzw ja nur abgeändert. Da ich die Seite bzw das Grundgerüst gern so dynamisch wie möglich halten möchte, habe ich mir eine eigene Erweiterung geschrieben, um Html-Tags nicht einfach reinzuschreiben, sondern direkt an den DOM anzuhängen. Damit könnte ich nachher besser arbeiten, so mein Gedanke...
Leider ist es so, das sich die dynamisch hinzugefügten Links nicht mit der jQuery-Funktion $(document).ready()
vertragen, sprich, ich kann sie darüber nicht ansprechen. Für die Dynamik sieht mein Linke so aus:
<a href=# name=linknamexy>Inhalt</a>
Ich lasse alle Attribute sowie den "Inhalt" des Link-Tags dynmisch mit Javascript im DOM unter dem gewünschten div erschaffen.
Trotz allem kann ich die "neuen" Links nicht mit der universellen Link-Funktion von jQuery ansprechen:
// Funktion steht in $(document).ready()
$('a').click(
function()
{
// Füllt sich mit dem Namen des Links, zur Identifizierung
var target= $(this).attr('name');
if(target = 'testlink')
{
// Funktioniert noch
appendToDOM('a', 'test-link', ['href,#','name,hauptmenu'], 'content'); // Meine Erweiterung, um den Link zum DOM (div id=content) hinzuzufügen
} else if(target = 'hauptmenu')
{
// Funktioniert nicht mehr, da Funktion nicht einmal aufgerufen wird...
appendToDOM('a', 'link', ['href,#','name,testlink'], 'content'); // Meine Erweiterung, um den Link zum DOM (div id=content) hinzuzufügen
}
}
);
Kann mir bei meinem Problem jemand helfen?
MfG,
Sh4itan
Klingt sehr aufwendig. Und man kann keine Links mehr bookmarken oder verschicken, ist das Sinn der Sache?
Da wir im Unternehmen neuerdings mit jQuery arbeiten dachte ich mir, erstelle ich eine Anwendung, die nur eine Seite besitzt und über JavaScript/jQuery immer nur neu mit Inhalt befüllt wird. Gesagt, getan:
Blöde Idee - im Intranet macht das bei einfachen Dingen wenig sinn, weil die Anbindung ohnehin schnell genug ist und in den weiten des Internet ist es dämlich, weil man potentiell Besucher ausschließt, auch wenns nur ein paar Prozent sind - und sowas sollte besonders für ein "Unternehmen" von Bedeutung sein.
Ich lasse alle Attribute sowie den "Inhalt" des Link-Tags dynmisch mit Javascript im DOM unter dem gewünschten div erschaffen.
was ist "appendToDOM" und was soll es machen?
Was stört dich an den ordentlichen Dokumentierten jQuery-Methoden "append()" und "appendTo()"?
Warum selektierst du alle a-Elemente, wenn du doch nur jene brauchst die ein name-Attribut mit bestimmten Werten haben (wozu übrigens, das ist lange obsolet) und nicht nur jene, die du wirklich willst?
Hallo suit,
die Notwendigkeit der Anwendung ist es leider nicht, im Intranet lauffähig zu sein, sondern schon für die bald kommende BlackBerry-Version BBX (korrekterweise neuerdings BB10) erstellt zu werden. Diese soll nämlich laut Pressemeldungen von RIM perönlich kein Java mehr unterstützen... Und all unsere BlackBerry-Apps basieren derzeit auf Java. Daher HTML und JavaScript/jQuery.
appendToDOM ist meine eigene Erweiterung, die zur Laufzeit der Anwendung den gewünschten HTML-Tag mit Attributen etc. dem DOM hinzufügt. Das verkürzt mir viel Schreibarbeit meiner Meinung nach und es funktioniert auch.
Und um das lästige "Seitenladen" auf den BlackBerrys zu vermeiden, wollte ich eben den Inhalt der Seiten immer in ein Container-Div packen.
Mittlerweile habe ich eine Möglichkeit in jQuery gefunden, auch nachträglich hinzugefügten Links (auch anderen Tags) ein bestimmtes Event zuzuweisen :D
$('a').on('click',function(){/*Tu etwas*/});
MfG,
Sh4itan
die Notwendigkeit der Anwendung ist es leider nicht, im Intranet lauffähig zu sein, sondern schon für die bald kommende BlackBerry-Version BBX (korrekterweise neuerdings BB10) erstellt zu werden. Diese soll nämlich laut Pressemeldungen von RIM perönlich kein Java mehr unterstützen... Und all unsere BlackBerry-Apps basieren derzeit auf Java. Daher HTML und JavaScript/jQuery.
Ich verstehe immer noch nicht, warum das ganze dann eine Schwachsinnslösung mit JavaScript werden soll - es gibt WLAN und 3G. Diesen App-Wahnsinn werd' ich nie verstehen.
appendToDOM ist meine eigene Erweiterung, die zur Laufzeit der Anwendung den gewünschten HTML-Tag mit Attributen etc. dem DOM hinzufügt. Das verkürzt mir viel Schreibarbeit meiner Meinung nach und es funktioniert auch.
Das ist Unsinn - die jQuery-Core-Methoden erlauben das ebenfalls ohne viel schreibarbeit aber dafür ist das ganze für jeden, der von jQuery Ahnhung hat nachvollziehbar und erweiterbar:
$('#content').append(
$('<a />')
.attr('href', '#')
.attr('name', 'hauptmenu')
);
$('<a />')
.attr('href', '#')
.attr('name', 'hauptmenu')
.appendTo('#content');
Und um das lästige "Seitenladen" auf den BlackBerrys zu vermeiden, wollte ich eben den Inhalt der Seiten immer in ein Container-Div packen.
Sogar mein ZTE-Blade - ein Dreckstelefon sondergleichen, das wohl langsamste Smartphone der Welt, ist ausreichend schnell um Websites schnell zu rendern, ohne "lästiges Seitenladen".
Die Idee ist wirklich (ernsthaft[sic!]) nicht sehr zielführend.
Mittlerweile habe ich eine Möglichkeit in jQuery gefunden, auch nachträglich hinzugefügten Links (auch anderen Tags) ein bestimmtes Event zuzuweisen :D
$('a').on('click',function(){/Tu etwas/});
Nein, on fügt nicht nachträglich etwas hinzu es ist ein globaler Event-Listener der einfach mal alles prüft, was so irgendwie da ist - so wie in alten jQuery-Versionen delegate() oder live(). Da er aber mittelfristig bind() ersetzen wird, gibts keinen Grund ihn nicht zu verwenden.
Das löst zwar dein "Problem" - deinen defekten Designansatz macht es aber nicht besser.
okay, das mit dem append habe ich eingesehen, dass scheint wirklich Quatsch zu sein.
Allerdings geht es mir nicht um das "rendern" der Seite, sondern vielmehr um den Aufwand, der hinter dem Holen der Daten steckt. Klar geht es auch anders, aber die App (die Webanwendung sein muss), zieht sich Daten aus einem unternehmensinternen SAP-Server. Allein das ist schon langsam, dann aber den Request bei jedem Aufrufen der Seite neu zu starten, wäre ein zeitliches Problem. Oder irre ich mich da?
Ich würde mich über andere Anregungen freuen.
Und wenn mein Ansatz wirklich so eine "Schwachsinnslösung" ist, bin ich für andere Vorschläge offen.
MfG,
Sh4itan
okay, das mit dem append habe ich eingesehen, dass scheint wirklich Quatsch zu sein.
Sag' ich doch :)
Allerdings geht es mir nicht um das "rendern" der Seite, sondern vielmehr um den Aufwand, der hinter dem Holen der Daten steckt. Klar geht es auch anders, aber die App (die Webanwendung sein muss), zieht sich Daten aus einem unternehmensinternen SAP-Server. Allein das ist schon langsam, dann aber den Request bei jedem Aufrufen der Seite neu zu starten, wäre ein zeitliches Problem. Oder irre ich mich da?
Ob du 1x am anfang "ganz lang" wartest oder mitten drin "öfter kurz" ist in Summe egal - und werden zwischendrin nicht aufgrund der Benutzerinteraktion verschiedene Daten benötigt? Was macht es dann für einen Sinn "pauschal" mal alles mögliche zu holen und die initale Ladezeit aufzublasen, wenn 90 % der Daten nicht benötigt werden?
Natürlich gibt es auch lösungen wo es sinnvoll ist alle Daten gleich zu laden, aber dann doch bitte nicht mit irgendwelchem Schmonz-Lösungen per Append herumwursteln.
Und wenn mein Ansatz wirklich so eine "Schwachsinnslösung" ist, bin ich für andere Vorschläge offen.
Entscheide dich ob es wirklich notwendig ist, alle Daten am Anfang laden zu müssen - wenn das wirklich notwendig ist, kommt es auf die Art der Daten an. Werden diese Dynamisch gefiltert, herumgewurstelt oder was auch immer oder sind es einzelne "Dokumente" die dann sind wie sie sind?
Für den Fall dass alles geladen wird un es einzelne Dokumente sind: mach einfach für jedes Unterdokument einen Abschnitt die du dann beim vorhandensein von JavaScript ausblendest, bis auf den ersten und beim Klicken eines Menüpunkts wird der betreffende Abschnitt eingeblendet und der Rest aus - keine unnötigen DOM-Operation, einfach und clean - geht auch ohne JavaScript und ist gut wartbar.
<nav>
<ul>
<li><a href="#page1">Seite 1</a></li>
<li><a href="#page1">Seite 2</a></li>
<li><a href="#page1">Seite 3</a></li>
<li><a href="#page1">Seite 4</a></li>
<li><a href="#page1">Seite 5</a></li>
</ul>
</nav>
<section id="page1"></section>
<section id="page2"></section>
<section id="page3"></section>
<section id="page4"></section>
<section id="page5"></section>
Wenn du dynamische Daten hast, ist es sinnvoll diese z.B. per XML oder JSON in einer Variable zu hinterlegen die du dann parsen kannst, eine Ausgabe erzeugst und diese an entsprechender Stelle ins DOM einfügst - oder eben einen Request an den Server stellen, so eine Logik in einer serverseitigen Sprache meistens wesentlich zeilführender ist als am Client, noch dazu wenn es ein Telefon ist.
Also im Großen und Ganzen werden einmal Daten geholt, die über einen WebService vom SAP-Server als XML zurückgegeben werden sollen. Das XML-Dokument muss ich dann noch einmal parsen und daraus erst entsteht der eigentliche Aufbau der Seiten. Je nachdem, wie viel ich zurückbekomme, je mehr Unterpunkte müssen erstellt bzw "Wegentscheidungen" vom Nutzer getroffenwerden. Allerdings müsste ich die Daten am Ende schon recht zentral halten, damit beim Herumspringen des Users auf den Seiten eben kein unnützer Traffic entsteht(der auch noch begrenzt ist). Daher war meine Annahme 1x Laden und dann irgendwo im Speicher halten.
Bisher stehe ich ja noch ganz am Anfang, aber einen SAP-Request habe ich auch noch nie gemacht :/
Bin also recht neu auf dem Gebiet jQuery/SAP
MfG,
Sh4itan
Bisher stehe ich ja noch ganz am Anfang, aber einen SAP-Request habe ich auch noch nie gemacht :/
Dann fang mit einem Konzept an bevor du lost legst.
Mach dir ein Prozessdiagramm (Flow-Chart) oder eine Mind-Map der Struktur und wie man von wo gelangen muss und was du "am Anfang" schon laden kannst.
Wenn siche die Daten aufgrund der Nutzerinteraktion ändern können, dann notiere wo das passiert und wo die Daten herkommen.
Hi,
Leider ist es so, das sich die dynamisch hinzugefügten Links nicht mit der jQuery-Funktion
$(document).ready()
vertragen, sprich, ich kann sie darüber nicht ansprechen.
das liegt daran, dass Du sie erst nach diesem Ereignis erzeugst.
<a href=# name=linknamexy>Inhalt</a>
Ich schließe mich den Anmerkungen meiner Vorredner an: Grundsätzlich ist an Deinem Konzept so einiges, was überarbeitungswürdig erscheint.
Trotz allem kann ich die "neuen" Links nicht mit der universellen Link-Funktion von jQuery ansprechen:
Doch, Du müsstest es nur tun. Dass später erzeugte Inhalte nicht in einer vorher geschehenen Selektion vorhanden gewesen waren (es gibt in der deutschen Grammatik keine Vergangenheitsform, die hierzu ausreichend erscheint), ist nur logisch.
} else if(target = 'hauptmenu')
Was hast Du vor? Eine Navigation zentral auszulagern? Dazu gibt es nur wenige Techniken, die *noch* ungeeigneter sind als JavaScript.
Cheatah
Doch, Du müsstest es nur tun. Dass später erzeugte Inhalte nicht in einer vorher geschehenen Selektion vorhanden gewesen waren (es gibt in der deutschen Grammatik keine Vergangenheitsform, die hierzu ausreichend erscheint), ist nur logisch.
Was stört dich an der Vorvergangenheit? Das ist imho die korrekte Form - dafür dass die Bundesdeutschen idR. die Vorvergangenheit missbrauchen um auszudrücken ist bedauerlich, aber das ist halt so.
Hi,
(es gibt in der deutschen Grammatik keine Vergangenheitsform, die hierzu ausreichend erscheint),
Was stört dich an der Vorvergangenheit?
der Name. Es ist nicht plus quam perfekt, sondern minus quam perfekt.
Cheatah ;-)
(es gibt in der deutschen Grammatik keine Vergangenheitsform, die hierzu ausreichend erscheint),
Was stört dich an der Vorvergangenheit?der Name. Es ist nicht plus quam perfekt, sondern minus quam perfekt.
Wieso?
Es ist doch die "mehr als vollendete" Form - ich kann dir nicht folgen.
Hi,
der Name. Es ist nicht plus quam perfekt, sondern minus quam perfekt.
Wieso?
weil die Formulierung für die Aussage, die ich treffen möchte, weniger als perfekt ist.
ich kann dir nicht folgen.
Das liegt daran, dass ich nicht twittere ... ;-)
Cheatah
Moin,
der Name. Es ist nicht plus quam perfekt, sondern minus quam perfekt.
Wieso?weil die Formulierung für die Aussage, die ich treffen möchte, weniger als perfekt ist.
ich kann dir nicht folgen.
Das liegt daran, dass ich nicht twittere ... ;-)
Ich frag mich grad ob da einer in vorweihnachtlicher Stimmung seine Vorraete fluessigen Goldes pluendert.
Hi,
Ich frag mich grad ob da einer in vorweihnachtlicher Stimmung seine Vorraete fluessigen Goldes pluendert.
falls sich das bewahrheiten sollte, dann sag diesem Jemand bitte, er möge mir was über lassen!
Cheatah ;-)
Ich frag mich grad ob da einer in vorweihnachtlicher Stimmung seine Vorraete fluessigen Goldes pluendert.
falls sich das bewahrheiten sollte, dann sag diesem Jemand bitte, er möge mir was über lassen!
Sind deine Hopfen-Kaltschalen schon aus?
@@suit:
nuqneH
Was stört dich an der Vorvergangenheit? Das ist imho die korrekte Form - dafür dass die Bundesdeutschen idR. die Vorvergangenheit missbrauchen um auszudrücken ist bedauerlich, aber das ist halt so.
Tun sie das? Sie missbrachen das Perfekt (Vorgegenwart?) als Vergangenheitsform, nicht das Plusquamperfekt.
Qapla'
Was stört dich an der Vorvergangenheit? Das ist imho die korrekte Form - dafür dass die Bundesdeutschen idR. die Vorvergangenheit missbrauchen um auszudrücken ist bedauerlich, aber das ist halt so.
Tun sie das? Sie missbrachen das Perfekt (Vorgegenwart?) als Vergangenheitsform, nicht das Plusquamperfekt.
"Gestern war ich einkaufen gewesen." oder ähnliche Formulierungen findet man sätndig, obwohl eigentlich "Gestern kaufte ich ein" (Mitvergangenheit) oder "Gestern war ich einkaufen" Vergangenheit gemeint ist.
Om nah hoo pez nyeetz, suit!
Tun sie das? Sie missbrachen das Perfekt (Vorgegenwart?) als Vergangenheitsform, nicht das Plusquamperfekt.
"Gestern war ich einkaufen gewesen." oder ähnliche Formulierungen findet man sätndig, obwohl eigentlich "Gestern kaufte ich ein" (Mitvergangenheit) oder "Gestern war ich einkaufen" Vergangenheit gemeint ist.
Du vergleichst sein und einkaufen, also Äpfel mit Birnen ;-)
(Präsens) ich kaufe ein
(Perfekt) ich habe eingekauft
(Präteritum) ich kaufte ein
(Plusquamperfekt) ich hatte eingekauft
(Futur I) ich werde einkaufen
(Futur II) ich werde eingekauft haben
ich bin einkaufen
ich bin einkaufen gewesen
ich war einkaufen
ich war einkaufen gewesen
ich werde einkaufen
ich werde einkaufen gewesen sein
Matthias
Du vergleichst sein und einkaufen, also Äpfel mit Birnen ;-)
Ja, Herr Lehrer :p
Hallo,
"Gestern war ich einkaufen gewesen." oder ähnliche Formulierungen findet man sätndig
nach meiner (natürlich nicht allumfassenden) Erfahrung findet sich diese Eigenheit höchstens vor allem im Rheinland. In anderen Landesteilen ist das Plusquamperfekt als allein stehende Form höchst selten, während es zusammen mit dem Präteritum selbstverständlich verwendet wird, um eine zeitliche Abfolge auszudrücken: "Gestern war ich einkaufen, nachdem der Regen aufgehört hatte."
Ansonsten wird, wie Gunnar schon feststellt, in der Umgangssprache vor allem das Perfekt anstelle des Präteritums benutzt.
Ciao,
Martin
Hi,
Leider ist es so, das sich die dynamisch hinzugefügten Links nicht mit der jQuery-Funktion
$(document).ready()
vertragen, sprich, ich kann sie darüber nicht ansprechen.
kann es sein, dass du die Funktion $.live() suchst?
Bis die Tage,
Matti
Leider ist es so, das sich die dynamisch hinzugefügten Links nicht mit der jQuery-Funktion
$(document).ready()
vertragen, sprich, ich kann sie darüber nicht ansprechen.kann es sein, dass du die Funktion $.live() suchst?
.live(), .delegate() und .bind() sind deprecated und werden gemeinsam durch on.() ersetzt.
Aber das ist keine wirkliche Lösung.