{"id":25217,"date":"2024-02-27T17:51:42","date_gmt":"2024-02-27T08:51:42","guid":{"rendered":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25217"},"modified":"2024-02-27T17:51:44","modified_gmt":"2024-02-27T08:51:44","slug":"jquery-todo%e3%83%aa%e3%82%b9%e3%83%88","status":"publish","type":"post","link":"http:\/\/www.tyosuke20xx.com\/blog\/?p=25217","title":{"rendered":"JQuery Todo\u30ea\u30b9\u30c8"},"content":{"rendered":"\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\r\n&lt;html lang=\"ja\">\r\n&lt;head>\r\n    &lt;meta charset=\"UTF-8\">\r\n    &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    &lt;title>Todo \u30ea\u30b9\u30c8&lt;\/title>\r\n    &lt;style>\r\n        body {\r\n            font-family: Arial, sans-serif;\r\n            background-color: #f4f4f4;\r\n            margin: 0;\r\n            padding: 0;\r\n        }\r\n        h1 {\r\n            text-align: center;\r\n            color: #333;\r\n        }\r\n        .container {\r\n            max-width: 600px;\r\n            margin: 20px auto;\r\n            background-color: #fff;\r\n            border-radius: 5px;\r\n            padding: 20px;\r\n            box-shadow: 0 2px 5px rgba(0,0,0,0.1);\r\n        }\r\n        input&#91;type=\"text\"] {\r\n            width: 70%;\r\n            padding: 10px;\r\n            border: 1px solid #ccc;\r\n            border-radius: 5px;\r\n            font-size: 16px;\r\n        }\r\n        button {\r\n            padding: 10px 20px;\r\n            background-color: #4caf50;\r\n            border: none;\r\n            color: #fff;\r\n            cursor: pointer;\r\n            border-radius: 5px;\r\n            font-size: 16px;\r\n        }\r\n        button:hover {\r\n            background-color: #45a049;\r\n        }\r\n        ul {\r\n            list-style-type: none;\r\n            padding: 0;\r\n        }\r\n        li {\r\n            padding: 10px;\r\n            border-bottom: 1px solid #ccc;\r\n            transition: background-color 0.3s;\r\n            cursor: pointer;\r\n        }\r\n        li:hover {\r\n            background-color: #f9f9f9;\r\n        }\r\n        .completed {\r\n            text-decoration: line-through;\r\n            color: #888;\r\n        }\r\n        .remove {\r\n            float: right;\r\n            color: #f44336;\r\n            font-weight: bold;\r\n        }\r\n        .remove:hover {\r\n            color: #d32f2f;\r\n        }\r\n    &lt;\/style>\r\n&lt;\/head>\r\n&lt;body>\r\n    &lt;div class=\"container\">\r\n        &lt;h1>Todo \u30ea\u30b9\u30c8&lt;\/h1>\r\n        &lt;input type=\"text\" id=\"todoInput\" placeholder=\"Todo\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\" autofocus>\r\n        &lt;button id=\"addButton\">\u8ffd\u52a0&lt;\/button>\r\n        &lt;ul id=\"todoList\">\r\n        &lt;\/ul>\r\n        &lt;button id=\"clearCompleted\">\u5b8c\u4e86\u6e08\u307f\u3092\u524a\u9664&lt;\/button>\r\n    &lt;\/div>\r\n\r\n    &lt;script src=\"https:\/\/code.jquery.com\/jquery-3.6.0.min.js\">&lt;\/script>\r\n    &lt;script>\r\n        $(document).ready(function(){\r\n            \/\/ Todo\u8ffd\u52a0\u51e6\u7406\r\n            $(\"#addButton\").click(function(){\r\n                addTodo();\r\n            });\r\n\r\n            \/\/ Enter\u30ad\u30fc\u3067Todo\u8ffd\u52a0\r\n            $(\"#todoInput\").keypress(function(event){\r\n                if(event.which === 13) { \/\/ Enter\u30ad\u30fc\u306e\u30ad\u30fc\u30b3\u30fc\u30c9\u306f13\r\n                    addTodo();\r\n                }\r\n            });\r\n\r\n            \/\/ Todo\u5b8c\u4e86\u51e6\u7406\r\n            $(document).on(\"click\", \"li\", function(){\r\n                $(this).toggleClass(\"completed\");\r\n            });\r\n\r\n            \/\/ Todo\u524a\u9664\u51e6\u7406\r\n            $(document).on(\"click\", \".remove\", function(event){\r\n                event.stopPropagation(); \/\/ \u89aa\u8981\u7d20\u3078\u306e\u30a4\u30d9\u30f3\u30c8\u4f1d\u64ad\u3092\u505c\u6b62\r\n                $(this).parent().remove();\r\n            });\r\n\r\n            \/\/ \u5b8c\u4e86\u6e08\u307fTodo\u3092\u4e00\u62ec\u524a\u9664\r\n            $(\"#clearCompleted\").click(function(){\r\n                $(\".completed\").remove();\r\n            });\r\n\r\n            \/\/ Todo\u8ffd\u52a0\u95a2\u6570\r\n            function addTodo() {\r\n                var todoItem = $(\"#todoInput\").val().trim();\r\n                if(todoItem !== \"\") {\r\n                    $(\"#todoList\").append(\"&lt;li>\" + todoItem + \"&lt;span class='remove'>&#91;x]&lt;\/span>&lt;\/li>\");\r\n                    $(\"#todoInput\").val(\"\"); \/\/ \u5165\u529b\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u30af\u30ea\u30a2\r\n                    $(\"#todoInput\").focus(); \/\/ \u30d5\u30a9\u30fc\u30ab\u30b9\u3092\u5165\u529b\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u623b\u3059\r\n                }\r\n            }\r\n        });\r\n    &lt;\/script>\r\n&lt;\/body>\r\n&lt;\/html>\r\n<\/code><\/pre>\n\n\n\n<p>main.js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>'use strict';\r\n\r\n$(document).ready(() => {\r\n    const $input = $('input');\r\n    const $list = $('ul');\r\n    const $clearCompleted = $('#clearCompleted');\r\n    const todos = JSON.parse(localStorage.getItem('todos')) || &#91;];\r\n\r\n    \/\/ \u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u304b\u3089Todo\u30a2\u30a4\u30c6\u30e0\u3092\u53d6\u5f97\u3057\u3001\u8868\u793a\u3059\u308b\r\n    todos.forEach(todo => {\r\n        addTodoToList(todo.text, todo.completed);\r\n    });\r\n\r\n    $input.focus();\r\n\r\n    $('#addButton').click(() => {\r\n        const todoText = $input.val().trim();\r\n        if (todoText !== '' &amp;&amp; !isDuplicate(todoText)) {\r\n            addTodoToList(todoText, false);\r\n            saveTodos();\r\n            $input.val('').focus();\r\n        }\r\n    });\r\n\r\n    \/\/ Enter\u30ad\u30fc\u3067Todo\u8ffd\u52a0\r\n    $input.keypress((event) => {\r\n        if (event.which === 13) { \/\/ Enter\u30ad\u30fc\u306e\u30ad\u30fc\u30b3\u30fc\u30c9\u306f13\r\n            $('#addButton').click();\r\n        }\r\n    });\r\n\r\n    \/\/ Todo\u30a2\u30a4\u30c6\u30e0\u306e\u5b8c\u4e86\/\u672a\u5b8c\u4e86\u306e\u5207\u308a\u66ff\u3048\r\n    $list.on('click', 'li', (e) => {\r\n        const $target = $(e.target);\r\n        if (!$target.hasClass('remove')) {\r\n            const $todoItem = $target.closest('li');\r\n            $todoItem.toggleClass('completed');\r\n            updateCompletedCount();\r\n            saveTodos();\r\n        }\r\n    });\r\n\r\n    \/\/ \u5b8c\u4e86\u6e08\u307fTodo\u30a2\u30a4\u30c6\u30e0\u306e\u524a\u9664\r\n    $clearCompleted.click(() => {\r\n        $list.find('.completed').remove();\r\n        updateCompletedCount();\r\n        saveTodos();\r\n    });\r\n\r\n    \/\/ Todo\u30a2\u30a4\u30c6\u30e0\u3092\u30ea\u30b9\u30c8\u306b\u8ffd\u52a0\u3059\u308b\u95a2\u6570\r\n    function addTodoToList(text, completed) {\r\n        const $todoItem = $('&lt;li>').text(text);\r\n        if (completed) {\r\n            $todoItem.addClass('completed');\r\n        }\r\n        $todoItem.append('&lt;span class=\"remove\">&#91;x]&lt;\/span>').appendTo($list);\r\n        updateCompletedCount();\r\n    }\r\n\r\n    \/\/ Todo\u30a2\u30a4\u30c6\u30e0\u3092\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4fdd\u5b58\u3059\u308b\u95a2\u6570\r\n    function saveTodos() {\r\n        const todos = &#91;];\r\n        $list.find('li').each((index, todo) => {\r\n            todos.push({\r\n                text: $(todo).text(),\r\n                completed: $(todo).hasClass('completed')\r\n            });\r\n        });\r\n        localStorage.setItem('todos', JSON.stringify(todos));\r\n    }\r\n\r\n    \/\/ \u91cd\u8907\u3059\u308bTodo\u30a2\u30a4\u30c6\u30e0\u3092\u30c1\u30a7\u30c3\u30af\u3059\u308b\u95a2\u6570\r\n    function isDuplicate(text) {\r\n        return $list.find('li').filter((index, todo) => $(todo).text() === text).length > 0;\r\n    }\r\n\r\n    \/\/ \u5b8c\u4e86\u6e08\u307f\u30a2\u30a4\u30c6\u30e0\u306e\u6570\u3092\u66f4\u65b0\u3059\u308b\u95a2\u6570\r\n    function updateCompletedCount() {\r\n        const completedCount = $list.find('.completed').length;\r\n        $clearCompleted.text(`\u5b8c\u4e86\u6e08\u307f\u30a2\u30a4\u30c6\u30e0\u3092\u524a\u9664 (${completedCount})`);\r\n        if (completedCount === 0) {\r\n            $clearCompleted.hide();\r\n        } else {\r\n            $clearCompleted.show();\r\n        }\r\n    }\r\n});\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>main.js<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[8,4],"tags":[125,3],"class_list":["post-25217","post","type-post","status-publish","format-standard","hentry","category-jquery","category-programming","tag-jquery","tag-programming"],"aioseo_notices":[],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25217","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=25217"}],"version-history":[{"count":1,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25217\/revisions"}],"predecessor-version":[{"id":25218,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/25217\/revisions\/25218"}],"wp:attachment":[{"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=25217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=25217"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.tyosuke20xx.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=25217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}