<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Forum Pasja Informatyki - Najnowsze z tagiem multi-page-application</title>
<link>https://forum.pasja-informatyki.pl/tag/multi-page-application</link>
<description>Powered by Question2Answer</description>
<item>
<title>Odpowiednik obiektów na stronie ‘www’ generowanej dynamicznie — dla stron generowanych statycznie</title>
<link>https://forum.pasja-informatyki.pl/594343/odpowiednik-obiektow-stronie-generowanej-dynamicznie-generowanych-statycznie</link>
<description>

&lt;p&gt;Niedawno jako eksperyment utworzyłem projekt ‟js-dom”. Jest to generator strony ‘www’ funkcjonalnie wzorowany na cudzym projekcie. Idea jest, by tworzyć klasy&amp;nbsp;JavaScript obsługujące każdorazowo ·obiekt&amp;nbsp;na stronie ‘www’· nie mający&amp;nbsp;prostego odwzorowania w jakimś elemencie ‘html’ (np. “DIV”), ale klasa&amp;nbsp;generuje&amp;nbsp;fragment dokumentu ‘html’ dla bieżącego stanu obiektu.&lt;/p&gt;



&lt;p&gt;Na przykład dla obiektu ‛lista przycisków‘ napisałem następującą klasę w JavaScript:&lt;/p&gt;



&lt;pre class=&quot;brush:jscript;&quot;&gt;
class H_js_dom_E_object_Q_button_list
{   constructor( direction
    , class_name
    , content
    , object_function
    , null_function
    ){  this.direction = direction;
        this.class_name = class_name;
        this.content = content;
        this.object_function = object_function;
        this.null_function = null_function;
        this.button_path = [];
    }
    async html(
    ){  const html_list = document.createElement( &quot;DIV&quot; );
        html_list.className = this.class_name;
        html_list.style.display = &quot;flex&quot;;
        html_list.style.flexDirection = this.direction;
        let content = this.content;
        for( const i of this.button_path )
            content = content[i].click;
        let i = 0;
        for( const item of content )
        {   const html_item = document.createElement( &quot;BUTTON&quot; );
            html_item.append( item.text );
            if( typeof item.click === &quot;function&quot; )
                html_item.addEventListener( &quot;click&quot;, item.click );
            else if( item.click === null )
                html_item.addEventListener( &quot;click&quot;, ((i) =&amp;gt;
                  {   return async () =&amp;gt;
                      {   await this.null_function( this, i );
                      };
                  })(i)
                );
            else if( typeof item.click === &quot;object&quot; )
            {   html_item.addEventListener( &quot;click&quot;, ((i) =&amp;gt;
                  {   return async () =&amp;gt;
                      {   this.button_path.push(i);
                          await this.object_function(this);
                      };
                  })(i)
                );
            }
            html_list.append( html_item );
            i++;
        }
        if( this.button_path.length )
        {   const html_item = document.createElement( &quot;BUTTON&quot; );
            html_item.append( &quot;back&quot; );
            html_item.addEventListener( &quot;click&quot;, async () =&amp;gt;
              {   this.button_path.pop();
                  await this.object_function(this);
              }
            );
            html_list.append( html_item );
        }
        return html_list;
    }
}&lt;/pre&gt;



&lt;p&gt;Teraz wystarczy utworzyć w dokumencie ‘html’ obiekt na przykład ‛nawigacja’:&lt;/p&gt;



&lt;pre class=&quot;brush:jscript;&quot;&gt;
class H_js_dom_E_object_Q_nav
{   constructor(
    ){  const Z_text_N_filename = (text) =&amp;gt;
        {   return text.replaceAll( &quot; &quot;, &quot;_&quot; ).replace( /[^_0-9a-z-]/gi, &quot;&quot; ).replace( /_{2,}/g, &quot;_&quot; );
        };
        this.objects =
        [ new H_js_dom_E_object_Q_button_list( &quot;column&quot;, &quot;H_js_dom_E_object_Q_button_list&quot;
          , [ { text: &quot;Button 1&quot;
              , click: null
              }
            , { text: &quot;Button 2&quot;
              , click:
                [ { text: &quot;Button 1&quot;
                  , click: null
                  }
                , { text: &quot;Button 2&quot;
                  , click: null
                  }
                , { text: &quot;Button 3&quot;
                  , click: null
                  }
                ]
              }
            , { text: &quot;Button 3&quot;
              , click:
                [ { text: &quot;Button 1&quot;
                  , click: null
                  }
                , { text: &quot;Button 2&quot;
                  , click:
                    [ { text: &quot;Button 1&quot;
                      , click: null
                      }
                    , { text: &quot;Button 2&quot;
                      , click: null
                      }
                    , { text: &quot;Button 3&quot;
                      , click: null
                      }
                    , { text: &quot;Button 4&quot;
                      , click: null
                      }
                    ]
                  }
                ]
              }
            , { text: &quot;Button 4&quot;
              , click: async () =&amp;gt;
                {
                }
              }
            , { text: &quot;Button 5&quot;
              , click: null
              }
            , { text: &quot;Button 6&quot;
              , click: null
              }
            , { text: &quot;Button 7&quot;
              , click: async () =&amp;gt;
                {
                }
              }
            ]
          , async (this_) =&amp;gt;
            {   let s = &quot;&quot;;
                let content = this_.content;
                for( const i of this_.button_path )
                {   s += &quot;/&quot;+ Z_text_N_filename( content[i].text );
                    content = content[i].click;
                }
                s += &quot;/&quot;+ Z_text_N_filename( content[0].text );
                await H_js_dom_E_object_Q_app_S.P_main( s.substring(1) );
            }
          , async ( this_
            , i
            ) =&amp;gt;
            {   let s = &quot;&quot;;
                let content = this_.content;
                for( const i of this_.button_path )
                {   s += &quot;/&quot;+ Z_text_N_filename( content[i].text );
                    content = content[i].click;
                }
                s += &quot;/&quot;+ Z_text_N_filename( content[i].text );
                await H_js_dom_E_object_Q_app_S.P_main( s.substring(1) );
            }
          )
        , new H_js_dom_E_object_Q_label( &quot;29 05 2024&quot;, &quot;H_js_dom_E_object_Q_nav_S_creation_date&quot; )
        ];
    }
    async html(
    ){  const html_e = document.createElement( &quot;DIV&quot; );
        html_e.id = &quot;H_js_dom_E_object_Q_nav&quot;;
        for( const object of this.objects )
            html_e.append( await object.html() );
        return html_e;
    }
}
&lt;/pre&gt;



&lt;p&gt;I dzięki procedurze&lt;/p&gt;



&lt;pre class=&quot;brush:jscript;&quot;&gt;
async function H_js_dom_E_html_I_overwrite(
){  const html_f = await H_js_dom_E_object_Q_app_S.html()
    document.body.innerHTML = &quot;&quot;;
    document.body.append( html_f );
}&lt;/pre&gt;



&lt;p&gt;która wywołuje na drzewie (kompozycji) klas JavaScript metodę “html()”, jest utworzona lista przycisków nawigacji.&lt;/p&gt;



&lt;p&gt;Ta lista po kliknięciu przycisku, który ma swoje podmenu, zmienia się w listę przycisków tego podmenu, a po kliknięciu “back” zmienia się w listę przycisków “menu” nadrzędnego. (Jest dowolna głębokość możliwych podmenu.)&lt;/p&gt;



&lt;p&gt;⁂&lt;/p&gt;



&lt;p&gt;Ten projekt nadaje się do tworzenia aplikacji na pojedynczej stronie ‘www’. Natomiast dotychczas tworzyłem własną witrynę ‘www’ samodzielnie napisanym generatorem stron statycznych, który opiera się o szablony XSL biorące też&amp;nbsp;dane (gdy potrzeba) z plików XML.&lt;/p&gt;



&lt;p&gt;Takie szablony XSL w porównaniu do projektu ‟js-dom” i jego obiektu listy przycisków nawigacji — generują pojedynczy stan nawigacji (konkretne menu z konkretnym wybranym bieżącym przyciskiem).&lt;/p&gt;



&lt;p&gt;Jak natomiast w przypadku stron generowanych statycznie (na przykład z użyciem&amp;nbsp;szablonów XSL) napisać w jednym miejscu obsługę obiektu takiej nawigacji, który miałby swoje odrębne wynikowe postacie ‘html’ we&amp;nbsp;fragmencie&amp;nbsp;·odrębnych· plików stron ‘www’?&lt;/p&gt;



&lt;p&gt;Myślałem wstępnie, by jakoś wstawiać ten obiekt do plików XSL i go wykonywać. Ale jak to zrobić? Poza tym mam do dyspozycji języki skryptowe dostępne w systemie Linux, których używam częściowo przy budowie witryny ‘www’.&lt;/p&gt;



&lt;p&gt;Projekt ten nie został nigdzie opublikowany, by podać adres pełnych źródeł koniecznych do jego uruchomienia, ale jakoś funkcjonująca aplikacja ‘www’ znajduje się tymczasowo &lt;a href=&quot;https://overcq.ct8.pl/js-dom/sRWD.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;tutaj&lt;/a&gt;. Trzeba pamiętać, że jest to uproszczona kopia wizualna cudzej witryny, z innym zestawem kolorów i formatowaniem tekstu.&lt;/p&gt;



&lt;p&gt;⁂&lt;/p&gt;



&lt;p&gt;ChatGPT mi częściowo pomógł.&lt;/p&gt;



&lt;p&gt;Można tworzyć definicje obiektów na stronie ‘www’ — w plikach ‘xsl’ i włączać je do plików ‘xsl’ stron ‘www’. Natomiast trzeba używać parametru “state”, którym może być nazwa pliku ‘xsl’ strony ‘www’.&lt;/p&gt;</description>
<category>Inne języki</category>
<guid isPermaLink="true">https://forum.pasja-informatyki.pl/594343/odpowiednik-obiektow-stronie-generowanej-dynamicznie-generowanych-statycznie</guid>
<pubDate>Mon, 03 Jun 2024 15:36:44 +0000</pubDate>
</item>
</channel>
</rss>