javascript - 为什么我可以设置任何事件类型字符串来调用 addEventListener 而没有 setTimeout 我会失去我的 css 效果?

标签 javascript css lazy-loading addeventlistener

我正在从 javascript30 开始学习 JavaScript。
现在在第 13 章中,我尝试在这个测试中更改和添加更多功能。

所以我构建了这个页面来尝试使用 css 效果的 lazyload,
当滚动到图像 1/2 高度时,从 <ima data-imglink> 设置 src并添加类来设置css效果。

但有一些奇怪的事情我不知道为什么:

  1. 为什么 addEventListener可以在第一个参数中设置任何内容以调用 imgActive
  2. 为什么我要删除 setTimeout , 只显示没有 css 效果的图像。

你可以看到下面的javascript代码,
如果您知道发生了什么,请告诉我原因,谢谢 :)!

编辑:
在此处添加 CodePen 链接 -> https://codepen.io/Gua/pen/BdKrgv

编辑:
谢谢弗雷德,我知道现在发生了什么,
无法使用 addEventListener 中的参数设置函数像这样:

sliderImage.addEventListener('load', imgActive(sliderImage));

它会让监听失败并立即调用该函数;
这就是为什么我可以在第一个参数中设置任何内容并可以调用 imgActive 的原因.

所以如果想调用一些带参数的函数,最好的方法就是使用匿名函数来做,就像这样:

sliderImage.addEventListener('load', () => {
  imgActive(sliderImage);
})

再次感谢 Fred,我得到了答复,干杯!

原始片段:

const sliderImages = document.querySelectorAll('.slide-in');

function checkSlide() {  
  sliderImages.forEach(sliderImage => {
    const slideInAt = (window.scrollY + window.innerHeight) - (sliderImage.height / 2);
    const imageBottom = sliderImage.offsetTop + sliderImage.height;
    const isHalfShown = slideInAt > sliderImage.offsetTop;
    const isNotScrolledPast = window.scrollY < imageBottom;
    const isActive = sliderImage.classList.contains('active');
    
    if (isHalfShown && isNotScrolledPast && !isActive) {
      const imageLink = sliderImage.dataset.imglink;
      sliderImage.setAttribute('src', imageLink);
      //↓set anything in first argument still can invoke imgActive
      sliderImage.addEventListener('whyyyy ican invoke imgActive??', imgActive(sliderImage));
      //↓ this is what i want to do, when image loaded to invoke imgActive.
      //sliderImage.addEventListener('load', imgActive(sliderImage));
    }
  })
}

function imgActive(sliderImage) {
  //↓ if remove setTimeout, just show image without css effect.
  //  even i just set 1ms for setTimeout function.
  setTimeout(function() {
     sliderImage.classList.add('active');
  }, 1);
  //↓ this is what i want to do, just add class "active".
  //sliderImage.classList.add('active');
}

window.addEventListener('scroll', checkSlide)
html {
    box-sizing: border-box;
    font-family: 'helvetica neue';
    font-size: 20px;
    font-weight: 200;
  }
  body {
    margin: 0;
  }
  *,
  *:before,
  *:after {
    box-sizing: inherit;
  }
  h1 {
    margin-top: 0;
  }
  .site-wrap {
    max-width: 700px;
    margin: 100px auto;
    background: white;
    padding: 40px;
    text-align: justify;
  }
  .align-left {
    float: left;
    margin-right: 20px;
  }
  .align-right {
    float: right;
    margin-left: 20px;
  }
  .slide-in {
    opacity: 0;
    transition: all .5s;
    height:200px;
  }
  .align-left.slide-in {
    transform: translateX(-30%) scale(0.95);
  }
  .align-right.slide-in {
    transform: translateX(30%) scale(0.95);
  }
  .slide-in.active {
    opacity: 1;
    height: unset;
    transform: translateX(0%) scale(1);
  }
<div class="site-wrap">

  <h1>Slide in on Scroll</h1>
  <p>Consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur
    pariaturlores sunt esse magni, ut, dignissimos.</p>
  <p>Lorem ipsum cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni,
    ut, dignissimos.</p>
  <p>Adipisicing elit. Tempore tempora rerum..</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga
    ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga
    ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga
    ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>

  <img src="" data-imglink="http://unsplash.it/400/400" class="align-left slide-in">

  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, deserunt facilis et iste corrupti omnis tenetur est. Iste ut est dicta dolor itaque adipisci, dolorum minima, veritatis earum provident error molestias. Ratione magni illo sint vel
    velit ut excepturi consectetur suscipit, earum modi accusamus voluptatem nostrum, praesentium numquam, reiciendis voluptas sit id quisquam. Consequatur in quis reprehenderit modi perspiciatis necessitatibus saepe, quidem, suscipit iure natus dignissimos
    ipsam, eligendi deleniti accusantium, rerum quibusdam fugit perferendis et optio recusandae sed ratione. Culpa, dolorum reprehenderit harum ab voluptas fuga, nisi eligendi natus maiores illum quas quos et aperiam aut doloremque optio maxime fugiat
    doloribus. Eum dolorum expedita quam, nesciunt</p>

  <img src="" data-imglink="http://unsplash.it/400/401" class="align-right slide-in">

  <p> at provident praesentium atque quas rerum optio dignissimos repudiandae ullam illum quibusdam. Vel ad error quibusdam, illo ex totam placeat. Quos excepturi fuga, molestiae ea quisquam minus, ratione dicta consectetur officia omnis, doloribus voluptatibus?
    Veniam ipsum veritatis architecto, provident quas consequatur doloremque quam quidem earum expedita, ad delectus voluptatum, omnis praesentium nostrum qui aspernatur ea eaque adipisci et cumque ab? Ea voluptatum dolore itaque odio. Eius minima distinctio
    harum, officia ab nihil exercitationem. Tempora rem nemo nam temporibus molestias facilis minus ipsam quam doloribus consequatur debitis nesciunt tempore officiis aperiam quisquam, molestiae voluptates cum, fuga culpa. Distinctio accusamus quibusdam,
    tempore perspiciatis dolorum optio facere consequatur quidem ullam beatae architecto, ipsam sequi officiis dignissimos amet impedit natus necessitatibus tenetur repellendus dolor rem! Dicta dolorem, iure, facilis illo ex nihil ipsa amet officia, optio
    temporibus eum autem odit repellendus nisi. Possimus modi, corrupti error debitis doloribus dicta libero earum, sequi porro ut excepturi nostrum ea voluptatem nihil culpa? Ullam expedita eligendi obcaecati reiciendis velit provident omnis quas qui
    in corrupti est dolore facere ad hic, animi soluta assumenda consequuntur reprehenderit! Voluptate dolor nihil veniam laborum voluptas nisi pariatur sed optio accusantium quam consectetur, corrupti, sequi et consequuntur, excepturi doloremque. Tempore
    quis velit corporis neque fugit non sequi eaque rem hic. Facere, inventore, aspernatur. Accusantium modi atque, asperiores qui nobis soluta cumque suscipit excepturi possimus doloremque odit saepe perferendis temporibus molestiae nostrum voluptatum
    quis id sint quidem nesciunt culpa. Rerum labore dolor beatae blanditiis praesentium explicabo velit optio esse aperiam similique, voluptatem cum, maiores ipsa tempore. Reiciendis sed culpa atque inventore, nam ullam enim expedita consectetur id velit
    iusto alias vitae explicabo nemo neque odio reprehenderit soluta sint eaque. Aperiam, qui ut tenetur, voluptate doloremque officiis dicta quaerat voluptatem rerum natus magni. Eum amet autem dolor ullam.</p>

  <img src="" data-imglink="http://unsplash.it/200/500" class="align-left slide-in">

  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis,
    deserunt et incidunt eveniet <img src="" data-imglink="http://unsplash.it/200/200" class="align-right slide-in"> temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium
    blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non
    dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis
    tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis</p>


  <p>laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex,
    quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat
    ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit
    quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis
    quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.</p>

  <img src="" data-imglink="http://unsplash.it/400/400" class="align-right slide-in">

  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis,
    deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita
    dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus
    aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem
    quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum
    minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum
    aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum
    nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam,
    quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam,
    amet, facere ducimus accusantium eos veritatis neque.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis,
    deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita
    dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus
    aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem
    quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum
    minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum
    aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum
    nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam,
    quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam,
    amet, facere ducimus accusantium eos veritatis neque.</p>
</div>

最佳答案

不需要单独的函数或超时

老实说:我最初不知道为什么 addEventListener()显然正在为其 type 使用随机字符串,但我假设它通过某种机制默认为实际按预期工作的类型。
网络很复杂,有许多备用方法可以防止它每五秒崩溃一次。

但是:

根据 the w3 specifications

addEventListener
...
type of type DOMString
...
No Return Value
No Exceptions

因为我们可以 create and trigger custom events喜欢:

var event = new Event('build'); elem.addEventListener('build', function (e) { ... }, false); elem.dispatchEvent(event);

接口(interface)必须接受任何有效的DOMString我们抛出它(使用 caveats )。

所以,如果它被提供了一个类型,它就不能做任何事情,它什么都不做。


现在;当触发事件监听器时,连接的函数可以是:

  • 定义的函数。
  • 一个匿名函数。

定义的函数可以是:

不带参数调用,事件将自动解析:

addEventListener( "click", definedFunction, false );

带参数调用,但必须在匿名函数中调用:

addEventListener( "click", function( event ) {
  definedFunction( event, some_other_variable );
}, false );

我们绝对做不到(注:见答案结尾):

addEventListener( "click", definedFunction( event, some_other_variable ), false );

尝试在浏览器的控制台中运行下面的一小段代码,您会发现 "click" 事件不起作用,但是每当您运行在body(尝试粘贴>多次输入),foo() 将被调用,您将在控制台中获得输出。

function foo( str ) {
  console.log( str );
}
document.body.addEventListener( "click", foo( "bar" ) );

因此,在您的代码中,每当 "scroll" 上调用 checkSlide() 时,事件监听器未正确设置,并且没有抛出异常,但是 imgActive(sliderImage) 被调用。


你的 setTimeout()需要使所需的幻灯片生效,因为图像不是在 load 时滑入,而是立即未设置监听器,因此直到幻灯片生效后图像才加载完成的;超时作为缓冲区代替等待图像“加载”


所以,这是您的代码,经过一些小的更改,看起来可以按预期工作,但没有没有任何意义的奇怪代码。

const sliderImages = document.querySelectorAll('.slide-in');

function checkSlide() {  
  sliderImages.forEach(sliderImage => {
    const slideInAt = (window.scrollY + window.innerHeight) - (sliderImage.height / 2);
    const imageBottom = sliderImage.offsetTop + sliderImage.height;
    const isHalfShown = slideInAt > sliderImage.offsetTop;
    const isNotScrolledPast = window.scrollY < imageBottom;
    const isActive = sliderImage.classList.contains('active');
    if (isHalfShown && isNotScrolledPast && !isActive) {
      const imageLink = sliderImage.dataset.imglink;
      sliderImage.setAttribute('src', imageLink);
      // new code
      sliderImage.addEventListener('load', () => sliderImage.classList.add('active'));
    }
  })
}

// no need for separate function or timeout

window.addEventListener('scroll', checkSlide);
html {
    box-sizing: border-box;
    font-family: 'helvetica neue';
    font-size: 20px;
    font-weight: 200;
  }
  body {
    margin: 0;
  }
  *,
  *:before,
  *:after {
    box-sizing: inherit;
  }
  h1 {
    margin-top: 0;
  }
  .site-wrap {
    max-width: 700px;
    margin: 100px auto;
    background: white;
    padding: 40px;
    text-align: justify;
  }
  .align-left {
    float: left;
    margin-right: 20px;
  }
  .align-right {
    float: right;
    margin-left: 20px;
  }
  .slide-in {
    opacity: 0;
    transition: all .5s;
    height:200px;
  }
  .align-left.slide-in {
    transform: translateX(-30%) scale(0.95);
  }
  .align-right.slide-in {
    transform: translateX(30%) scale(0.95);
  }
  .slide-in.active {
    opacity: 1;
    height: unset;
    transform: translateX(0%) scale(1);
  }
<div class="site-wrap">

  <h1>Slide in on Scroll</h1>
  <p>Consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur
    pariaturlores sunt esse magni, ut, dignissimos.</p>
  <p>Lorem ipsum cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni,
    ut, dignissimos.</p>
  <p>Adipisicing elit. Tempore tempora rerum..</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga
    ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga
    ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempore tempora rerum, est autem cupiditate, corporis a qui libero ipsum delectus quidem dolor at nulla, adipisci veniam in reiciendis aut asperiores omnis blanditiis quod quas laborum nam! Fuga
    ad tempora in aspernatur pariatur fugit quibusdam dolores sunt esse magni, ut, dignissimos.</p>

  <img src="" data-imglink="http://unsplash.it/400/400" class="align-left slide-in">

  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptates, deserunt facilis et iste corrupti omnis tenetur est. Iste ut est dicta dolor itaque adipisci, dolorum minima, veritatis earum provident error molestias. Ratione magni illo sint vel
    velit ut excepturi consectetur suscipit, earum modi accusamus voluptatem nostrum, praesentium numquam, reiciendis voluptas sit id quisquam. Consequatur in quis reprehenderit modi perspiciatis necessitatibus saepe, quidem, suscipit iure natus dignissimos
    ipsam, eligendi deleniti accusantium, rerum quibusdam fugit perferendis et optio recusandae sed ratione. Culpa, dolorum reprehenderit harum ab voluptas fuga, nisi eligendi natus maiores illum quas quos et aperiam aut doloremque optio maxime fugiat
    doloribus. Eum dolorum expedita quam, nesciunt</p>

  <img src="" data-imglink="http://unsplash.it/400/401" class="align-right slide-in">

  <p> at provident praesentium atque quas rerum optio dignissimos repudiandae ullam illum quibusdam. Vel ad error quibusdam, illo ex totam placeat. Quos excepturi fuga, molestiae ea quisquam minus, ratione dicta consectetur officia omnis, doloribus voluptatibus?
    Veniam ipsum veritatis architecto, provident quas consequatur doloremque quam quidem earum expedita, ad delectus voluptatum, omnis praesentium nostrum qui aspernatur ea eaque adipisci et cumque ab? Ea voluptatum dolore itaque odio. Eius minima distinctio
    harum, officia ab nihil exercitationem. Tempora rem nemo nam temporibus molestias facilis minus ipsam quam doloribus consequatur debitis nesciunt tempore officiis aperiam quisquam, molestiae voluptates cum, fuga culpa. Distinctio accusamus quibusdam,
    tempore perspiciatis dolorum optio facere consequatur quidem ullam beatae architecto, ipsam sequi officiis dignissimos amet impedit natus necessitatibus tenetur repellendus dolor rem! Dicta dolorem, iure, facilis illo ex nihil ipsa amet officia, optio
    temporibus eum autem odit repellendus nisi. Possimus modi, corrupti error debitis doloribus dicta libero earum, sequi porro ut excepturi nostrum ea voluptatem nihil culpa? Ullam expedita eligendi obcaecati reiciendis velit provident omnis quas qui
    in corrupti est dolore facere ad hic, animi soluta assumenda consequuntur reprehenderit! Voluptate dolor nihil veniam laborum voluptas nisi pariatur sed optio accusantium quam consectetur, corrupti, sequi et consequuntur, excepturi doloremque. Tempore
    quis velit corporis neque fugit non sequi eaque rem hic. Facere, inventore, aspernatur. Accusantium modi atque, asperiores qui nobis soluta cumque suscipit excepturi possimus doloremque odit saepe perferendis temporibus molestiae nostrum voluptatum
    quis id sint quidem nesciunt culpa. Rerum labore dolor beatae blanditiis praesentium explicabo velit optio esse aperiam similique, voluptatem cum, maiores ipsa tempore. Reiciendis sed culpa atque inventore, nam ullam enim expedita consectetur id velit
    iusto alias vitae explicabo nemo neque odio reprehenderit soluta sint eaque. Aperiam, qui ut tenetur, voluptate doloremque officiis dicta quaerat voluptatem rerum natus magni. Eum amet autem dolor ullam.</p>

  <img src="" data-imglink="http://unsplash.it/200/500" class="align-left slide-in">

  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis,
    deserunt et incidunt eveniet <img src="" data-imglink="http://unsplash.it/200/200" class="align-right slide-in"> temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium
    blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non
    dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis
    tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis</p>


  <p>laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex,
    quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat
    ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit
    quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam, quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis
    quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam, amet, facere ducimus accusantium eos veritatis neque.</p>

  <img src="" data-imglink="http://unsplash.it/400/400" class="align-right slide-in">

  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis,
    deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita
    dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus
    aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem
    quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum
    minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum
    aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum
    nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam,
    quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam,
    amet, facere ducimus accusantium eos veritatis neque.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Distinctio maiores adipisci quibusdam repudiandae dolor vero placeat esse sit! Quibusdam saepe aperiam explicabo placeat optio, consequuntur nihil voluptatibus expedita quia vero perferendis,
    deserunt et incidunt eveniet temporibus doloremque possimus facilis. Possimus labore, officia dolore! Eaque ratione saepe, alias harum laboriosam deserunt laudantium blanditiis eum explicabo placeat reiciendis labore iste sint. Consectetur expedita
    dignissimos, non quos distinctio, eos rerum facilis eligendi. Asperiores laudantium, rerum ratione consequatur, culpa consectetur possimus atque ab tempore illum non dolor nesciunt. Neque, rerum. A vel non incidunt, quod doloremque dignissimos necessitatibus
    aliquid laboriosam architecto at cupiditate commodi expedita in, quae blanditiis. Deserunt labore sequi, repellat laboriosam est, doloremque culpa reiciendis tempore excepturi. Enim nostrum fugit itaque vel corporis ullam sed tenetur ipsa qui rem
    quam error sint, libero. Laboriosam rem, ratione. Autem blanditiis laborum neque repudiandae quam, cumque, voluptate veritatis itaque, placeat veniam ad nisi. Expedita, laborum reprehenderit ratione soluta velit natus, odit mollitia. Corporis rerum
    minima fugiat in nostrum. Assumenda natus cupiditate hic quidem ex, quas, amet ipsum esse dolore facilis beatae maxime qui inventore, iste? Maiores dignissimos dolore culpa debitis voluptatem harum, excepturi enim reiciendis, tempora ab ipsam illum
    aspernatur quasi qui porro saepe iure sunt eligendi tenetur quaerat ducimus quas sequi omnis aperiam suscipit! Molestiae obcaecati officiis quo, ratione eveniet, provident pariatur. Veniam quasi expedita distinctio, itaque molestiae sequi, dolorum
    nisi repellendus quia facilis iusto dignissimos nam? Tenetur fugit quos autem nihil, perspiciatis expedita enim tempore, alias ab maiores quis necessitatibus distinctio molestias eum, quidem. Delectus impedit quidem laborum, fugit vel neque quo, ipsam,
    quasi aspernatur quas odio nihil? Veniam amet reiciendis blanditiis quis reprehenderit repudiandae neque, ab ducimus, odit excepturi voluptate saepe ipsam. Voluptatem eum error voluptas porro officiis, amet! Molestias, fugit, ut! Tempore non magnam,
    amet, facere ducimus accusantium eos veritatis neque.</p>
</div>

一般兴趣

我冒昧地修改了您的 JavaScript 代码以引入一些优化:

  • load 监听器在初始化时应用于所有 .slide-in 图像。
  • load 监听器现在在使用后立即删除。
  • scroll 现在只检查 nextImage 是否准备好滑入。
  • 简化数学运算,因为在加载图像之前,它没有高度,因此唯一可用的高度 是CSS 中设置的计算依据。由于这是一个硬编码值,因此每次触发 scroll 时计算它的一半是没有意义的。
  • 删除了很多测量。
document.querySelectorAll( '.slide-in' ).forEach( sliderImage => {
  sliderImage.addEventListener( 'load', function slide() {
    this.classList.add( 'active' );
    this.removeEventListener( 'load', slide );
  } );
} );

window.addEventListener( 'scroll', () => {
  const nextImage = document.querySelector( '.slide-in:not(.active)' );
  if ( nextImage && ( window.scrollY + window.innerHeight - 100 ) > nextImage.offsetTop ) {
      nextImage.src = nextImage.dataset.imglink;
  }
} );

我也在想(在遛狗的时候)我的声明:

We absolutely cannot do:
 
addEventListener( "click", definedFunction( event, some_other_variable ), false );

好吧,实际上我们可以,而且有时它可能非常有用。
下面演示了我们如何使用此功能有条件地改变我们的监听器的功能。
是的,这是一个有点傻的例子,但原理值得记住。

var some_value = "baz",
    who_are_you,
    youre_happy,
    you_know_it;

function foo( fnc ) {
  document.body.removeEventListener( "click", who_are_you );
  return {
    bar: function() {
      console.log( "Divide by zero; it's fun!" );
      some_value = undefined;
      doStuff();
    },
    baz: function() {
      console.log( "Always include every library you've ever heard of." );
      document.body.removeEventListener( "click", who_are_you );
    }
  }[ fnc ] || function() {
    console.log( "Phew! It's a good job we had a fallback." );
    some_value = "baz";
    doStuff();
  };
}

function doStuff() {
  if ( youre_happy && you_know_it ) {
    document.body.addEventListener( "click", who_are_you = foo( some_value ) );
  } else {
    some_value = "bar";
    youre_happy = you_know_it = true;
    doStuff();
  }
}

doStuff();
body {
  width: 100vw;
  height: 100vh;
  margin: 0;
}

关于javascript - 为什么我可以设置任何事件类型字符串来调用 addEventListener 而没有 setTimeout 我会失去我的 css 效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45428662/

相关文章:

javascript - 如何在jquery中选择ul的li元素?

ios - 减少解析 Collection View 中的加载时间

javascript - AngularJS:延迟加载 Controller 和内容

html - 如何让下拉菜单工作并将导航栏保持在顶部?

.net - NHibernate:无法成功设置延迟加载

javascript - 如何在javascript中选择所有复选框?

javascript - jQuery:从对象数据创建数组

javascript - VSt上带有Node.js的“Error: Failed to detect OS”

twitter-bootstrap - 如何制作对 Angular 线div

css - 页面滚动时在 IE7 上出现问题。文本不正确