{"id":573,"date":"2015-05-10T22:29:41","date_gmt":"2015-05-10T20:29:41","guid":{"rendered":"http:\/\/florianko.de\/blog\/?p=573"},"modified":"2015-05-10T22:29:41","modified_gmt":"2015-05-10T20:29:41","slug":"dynamischer-content-in-statischen-seiten","status":"publish","type":"post","link":"http:\/\/florianko.de\/blog\/2015\/05\/10\/dynamischer-content-in-statischen-seiten\/","title":{"rendered":"Dynamischer Content in statischen Seiten"},"content":{"rendered":"<p>Da hab ich schon lange nichts mehr ver\u00f6ffentlicht, und dann ist der erste neue Beitrag auch noch so etwas banales wie dieser kleine Schnipsel aus der Praxis&#8230; Die L\u00f6sung des Problems, das mich seit einiger Zeit umgetrieben hat, wollte ich aber nicht f\u00fcr mich behalten.<\/p>\n<p>Folgende Problemstellung: Gegeben ist eine Website, deren Inhalte in weiten Teilen vorgegeben ist. Es handelt sich im weitesten Sinne um eine Landingpage, eine \u00dcbersichtsseite, die auf weitere Inhalte hinweisen und auf diese verlinken soll. So weit, so statisch. Auf dieser Seite soll aber ein Bereich aktuelle Neuigkeiten anzeigen. Und das m\u00f6glichst ohne jedesmal das HTML direkt bearbeiten zu m\u00fcssen. Jetzt k\u00f6nnte man nat\u00fcrlich an so etwas wie <a href=\"http:\/\/wiki.selfhtml.org\/wiki\/HTML\/Multimedia_und_Grafiken\/Aktive_Inhalte_einbindenframe\" title=\"iframes bei SelfHTML.org\" target=\"_blank\" rel=\"noopener\">iFrames<\/a> denken oder daran, dass man mit dem <code>.load()<\/code>-Befehl externe <code>.html<\/code>-Dateien einbinden k\u00f6nnte. Damit m\u00fcsste man sich aber nach wie vor mit l\u00e4stigem html-gecode herumschlagen. Eigentlich, so dachte ich, m\u00fcsste sich das doch auch mit <a href=\"https:\/\/jquery.com\" title=\"\" target=\"_blank\" rel=\"noopener\">jQuery<\/a> l\u00f6sen lassen und da ich dar\u00fcber hinaus gro\u00dfer Markdown-Fan ((F\u00fcr alle, die bislang nichts mit Markdown zu tun hatten: Es handelt sich hierbei um eine Auszeichnungssprache, die die Arbeit mit HTML &#8211; und mit anderen Formaten &#8211; deutlich erleichtert, da sie eine auch f\u00fcr Laien verst\u00e4ndliche Syntax aufweist. Au\u00dferdem handelt es sich um nichts anderes als einfache Textdateien, die schnell und einfach auch von Mobilger\u00e4ten aus synchronisiert werden k\u00f6nnen, ohne gro\u00dfe Datenmengen herumschieben zu m\u00fcssen.)) geworden bin, lag es nahe, als Quelle <code>.md<\/code>-Dateien einzubinden und diese parsen zu lassen, sodass am Ende ohne gro\u00dfen Aufwand eine wohlformatierte Infobox steht.<\/p>\n<p><!--more Weiterlesen &rarr;--><\/p>\n<h3>Umsetzung<\/h3>\n<p>Wohlan denn, frisch ans Werk. Als einfaches Grundger\u00fcst sieht die gesamte Implementierung so aus:<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;!DOCTYPE html&gt;\n&lt;html lang=\"de\"&gt;\n  &lt;head&gt;\n    &lt;meta charset=\"utf-8\"&gt;\n    &lt;title&gt;Testseite&lt;\/title&gt;\n\n    &lt;!-- Einbindung jQuery --&gt;\n    &lt;script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.11.2\/jquery.min.js\"&gt;&lt;\/script&gt;\n\n    &lt;!-- Einbindung marked --&gt;\n    &lt;script src=\"scripts\/marked.js\"&gt;&lt;\/script&gt;\n    \n    &lt;!-- Eigentliches Script --&gt;\n    &lt;script type=\"text\/javascript\"&gt; \n        \n        var inhalt;\n        $.get('news.md', function (data) {\n            inhalt = data;\n        }, 'text');\n\n        $(function () {\n            document.getElementById('content').innerHTML = marked(inhalt);\n        });  \n    &lt;\/script&gt; \n    \n  &lt;\/head&gt;\n  &lt;body&gt;\n  \n    &lt;!-- Das div-Element, das den Inhalt darstellen soll --&gt;\n    &lt;div id=\"content\"&gt;\n    \n    &lt;\/div&gt;\n  \n  &lt;\/bod&gt;\n &lt;\/html&gt;<\/pre>\n<p>Betrachten wird den Code Schritt f\u00fcr Schritt:<br \/>\nIn das Grundger\u00fcst der Seite sind im <code>head<\/code>-Bereich die relevanten Skripte (<code>jQuery<\/code> und <code>marked<\/code>) eingebunden; bei <a href=\"https:\/\/github.com\/chjj\/marked\/\" title=\"marked bei GitHub\" target=\"_blank\" rel=\"noopener\"><code>marked<\/code><\/a> handelt es sich dabei um einen Markdown-Parser, der lokal im Ordner <code>scripts<\/code> gespeichert ist:<\/p>\n<pre class=\"lang:xhtml decode:true \" >&lt;script src=\"https:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.11.2\/jquery.min.js\"&gt;&lt;\/script&gt;\n \n&lt;script src=\"scripts\/marked.js\"&gt;&lt;\/script&gt;<\/pre>\n<p>In dem eigentlichen Skript wird zun\u00e4chst eine Variable <code>inhalt<\/code> initialisiert, welche dann mit dem Inhalt der externen Datei <code>news.md<\/code> gef\u00fcllt wird:<\/p>\n<pre class=\"lang:xhtml decode:true \" >var inhalt;\n$.get('news.md', function (data) {\n     inhalt = data;\n}, 'text');<\/pre>\n<p>Dem im <code>body<\/code>-Bereich des Dokumentes platzierten Element mit der ID <code>content<\/code> m\u00fcssen wir anschlie\u00dfend nur noch den Inhalt der Variable \u00fcbergeben:<\/p>\n<pre class=\"lang:xhtml decode:true \" >$(function () {\n     document.getElementById('content').innerHTML = marked(inhalt);\n});<\/pre>\n<p>Fertig. Jetzt sollte der Inhalt der <code>.md<\/code>-Datei korrekt formatiert angezeigt werden. Zum lokalen Testen sollte man allerdings Firefox verwenden, da Chrome die Einbindung lokaler Dateien anders handhabt. Wird die Seite von einem Server geladen, zeigt nat\u00fcrlich auch Chrome den Inhalt korrekt an.<\/p>\n<h3>Weiterf\u00fchrende \u00dcberlegungen<\/h3>\n<p>Anstatt nur ein einziges Element dynamisch erzeugen zu lassen, k\u00f6nnte man je nach Anwendungsbereich durchaus dar\u00fcber nachdenken, mehrere <code>div<\/code>-Container dynamisch bef\u00fcllen zu lassen. Auf diese Weise lie\u00dfen sich etwa verschiedene Arten von Listen &#8211; ich denke etwa an Publikationslisten im akademischen Rahmen &#8211; oder andere Inhalte bequem auf einer Homepage verwalten ohne gleich ins Grundger\u00fcst eingreifen zu m\u00fcssen. Wird der Inhalt nicht unentwegt mehr, sodass die Seite immer l\u00e4nger werden w\u00fcrde, wie es etwa bei Blogs der Fall w\u00e4re, k\u00f6nnte man diese Methode als eine Art minimales CMS einsetzen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Da hab ich schon lange nichts mehr ver\u00f6ffentlicht, und dann ist der erste neue Beitrag auch noch so etwas banales wie dieser kleine Schnipsel aus der Praxis&#8230; Die L\u00f6sung des Problems, das mich seit einiger Zeit umgetrieben hat, wollte ich aber nicht f\u00fcr mich behalten. Folgende Problemstellung: Gegeben ist eine Website, deren Inhalte in weiten [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,11],"tags":[72,83,103],"class_list":["post-573","post","type-post","status-publish","format-standard","hentry","category-technik-it","category-web-webdesign","tag-html","tag-jquery","tag-markdown","post-preview"],"_links":{"self":[{"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/posts\/573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/comments?post=573"}],"version-history":[{"count":0,"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/posts\/573\/revisions"}],"wp:attachment":[{"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/media?parent=573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/categories?post=573"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/florianko.de\/blog\/wp-json\/wp\/v2\/tags?post=573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}