Как функция элемента узла не запускается автоматически при создании таблицы в javascript? - PullRequest
1 голос
/ 11 марта 2020

Я создаю серию таблиц на основе массива javascript и столкнулся с серьезной проблемой.

Это мой шаг реализации, я нажал " show top gundam " кнопка для создания таблицы с помощью функции " createTable ". Затем я нажму кнопку " удалить ", чтобы удалить таблицу, которая мне не нравится.

Проблема в том, что она полностью запустила имя функции " removeDiv " of " Кнопка удалить"автоматически, когда я нажал кнопку" show top gundam", чтобы создать таблицу. Моя идея состоит в том, что каждый раз, когда я нажимаю кнопку удаления, он будет основываться на параметре "id" каждого div, чтобы удалить его.

Есть ли способ, чтобы он не запускался автоматически, а запускался только при нажатии кнопка удаления?

  <body onload="convertXmlToJavaScriptObject()">
    <div style="margin-left: 10px;margin-top: 20px">
        <form action="DispatcherController">
            <input name="btAction" value="Crawl data" type="submit" class="btn-dark" id="crawl" onclick="showLoader()" />
            <input name="btAction" value="Clear all record" type="submit" class="btn-dark" onclick="setZero()" />
            <input name="btAction" value="Show Top Gundam" class="btn-dark" onclick="creatTable()"/>
            <div class="loader" style="margin-top: 10px;display: none" id="loader"></div>
        </form>
        <button class="btn-dark" onclick="">Create table</button>

        <!--Nếu như xóa thành công thì hiện chữ-->
        <c:if test="${requestScope.DELETE>0 or requestScope.DELETE==0}">
            <font style="color: blue" id="del"><p><h5>Xóa thành công</h5></p></font>
            </c:if>
    <!--<input type="submit" value="Click me" class="btn-dark" id="crawl" onclick="showLoader()"/>-->

    <c:set var="gundam" value="${requestScope.FULLLIST}" />


    <!--Mới mở trang lên thì nó sẽ show có tổng cộng có bao nhiêu record-->

    <!--Đây là số record sau khi crawl xong-->
    <c:set var="crawlrecord" value="${requestScope.COUNT}"/>

    <!--Đây là số rerord còn ở trong DB-->
    <c:set var="couting" value="${applicationScope['COUNTRECORD']}"/>

    <div style="margin-top: 20px">
        Tổng số record cào về <p id="record" style="font-weight: bold">${crawlrecord}</p>

    </div> 
    <div><p style="text-align: center">----------------Gundam-------------------</p></div>

    <c:forEach items="${applicationScope.TESTTOP}" var="item">
        <!--                        <div style="width: 600px">
                                    <table style="margin-bottom: 10px;width: 100%">
                                        <tr>
                                            <th style="width: 30%"><img src="${item.avatar}" width="150px"></th>
                                            <th style="width: 70%">
                                                <p>${item.name}<br/>${item.price}<br/>${item.type}</p>
                                                <p><button>Add</button><button style="margin-left: 10px">Remove</button></p>
                                            </th>
                                        </tr>
                                    </table>
                                </div>-->
    </c:forEach>




    <script>
        var array = [];//Tạo 1 array để lưu những gundam object đc chuyển từ hàm convertXmlToJavaScriptObject, thuận tiện cho việc thêm, xóa, sửa

        //        Hàm này có tổng cộng chức năng như sau
        //        1 là nó sẽ show cái loader khi đang crawl
        //        2 là nó sẽ tắt cái chữ delete
        //        3 là nó show số record sau khi crawl xong
        function showLoader() {
            var deleted = document.getElementById("del");
            var x = document.getElementById('loader');
            //Nếu như có danh sách rồi thì tắt cái loader và xóa đi cái chữ "xóa thành công rồi nếu nó có đang hiện"
            //khi nhấn vào nút crawl thì cái loader sẽ hiện
            if (x.style.display === "none") {
                x.style.display = "block";
        <c:set var="couting" value="${requestScope.COUNT}"/>
                document.getElementById("record").innerHTML = "${couting}";
            }
        }
        ;
        //Xóa hết record thì hiện là zero
        function setZero() {
            document.getElementById("record").innerHTML = "0";
            var show = document.getElementById("del");
            if (show.style.display === "none") {
                show.style.display = "block";
            }
        }

        /*
         * Hàm này dùng để convert xml thành javascript object
         * Đã thành công

         * @returns {undefined}             */
        function convertXmlToJavaScriptObject() {

            //Chuyển String thành DOM
            var xmlString = '${applicationScope.TOP}';
            var xmlDOc;

            var paser = new DOMParser();
            var xml = paser.parseFromString(xmlString, "text/xml");


            var path = "/items/item";
            var nodes = xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null);
            var result = nodes.iterateNext();//Duyệt từng node đã có đc từ xpath
            while (result) {
                var item = {
                    id: "",
                    name: "",
                    price: "",
                    avatar: "",
                    link: "",
                    type: "",
                    firstDateAppearance: "",
                    numberOfTimeClicked: ""
                };
                item.name = result.getElementsByTagName("name")[0].childNodes[0].nodeValue;//Vì bây h current node là item nên chỉ có duy nhất 1 name node, ta viết thế này sẽ dễ lấy
                item.id = result.getElementsByTagName("id")[0].childNodes[0].nodeValue;
                item.price = result.getElementsByTagName("price")[0].childNodes[0].nodeValue;
                item.avatar = result.getElementsByTagName("avatar")[0].childNodes[0].nodeValue;
                item.link = result.getElementsByTagName("link")[0].childNodes[0].nodeValue;
                item.firstDateAppearance = result.getElementsByTagName("firstDateAppearance")[0].childNodes[0].nodeValue;
                console.log(item.firstDateAppearance);
                item.numberOfTimeClicked = result.getElementsByTagName("numberOfTimeClicked")[0].childNodes[0].nodeValue;

                array.push(item);

                //Đi tới node tiếp theo sau khi duyệt ở node hiện tại
                //Giống như thầy Khánh nói, khi duyệt node thì luôn phải bắt đầu ở ndoe mới 
                result = nodes.iterateNext();
            }
            console.log(array.length);
            for (i = 0; i < array.length; i++) {
                console.log(array[i].name);
            }
        }



        /**
         * functin này sẽ tạo ra 1 cái table
         */
        function creatTable() {
            for (i = 0; i < array.length; i++) {
                //tạo 1 object chứa function


                var body = document.getElementsByTagName('body')[0];
                var div = document.createElement('div');
                div.setAttribute('id', array[i].id);
                div.style.width = "600px";

                //tạo cái table
                var table = document.createElement('table');
                table.style.marginBottom = "10px";
                table.style.width = "100%";
                var tr = document.createElement('tr');


                var firstTh = document.createElement("th");
                firstTh.style.width = "30%";
                var img = document.createElement('img');
                img.setAttribute('width', '150px');
                img.setAttribute('src', array[i].avatar);
                firstTh.appendChild(img);


                //Cái th thứ 2
                var secontTh = document.createElement('th');
                secontTh.style.width = "70%";

                var pFirst = document.createElement('p');
                pFirst.appendChild(document.createTextNode(array[i].name));//Lấy name
                var br = document.createElement('br');
                pFirst.appendChild(br);

                pFirst.appendChild(document.createTextNode(array[i].price));//lấy giá
                var br = document.createElement('br');
                pFirst.appendChild(br);

                pFirst.appendChild(document.createTextNode(array[i].type));//lấy type

                //node p thứ 2
                var pSecond = document.createElement('p');
                var add = document.createElement('button');
                add.setAttribute('class', 'btn-success');
                add.innerHTML = "Add";

                var remove = document.createElement('button');
                remove.innerHTML = "Remove";
                remove.setAttribute('class', 'btn-danger');
                var idNode = array[i].id;
                remove.onclick = function () {
                    removeDiv(idNode)
                };
                remove.style.marginLeft = "10px";

                //tạo ra node id
                var infoId = document.createElement("idnode");
                infoId.appendChild(document.createTextNode(array[i].id));
                infoId.style.display = "none";
                pSecond.appendChild(add);
                pSecond.appendChild(remove);

                //add 2 cái p vào cái th thứ 2
                secontTh.appendChild(pFirst);
                secontTh.appendChild(pSecond);

                tr.appendChild(firstTh);
                tr.appendChild(secontTh);
                table.appendChild(tr);
                div.appendChild(table);
                div.appendChild(infoId);
                body.appendChild(div);
            }

        }

        function tableCreate() {
            var body = document.getElementsByTagName('body')[0];
            var tbl = document.createElement('table');
            tbl.style.width = '100%';
            tbl.setAttribute('border', '1');
            var tbdy = document.createElement('tbody');
            for (var i = 0; i < 3; i++) {
                var tr = document.createElement('tr');
                for (var j = 0; j < 2; j++) {
                    if (i == 2 && j == 1) {
                        break
                    } else {
                        var td = document.createElement('td');
                        td.appendChild(document.createTextNode('\u0020'))
                        i == 1 && j == 1 ? td.setAttribute('rowSpan', '2') : null;
                        tr.appendChild(td)
                    }
                }
                tbdy.appendChild(tr);
            }
            tbl.appendChild(tbdy);
            body.appendChild(tbl)
        }




        /**
         * Hàm này dùng để test gửi xmlHttpRequest về để nhận data mà ko cần load trang
         * Đã thành công
         * @returns {undefined}
         */
        function testing() {
            var xmlHttp = new XMLHttpRequest();
            var url = "GetTheTopIDServlet?name=sam";
            var xmlDom;
            xmlHttp.onreadystatechange = function () {
                if (this.readyState == 4 && this.status == 200) {

                    xmlDom = xmlHttp.responseXML;//responseXML là dữ liệu thuộc kiểu XML
                    if (xmlDom != null) {
                        var x = xmlDom.getElementsByTagName("name");
                        console.log(x.length)
                        for (var i = 0; i < x.length; i++) {
                            console.log("Day la value= " + x[i].childNodes[0].nodeValue);
                        }
                    } else {
                        console.log("null bỏ mẹ rùi");
                    }

                }
            };
            xmlHttp.open("GET", url, true);
            xmlHttp.send(null);//Bắt đầu gửi request đi
        }
    </script>
    <script>
        /**
         * Hàm này sẽ remove table mà ta chọn dựa trên id
         * @param {type} id
         * @returns {undefined}
         */
        function removeDiv() {
            console.log("hehe");
        }
    </script>

Обновить обновление

 var idNode = array[i].id;
    remove.onclick = function () {
     removeDiv(idNode)
  };

Мне удалось поймать событие отдельно, но новая проблема заключается в том, что вместо получения правильного идентификатора каждой таблицы, он всегда выбирает последний идентификатор, сгенерированный из массива объектов.

1 Ответ

1 голос
/ 11 марта 2020

remove.onclick устанавливается равным возвращаемому значению выполнения removeDiv ('()' после removeDiv), которое, вероятно, не определено. Поэтому, когда кнопка нажата, javascript пытается выполнить undefined, что просто не имеет смысла.

Вместо этого она должна быть установлена ​​для самой функции ... т.е.

    remove.onclick = removeDiv

Вы также можете обернуть removeDiv в анонимную функцию, если вам нужно передать ей аргументы.

    remove.onclick = function() {
        removeDiv(idNode)
    }
    // OR using ES6 arrow function syntax
    remove.onclick = () => removeDiv(idNode);

Попробуйте!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...