【问题标题】:Scrolling div must be scrolled to bottom before you can check a checkbox滚动 div 必须滚动到底部才能选中复选框
【发布时间】:2017-07-18 16:50:46
【问题描述】:

我有一个包含免责声明的 div,我想确保有人已经滚动到免责声明的底部,然后才能选中确认您已阅读免责声明的复选框。法务部 这是一个示例标记:

<div id="step2Disclaimer" style="height:50px;overflow-y:scroll">
    <p class="l-twelve l-mb1 t-base t-left">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate temporibus commodi sapiente culpa sunt iure veniam harum impedit architecto dolorem quam facilis, odio blanditiis beatae similique non voluptatibus at dolorum?</p>
    <p class="l-twelve l-mb1 t-base t-left">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate temporibus commodi sapiente culpa sunt iure veniam harum impedit architecto dolorem quam facilis, odio blanditiis beatae similique non voluptatibus at dolorum?</p>                             
</div>

<input type="checkbox" id="acknowledge" name="acknowledge" value="true">
<label class="styled" for="acknowledge">I acknowledge</label>

当有人像这样滚动到#acknowledge 的底部时,我可以检测到:

$('#step2Disclaimer').on('scroll', function() {
    if($(this).scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight) {
    alert('end reached');
    }
});

我需要做的并且不知何故缺少的是更改“确认”检查以查看是否有人滚动。条件不起作用->澄清一下,如果有人选中“确认”复选框并且没有滚动到“step2Disclaimer”的底部,我需要运行一个函数。

$(function() {
    $('input[name="acknowledge"]').change(function(){
        if ($(this).is(':checked') && ($('#step2Disclaimer').scrollTop() + $(this).innerHeight() >= $(this)[0].scrollHeight)) {
            alert('checked but not scrolled');
        }
    });
});

【问题讨论】:

  • 我可以为你提供一个这样的例子。它将利用被称为出现的 jQuery 库。我刚刚做了一个最终被废弃的项目,但我对滚动的了解比我应该的要多。游戏公司暴雪通常会在允许您玩他们的游戏之前执行此操作。
  • 请做,将不胜感激。当你选中该框时,我需要检查 div 的滚动位置。
  • 不,暴雪所做的(您应该将其纳入最佳实践)是禁用复选框直到用户滚动到协议底部。

标签: jquery css checkbox scroll onchange


【解决方案1】:

首先,您使用的是this,它以复选框为目标,而不是div。其次,您需要检查scrollTop 加上innerHeight 是否比scrollHeight 更小,而不是更大。以下应该有效:

$(function() {
    $('input[name="acknowledge"]').change(function(){
        if ($(this).is(':checked') && ($('#step2Disclaimer').scrollTop() + $('#step2Disclaimer').innerHeight() < $('#step2Disclaimer')[0].scrollHeight)) {
            alert('checked but not scrolled');
        }
    });
});

Working Fiddle

【讨论】:

  • 我得到的结果相同。如果您选中该框并且不滚动,它不会触发警报。但是,如果您一直向下滚动(根据需要)并选中该框,则会触发警报。
  • @DirtyBirdDesign 抱歉,忘了说第二个问题。我编辑了我的答案。它现在应该可以工作了。
  • 太棒了,谢谢雅克。我没有正确定位滚动 div。
  • 没问题,很高兴我能帮上忙。
【解决方案2】:

我无法利用 jQuery.appear 和 append.js,因为这些库隐式处理 DOM 视口而不是元素视口。因此,这里的代码将禁止复选框,直到用户手动滚动浏览协议的内容(最底部)。

HTML

<div id="step2Disclaimer">
    <p class="l-twelve l-mb1 t-base t-left">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate temporibus commodi sapiente culpa sunt iure veniam harum impedit architecto dolorem quam facilis, odio blanditiis beatae similique non voluptatibus at dolorum?</p>
    <p class="l-twelve l-mb1 t-base t-left">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate temporibus commodi sapiente culpa sunt iure veniam harum impedit architecto dolorem quam facilis, odio blanditiis beatae similique non voluptatibus at dolorum?</p>
    <div class='agreement_read'>?</div>
</div>

<input class='unread' type="checkbox" id="acknowledge" name="acknowledge" value="true" disabled>
<label class="styled unread" for="acknowledge">I acknowledge</label>

CSS

#step2Disclaimer {
    width: 315px;
    border: solid 1px #ACE;
    margin-bottom: 15px;
    height: 115px;
    overflow-y: scroll;
    font-family: arial;
    font-size: 1rem;
    padding: 3px;
}

.unread {
    cursor: not-allowed;
    border: dashed 1px red;
    padding: 3px;
    color: #CCC;
}

.fully_read {
    border: solid 1px green;
    padding: 3px;
}

JavaScript

var master_agreement = document.getElementById('step2Disclaimer');

jQuery(master_agreement).scroll(function(e) {
    if (isScrolledToBottom(master_agreement) && jQuery('.unread').length) {
        jQuery('.unread').removeClass('unread').addClass('fully_read');
        jQuery('#acknowledge').prop('disabled', false);
    }
});

//Chris Martin of StackOverflow - https://stackoverflow.com/a/32283147/5076162
function isScrolledToBottom(el) {
    var $el = $(el);
    return el.scrollHeight - $el.scrollTop() - $el.outerHeight() < 1;
}

var master_agreement = document.getElementById('step2Disclaimer');

jQuery(master_agreement).scroll(function(e) {
    if (isScrolledToBottom(master_agreement) && jQuery('.unread').length) {
        jQuery('.unread').removeClass('unread').addClass('fully_read');
        jQuery('#acknowledge').prop('disabled', false);
    }
});

//Chris Martin of StackOverflow - https://stackoverflow.com/a/32283147/5076162
function isScrolledToBottom(el) {
    var $el = $(el);
    return el.scrollHeight - $el.scrollTop() - $el.outerHeight() < 1;
}
#step2Disclaimer {
    width: 315px;
    border: solid 1px #ACE;
    margin-bottom: 15px;
    height: 115px;
    overflow-y: scroll;
    font-family: arial;
    font-size: 1rem;
    padding: 3px;
}

.unread {
    cursor: not-allowed;
    border: dashed 1px red;
    padding: 3px;
    color: #CCC;
}

.fully_read {
    border: solid 1px green;
    padding: 3px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="step2Disclaimer">
    <p class="l-twelve l-mb1 t-base t-left">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate temporibus commodi sapiente culpa sunt iure veniam harum impedit architecto dolorem quam facilis, odio blanditiis beatae similique non voluptatibus at dolorum?</p>
    <p class="l-twelve l-mb1 t-base t-left">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptate temporibus commodi sapiente culpa sunt iure veniam harum impedit architecto dolorem quam facilis, odio blanditiis beatae similique non voluptatibus at dolorum?</p>
</div>

<input class='unread' type="checkbox" id="acknowledge" name="acknowledge" value="true" disabled>
<label class="styled unread" for="acknowledge">I acknowledge</label>

【讨论】:

    【解决方案3】:

    我会隐藏复选框,直到用户到达页面末尾。当用户到达底部时,您可以使用 Jquery 的悬停或鼠标悬停来使框出现。

    【讨论】:

    • 这样会容易得多。然而,法律部门已经为我制定了这种行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2010-09-21
    • 1970-01-01
    • 2016-12-27
    相关资源
    最近更新 更多