根据滚动位置有条件地禁用/启用按钮

5

我需要在用户滚动到表单条款和条件部分的底部时激活复选框。这将是电子商务网站结账页面的一部分。

我已经看到有关此事的争论,但根据我们的律师,出于责任原因,必须在我们的网站上采用这种方式。如果滚动框的末尾有一个接受按钮将是最后的办法,因为似乎会让我们的一些用户感到困惑,无论我们多少信息告诉他们按钮在哪里都是如此。

我引用了这个代码,并对其进行了修改以尝试使其按照我所需的方式运行。我的代码如下所示。它不能正常工作。我已成功禁用了该按钮,但似乎无法重新激活它。

我对JavaScript相当陌生,任何帮助都将不胜感激。

   <head>
    <title>Scroll Test</title>
    <script language="JavaScript">
    </script>
</head>

<body>

<form name="form22" action="javascript: alert('Form submitted!');" onSubmit="return formValidation(this);">

    <p>
    License Agreement:<br />
    <textarea name="licenseAgreement" rows="10" cols="45">This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

    This is my long, long license agreement where you agree to all of my demands.

</textarea>
    </p>

    <p>
    <input name="button" type="checkbox" value="Submit" disabled> I agree
    </p>

</form>

</body>
</html>
1个回答

6
使用普通的JS,我们需要检查几件事情。考虑以下内容:

获取LicenseAgreementElement:

var textElement = document.getElementsByName("licenseAgreement")[0]

现在我们有了这个元素,

获取licenseAgreement文本区域滚动的距离。

textElement.scrollHeight

我们需要检查用户是否已经滚动了整个AgreementElement,即实际元素的scrollTop + height

textElement.scrollTop + textElement.offsetHeight >= textElement.scrollHeight

在开始处添加事件监听器会提供以下内容:
document.getElementsByName("licenseAgreement")[0].addEventListener("scroll", checkScrollHeight, false);

function checkScrollHeight(){
    var textElement = document.getElementsByName("licenseAgreement")[0] 
    if ((textElement.scrollTop + textElement.offsetHeight) >= textElement.scrollHeight){
        document.getElementsByName("button")[0].disabled = false;
    }
}

当条件满足时,启用复选框。
最后是一个小的实例:JSFiddle

我可以建议另一个(可能更简单的)解决方案吗?在滚动区域底部添加一个空的 div,在滚动时检查它是否在屏幕范围内,如果是,则表示您已经滚动足够远了。 - Alxandr
@Alxandr,随意添加另一个答案。只是注意,这是一个“textarea” ;) - cillierscharl
非常感谢大家!我已经将它从JSFiddle中取出,放入到Dreamweaver中,在真实浏览器中测试,但似乎无法工作。Firebug告诉我错误是"document.getElementsByName("licenseAgreement")[0]未定义"有什么想法吗? - Ashley
@Ashley - 如果你的标记与原始帖子相同,那应该没问题,有什么变化吗?否则,我们可以尝试为你的元素分配id - cillierscharl
@f0x 我刚试着改用id,但没有成功(虽然很可能是我的代码的问题 :( 许可协议的id是licenseAgreement,表单的id是scroll,按钮的id是agree。JS代码如下:'document.getElementsById("licenseAgreement")[0].addEventListener("scroll", checkScrollHeight, false);function checkScrollHeight(){ var agreementTextElement = document.getElementsById("licenseAgreement")[0] if ((agreementTextElement.scrollTop + agreementTextElement.offsetHeight) >= agreementTextElement.scrollHeight){ document.getElementsById("agree")[0].disabled = false; } }' - Ashley
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接