【问题标题】:Infinite loop with recursive javascript functions带有递归 javascript 函数的无限循环
【发布时间】:2017-03-15 19:47:58
【问题描述】:

我正在为一名摄影师做后台工作,照片将保存在带有子类别的相册中。
我在专辑创建页面中使用 JavaScript 添加一个新的 .photo 块(及其 HTML 内容)。
问题是我显然使用函数 albums.addPhoto 获得了无限循环.这是我的 JS 代码(albums.addPhotoonclick 属性调用并调用albums.createBlock):

    var albums =  {
    createBlock: function (tag, attributes, text, elemID, elemCLASS) {
        var block = document.createElement(tag);
        switch (tag) {
            case "label":
            block.setAttribute('for', attributes[0]);
            break;
            case "input":
            block.setAttribute('type', attributes[0]);
            block.setAttribute('name', attributes[1]);
            if (attributes[0] == "text") {
                block.setAttribute('placeholder', attributes[2]);
            } else {
                block.setAttribute('value', attributes[2]);
            }
            break;
            default:

        }

        if (text) {
            block.textContent = text;
        }
        if (elemID) {
            block.id = elemID;
        }
        if (elemCLASS) {
            block.classList.add(elemCLASS);
        }

        return block;
    },
    addPhoto: function (currentSsCat, requiredPhotoID) {
        var elem = albums.createBlock("div", null, false, ("photo_" + currentSsCat + "_" + requiredPhotoID), "photo");
        document.querySelector('#ss_cat_1').appendChild(elem);

        elem.appendChild(albums.createBlock("label", ["file_" + currentSsCat + "_" + requiredPhotoID], "Importez le fichier photo", false, false));
        elem.appendChild(albums.createBlock("input", ["file", ("file_" + currentSsCat + "_" + requiredPhotoID), "Votre photo"], false, false, false));
        elem.appendChild(albums.createBlock("label", ["ref_" + currentSsCat + "_" + requiredPhotoID], "Référence de la photo", false, false));
        elem.appendChild(albums.createBlock("input", ["text", ("ref_" + currentSsCat + "_" + requiredPhotoID), "Exemple: 20160811_CLS_0005"], false, false, false));
        elem.appendChild(albums.createBlock("label", ["desc_" + currentSsCat + "_" + requiredPhotoID], "Description de la photo", false, false));
        elem.appendChild(albums.createBlock("input", ["text", ("desc_" + currentSsCat + "_" + requiredPhotoID), "Exemple: Paolo FABBRI et Lenas Drawin His Gun (ITA)."], false, false, false));

        document.querySelector("#add_photo_" + currentSsCat).onclick = albums.addPhoto(currentSsCat, (requiredPhotoID + 1));
    }
};

然后你有 HTML 部分(我只给你form 部分,我可以发送整个页面但我认为它没有用):

<form action="index.html?page=aa" method="post">
<!-- SOUS CATEGORIE -->
        <div class="ss_cat" id="ss_cat_1">
            <label for="ss_cat_1_titre">Titre :</label>
            <input type="text" name="ss_cat_1_titre" placeholder="Titre de la sous-catégorie...">

            <!-- PHOTOS DE LA CATEGORIE -->
            <div class="photo" id="photo_1_1">
                <label for="file_1_1">Importez le fichier photo :</label>
                <input type="file" name="file_1_1" value="Votre photo">
                <label for="ref_1_1">Référence de la photo :</label>
                <input type="text" name="ref_1_1" placeholder="Exemple: 20160811_CLS_0005">
                <label for="desc_1_1">Description de la photo :</label>
                <input type="text" name="desc_1_1" placeholder="Exemple: Paolo FABBRI et Lenas Drawin His Gun (ITA).">
            </div>
        </div>


        <!-- This is the link calling the function albums.addPhoto -->
        <a href="#" class="btn" id="add_photo_1" onclick="albums.addPhoto(1, 2)">Ajouter une photo</a>
    </div>
    <a href="#" class="btn" id="add_ss_cat">Ajouter un sous-catégorie</a>
    <input type="submit" name="submit" value="Ajouter le nouvel album">
</form>

测试:该函数完成了它的工作,但有一个无限循环(浏览器崩溃或询问我是否要停止脚本,这表明已创建大量 .photo 块)。
Chrome 上,我收到消息 maximum call stack size exceeded,在 Firefox 上,我收到 too much recursion

PS:这是我第一次尝试创建后台,如果您对替代方法有任何建议,请随时提出。感谢您的阅读和帮助。

【问题讨论】:

    标签: javascript php html oop recursion


    【解决方案1】:

    这是你的问题:

     document.querySelector("#add_photo_" + currentSsCat).onclick = albums.addPhoto(currentSsCat, (requiredPhotoID + 1));
    

    您在albums.addPhoto 内无条件地调用albums.addPhoto,因此存在无限递归。你可能想要这个:

    document.querySelector("#add_photo_" + currentSsCat).onclick = function () { albums.addPhoto(currentSsCat, (requiredPhotoID + 1)); };
    

    这样你将 onclick 处理程序设置为一个函数,而不是函数的结果(这是未定义的,无论如何也没有意义),它只在有点击事件时运行。

    【讨论】:

    • 感谢它完美运行!我在这个项目中遇到了很多问题,我不知道问题的根源是什么。
    • @QuangdaoNguyen 抱歉,我不知道。我做到了,谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2020-04-01
    • 2021-12-06
    相关资源
    最近更新 更多