在 codepen 上全屏查看时无法更新从 API 获取的数据

Cannot update data fetched from an API when viewing on full screen on codepen

可能我正在处理一个错误,但请看一下! 这是我的 pen.

但是当我更改为完整页面视图时,该功能无法正常工作。 一切正常,但全名标题不正常!

也许有什么想法?

        .then(
        (data) => {
            img.src = data.picture.large
            image_title.innerHTML = data.name.first
            name.innerHTML = `${ data.name.title } ${ data.name.first } ${ data.name.last }`
            sex.innerHTML = ` ${ data.gender }` 
            if(data.gender === 'male') {
                console.log('boy')
                container.style.background = "#20232A"
            }else {
                console.log('girl')
                container.style.background = "#009688";
            }
            age.innerHTML = ` ${ data.dob.age }`
            city.innerHTML = ` ${ data.location.city }`
            post.innerHTML = ` ${ data.location.postcode }`
            state.innerHTML = ` ${ data.location.state }`
            country.innerHTML = ` ${ data.nat }`
            email.innerHTML = ` ${ data.email }`
        }
    )

好的简单修复: https://codepen.io/geoidesic/full/EdRvGR/

将 'full-name' 更改为 'fullname'。不知道为什么(请参阅 Pointy 的评论)但很容易解决。

    <h1 class="title">Random User Generator</h1>
    <hr>

    <div id="content" class="container">
        <div class="container--info">
            <div id="imgContainer" class="container--info-imgContainer">
                <div class="image">
                    <img id="image" src="https://am3pap002files.storage.live.com/y4pWy8i6R2SB4wYy260mAfz0bItbMHzhUBps0ip7YWPD-gdqYRVbcANXyN68L_j3mnDBLeYEAHTaD83MDocM42zlZq8PkUYG0sYL7fDzK9_nCOAmsCs9nylgyN-TjYyGEqulmG2SYITb0VQ_v9_fbsXbEYdobbp3hsGQZz2GLfowMkdWg97yga-i13mzZi_K5Xf/20180912_172044.jpg?psid=1&width=1528&height=1890" alt="">
                    <div id="image-title" class="image-title toCapital">Evangelos</div>
                </div>
            </div>
            <div class="container--info-details">
                <div id="infos" class="container--info-details--inner">
                        <h2 id="fullname" class="container--info-details--inner-header toCapital">evangelos kolimitras</h2>
                        <div class="container--info-details--inner-gender toCapital">Sex: <span id="sex">Male</span></div>
                        <div class="container--info-details--inner-age">Age: <span id="age">26</span></div>
                        <div class="container--info-details--inner-location">
                            <div class="container--info-details--inner-location--city toCapital">City: <span id="city">fellbach</span></div>
                            <div class="container--info-details--inner-location--postcode ">Post Code: <span id="post">70734</span></div>
                            <div class="container--info-details--inner-location--state toCapital">State: <span id="state">baden würrtemberg</span></div>
                            <div class="container--info-details--inner-location--country toCapital">Nationality: <span id="country">de</span></div>
                        </div>
                        <div class="container--info-details--email">Email: <span id="email">evan@kol.de</span></div>
                </div>
            </div>
        </div>
        <div class="container--button">
            <div class="container--button-inner">
                <button class="btn" id="btn">Generate User</button>
            </div>
        </div>
    </div>



const url = 'https://randomuser.me/api/';

const container = document.querySelector('#content');
const button = document.querySelector('#btn');

/* Constants responsible for retrieving DOM elements from the Image Section */
const imgContent = document.querySelector('#imgContainer');
const img = imgContent.querySelector('#image');
const image_title = imgContent.querySelector('#image-title');

/* Variables responsible for retrieving DOM elements from the Infos Section*/
const infos = document.querySelector('#infos');
const name = infos.querySelector('#fullname');
const sex = infos.querySelector('#sex');
const age = infos.querySelector('#age');
const city = infos.querySelector('#city');
const post = infos.querySelector('#post');
const state = infos.querySelector('#state');
const country = infos.querySelector('#country');
const email = infos.querySelector('#email');



button.addEventListener(
    'click',
    () => {
        fetch(url)
        .then(handleErrors)
        .then( r => r.json() )
        .then(
            (res) => {
                const data = res.results[0];
                console.log(data);
                return data;
            }
        )

        /* DOM MANIPULATION */

        .then(
            (data) => {
                img.src = data.picture.large
                image_title.innerHTML = data.name.first
                full_name.innerHTML = `${ data.name.title } ${ data.name.first } ${ data.name.last }`
                sex.innerHTML = ` ${ data.gender }` 
                if(data.gender === 'male') {
                    console.log('boy')
                    container.style.background = "#20232A"
                }else {
                    console.log('girl')
                    container.style.background = "#009688";
                }
                age.innerHTML = ` ${ data.dob.age }`
                city.innerHTML = ` ${ data.location.city }`
                post.innerHTML = ` ${ data.location.postcode }`
                state.innerHTML = ` ${ data.location.state }`
                country.innerHTML = ` ${ data.nat }`
                email.innerHTML = ` ${ data.email }`
            }
        )

        .catch( (error) => { console.log(error) } )


        function handleErrors(response)  {
            if(!response.ok) {
                throw Error(response.status);
            };
            return response;
        }
    }
);

问题是您在全局范围内声明了很多变量,特别是其中一个名为 "name"。符号 "name" 已作为 window 的名称绑定到 window 对象。声明

const name = infos.querySelector("#full-name");

不按照人们的想法去做。看起来应该将变量 name 绑定到 <h2> 元素;事实上,它所做的是将 window 名称设置为字符串“[object HTMLHeadingElement]”(可能因浏览器而异)。

在我看来,修复它的最佳方法是通过将所有代码包装在虚拟 IIFE 中来净化所有代码。添加

(function() {

在现有的第一行和

之前
})();

在最后一行之后,它起作用了,因为所有代码现在都在一个新的私有范围内,没有任何内容与 window 属性冲突。如果您将变量从 "name" 更改为 "xname" 或任何其他不与内置浏览器符号冲突的变量,它也会起作用。

为什么它在 Codepen "Editor" 视图中有效?我不知道 "deep" 的答案,但在编辑器视图中,您的笔创建的页面隐藏在 <iframe> 元素中。现在 <iframe> 元素确实有一个 "name" 属性,但神秘的是,您的 name 常量的声明允许隐藏它。在 "Full screen" 视图中,您的页面是实际的顶级 window,在这种情况下 window.name 不会允许自己被隐藏。