Skip to content

pardnchiu/PDExtension-js

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PDExtension (JavaScript Library)

PDExtension contains a lightweight front-end framework designed to separate the front-end user interface and data logic.
Improving code maintainability and readability while reducing development complexity.

Info

  • Separation of UI and Data Logic:

    Segregates front-end presentation from data logic, creating a clearer structure and simplifying maintenance tasks.

  • Reduction of Repetitive Code:

    Provides tools and utilities to minimize repetitive code sections, improving code conciseness.

  • Improved Code Readability:

    Modular design enhances code readability, making it easier to understand and collaborate on.

  • Data Change Monitoring:

    Automatically updates the user interface in real-time based on data changes, reducing manual DOM manipulation steps.

  • Automatic Rendering:

    Reduces manual DOM manipulation, allowing you to focus more on the core logic of your application.

  • Lightweight:

    Lightweight in nature, minimizing unnecessary complexity and providing greater flexibility, allowing you to use it freely without framework constraints.

Example

Interface

Include

<script src="PDExtension.min.js" copyright="Pardn Ltd"></script>

$dom

tag description
{{value}} Insert text into HTML tag and update the value based on data changes.
:path Load HTML fragments from external files into the current page.
:html Replace innerHTML of an element with text.
:for Iterate through a data collection and generate corresponding HTML elements for repetitive data display.
Supports item in items, (item, index) in items, (key, value) in object.
:if
:else-if
:else
Show or hide elements based on specified conditions, adding multiple options for implementing branching logic.
:model Bind data to form elements (e.g., input), automatically updating the data when input changes.
:[attr] Set element attributes such as ID, class, image source, etc.
For example: :id/:class/:src/:alt/:href...
@[event] Add event listeners to execute specified actions when events are triggered.
For example: @click/@input/@mousedown...
:@[event] Set event handlers for individual elements within a loop, allowing different event handling for each element.

Auto Rendering: Load auto-rendering and automatically render data changes after detection.

  • :path / :html

    Make sure to disable local file restrictions in your browser or use a live server when you are testing ':path'.

    test.html

    <h1>path heading</h1>
    <p>path content</p>

    index.html

    <body id="app">
        <section :path="./test.html"></section>
        <section :html="html"></section>
    </body>
    <script>
        const app = new $dom({
            id: "app",
            data: {
                html: "<b>innerHtml</b>"
            }
        });
    </script>
    • Result

      <body id="app">
          <h1>path heading</h1>
          <p>path content</p>
          <section>
              <b>innerHtml</b>
          </section>
      </body>
  • :for

    <body id="app">
        <ul>
            <li :for="(item, index) in ary" :id="item" :index="index">{{ item }} {{ index + 1 }}</li>
        </ul>
    </body>
    <script>
        const app = new $dom({
            id: "app",
            data: {
                ary: ["test1", "test2", "test3"]
            }
        });
    </script>
    • Result

      <body id="app">
          <li id="test1" index="0">test1 1</li>
          <li id="test2" index="1">test1 2</li>
          <li id="test3" index="2">test1 3</li>
      </body>
  • :for (Multiple)

    <body id="app">
    <ul>
        <li :for="(key, val) in obj">
            {{ key }}: {{ val.name }}
            <ul>
                <li :for="item in val.ary">
                    {{ item.name }}
                    <ul>
                        <li :for="(item1, index1) in item.ary1">
                            {{ index1 + 1 }}. {{ item1.name }} - {{ item1.price }}元
                        </li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
    </body>
    <script>
        const app = new $dom({
            id: "app",
            data: {
                obj: {
                    food: {
                        name: "食品",
                        ary: [
                            {
                                name: '零食',
                                ary1: [
                                    { name: '薯片', price: 10 },
                                    { name: '巧克力', price: 8 }
                                ]
                            },
                            {
                                name: '飲料',
                                ary1: [
                                    { name: '果汁', price: 5 },
                                    { name: '茶', price: 3 }
                                ]
                            }
                        ]
                    },
                    home: {
                        name: '家居',
                        ary: [
                            {
                                name: '家具',
                                ary1: [
                                    { name: '沙發', price: 300 },
                                    { name: '桌子', price: 150 }
                                ]
                            },
                            {
                                name: '裝飾',
                                ary1: [
                                    { name: '畫框', price: 20 },
                                    { name: '花瓶', price: 15 }
                                ]
                            }
                        ]
                    }
                }
            }
        });
    </script>
    • Result

      <body id="app">
      <ul>
          <li>food: 食品
              <ul>
                  <li>零食
                     <ul>
                          <li>1. 薯片 - 10元</li>
                          <li>2. 巧克力 - 8元</li>
                      </ul>
                      </li>
                  <li>飲料
                      <ul>
                          <li>1. 果汁 - 5元</li>
                          <li>2. 茶 - 3元</li>
                      </ul>
                  </li>
              </ul>
          </li>
          <li>home: 家居
              <ul>
                  <li>家具
                      <ul>
                          <li>1. 沙發 - 300元</li>
                          <li>2. 桌子 - 150元</li>
                      </ul>
                  </li>
                  <li>裝飾
                      <ul>
                          <li>1. 畫框 - 20元</li>
                          <li>2. 花瓶 - 15元</li>
                      </ul>
                  </li>
              </ul>
          </li>
      </ul>
      </body>
  • :if

    <body id="app">
        <h1 :if="heading == 1">{{ title }} {{ heading }}</h1>
        <h2 :else-if="isH2">{{ title }} {{ heading }}</h2>
        <h3 :else-if="heading == 3">{{ title }} {{ heading }}</h3>
        <h4 :else>{{ title }} {{ heading }}</h4>
    </body>
    <script>
        const app = new $dom({
            id: "app",
            data: {
                heading: [Number|null],
                isH2: [Boolean|null],
                title: "test"
            }
        });
    </script>
    • heading = 1

      <body id="app">
          <h1>test 1</h1>
      </body>
    • heading = null
      isH2 = true

      <body id="app">
          <h2>test </h2>
      </body>
    • heading = 3
      isH2 = null

      <body id="app">
          <h3>test 3</h3>
      </body>
    • heading = null
      isH2 = null

      <body id="app">
          <h4>test </h4>
      </body>
  • @event

    <body id="app">
        <button @click="test">test</button>
    </body>
    <script>
        const app = new $dom({
            id: "app",
            event: {
                test: function(){
                    console.log(this);
                }
            }
        });
    </script>
  • Rendering completed

    <body id="app"></body>
    <script>
        const app = new $dom({
            id: "app",
            next: function () {
                console.log("Rendering completed");
            }
        });
    </script>

Element Extension

let section = document.createElement("section");
section.id = "#test";
document.body.appendChild(section);

let button = document.createElement("button");
button.style.width = "10rem";
button.style.height = "2rem";
button.style.backgroundColor = "steelblue";
button.style.color = "fff";
button.onclick = function(){
    alert("test")
};
button.innerHTML = "<span>test</span> button";
section.appendChild(button);

let svg = document.createElement("span");
span.classList.add("svg");
span.setAttribute("path", "https://xxxxxx");
section.appendChild(span);

let img = document.createElement("img");
img.classList.add("lazyload");
img.dataset.src = "https://xxxxxx";
section.appendChild(img);

let input = document.createElement("input");
input.placeholder = "輸入你的內容";
input.type = "email";
section.appendChild(input);
document.body._child(
    "section#test"._([
        "button"._({
            style: {
                width: "10rem",
                hright: "2rem",
                backgroundColor: "steelblue",
                color: "#fff"
            }
        })._click(function(){
            alert("test")
        }, [
            // or "<span>test</span> button"
            "span"._("test"),
            " button"
        ]),
        "span.svg:._({ path: "https://xxxxxx" }),
        // 無 Lazy Loading => "img"._("https://xxxxxx"),
        "img"._({ lazyload: "https://xxxxxx" }),
        "input@email 輸入你的內容"._()
    ])
);

// 添加 SVG Listener, 轉換 span.svg 至 svg 標籤
_SVGListener();

// 添加 Lazy Listener, Lazy Loading 圖片
_LazyListener();

Get Element

document.getElementById("test");
document.querySelector("div.test");
document.querySelectorAll("div.test");
document.querySelector("input[name='test']");
"#test".$;
"div.test".$;
"div.test".$all;
"input[name='test']".$;

Add Element

<div class="test" style="width: 5rem; height: 80px;" test="test">
    <button>
        <img src="https://xxxxxx">
    </button>
</div>
"div.test"._({
    style: {
        width: "5rem",
        height: 80,
    },
    test: "test"
}, [
    "button"._([
        "img"._("https://xxxxxx")
    ])
]);

©️ 2023 Pardn Chiu

Releases

No releases published

Packages

No packages published