【问题标题】:Keep Javascript constant the same after function is recalled调用函数后保持 Javascript 不变
【发布时间】:2015-10-16 16:11:25
【问题描述】:

我正在尝试创建一个动态列表,因此当用户执行搜索时,它将重新填充该列表。问题是我似乎无法创建一个不可变的常量来存储原始 div 内容。每次调用函数 get 时,此变量都会重新初始化。

有没有办法在不使用 cookie 的情况下实现这一点?真诚感谢任何帮助。代码不完整,因为我无法通过此步骤,但如果您认为我完全朝着错误的方向前进,请告诉我。

const originalList = document.getElementById('patientList').getElementsByTagName('li'); freeze = Object.freeze(originalList);

  <script>
    const originalList = document.getElementById('patientList').getElementsByTagName('li');
    frozen = Object.freeze(originalList);
    var newList = '';
    var found = false;
    function filterPatients(){
        var searchQuery = document.getElementById('search');
        var query = searchQuery.value;
        var listContainer = document.getElementById('patientList');
        var patientList = listContainer.getElementsByTagName('li');
        for (var i = 0; i < originalList.length; i++){
            var link = patientList[i].getElementsByTagName('a');
            var link = link[0].text;
            /** remove whitespaces for easy comparison **/
            link = link.toLowerCase();
            query = query.toLowerCase();
            link = link.replace(/\s/g, "");
            query = query.replace(/\s/g, "");

            /** check every character in query **/
                if (link.length > query.length && link.substring(0,query.length) == query){
                    found = true;
                    newList += '<li>' + patientList[i].innerHTML + '</li>';
                }
        }
        if (found == true){
            listContainer.innerHTML = newList;
            newList = '';
        }
        else{
            listContainer.innerHTML = "<li>No patient by that name</li>";
        }
        console.log(frozen);

    }

</script>

【问题讨论】:

  • 您在哪个浏览器中运行此代码?
  • @Daniel Granger,我在 firefox、chrome 和 safari 上测试了代码,结果都一样。

标签: javascript global-variables constants dynamic-list


【解决方案1】:
const originalList = document.getElementById('patientList').getElementsByTagName('li').cloneNode(true);

使 originalList 成为元素的副本。目前,您将 originalList 和 patientList 设置为相同的元素列表,因此更改一个也会更改另一个。使用 element.cloneNode(true) 对 DOM 元素进行深拷贝

【讨论】:

  • 谢谢,我会试试这个选项并告诉你。我通过在 html 中创建一个重复列表并将样式设置为隐藏来解决它。我知道这两种选择都不是最佳选择,但你的肯定更好。
  • 我猜你不能直接调用cloneNode。不得不这样做。 const orignalContainer = document.getElementById('patientList').cloneNode(true); const originalList = orignalContainer.getElementsByTagName('li');
猜你喜欢
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 2021-12-31
  • 2015-07-30
  • 2019-10-25
  • 1970-01-01
相关资源
最近更新 更多