【发布时间】:2020-08-27 17:09:14
【问题描述】:
我有一个 php 联系表单,提交时会验证字段,但此过程会重新加载页面并且表单不在页面顶部,所以我希望它自动滚动到表单所在的页面底部验证失败,因此用户可以看到错误。似乎 javascript 是执行此操作的唯一方法,因此我尝试将脚本与错误消息一起回显,但它不起作用。浏览器控制台中没有错误,只是不滚动。
在新页面加载后,我从查看源代码中获取已解析的 HTML,并将其放入 jsFiddle here。您可以看到它在小提琴中正确滚动,但实际站点没有。
编辑:
我还尝试将 jquery 库的加载添加到滚动脚本之前,即使我确认库首先加载,它仍然没有滚动。我很茫然。
这是一个sn-p的php:
<?php
// define variables and set to empty values
$nameErr = $fromErr = $phoneErr = $verif_boxErr = $recaptchaErr = "";
$name = $from = $phone = $message = $verif_box = "";
$recaptcha = NULL;
$errors = 0;
if ($_SERVER["REQUEST_METHOD"] == "POST") { //check if form has been submitted
if (empty($_POST["name"])) {
$nameErr = " * Name is missing";
$errors = 1;
echo '<style type="text/css"> input#name {border: 1px solid #F00;
box-shadow: 0px 0px 5pt .1pt #F00 inset;}</style>
<script type="text/javascript">
function scrollSmoothToBottom(){
$(scrollingElement).animate({scrollTop:document.body.scrollHeight},500)
}scrollingElement=document.scrollingElement||document.body,
window.onload=scrollSmoothToBottom;</script>';
} else {
$name = test_input($_POST["name"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z ]*$/", $name)) {
$nameErr = "Only letters and white space allowed";
$errors = 1;
echo '<style type="text/css"> input#name {border: 1px solid #F00; box-shadow: 0px 0px 5pt .1pt #F00 inset;}</style>';
}
}
if ($errors == 0) { // all fields successfullty validated.
$message = "Message: " . "\n" . $message;
$message = "Name: " . $name . "\n\n" . $message;
$message = "Email: " . $from . "\n" . $message;
mail("website@avayoupaint.com", 'Contact Form: ' . $name, $message = "Sender IP Address: " . $_SERVER['REMOTE_ADDR'] . "\n\n" . $message, "From: website-html@avayoupaint.com");
setcookie('tntcon', ''); // delete the cookie so it cannot sent again by refreshing this page
header('Location: success.php'); // redirect to success page
exit();
}
}
?>
<html>
<head></head>
<body>
<article id="contactForm">
<span class="error">* All fields are required</span>
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post" name="form1" id="form1">
<span class="contactTitles">Name:</span>
<input name="name" type="text" id="name" value="<?php echo $name;?>"/><span class="error"><?php echo $nameErr;?></span>
</form>
</article>
</body>
</html>
【问题讨论】:
-
我去了你的real site(来自你已删除问题的链接)。我将代码复制到一个空白文件中(而不是使用 JSFiddle,它有时会扭曲事物)。我将
console.log(scrollingElement);添加到scrollSmoothToBottom函数中。它运行,但记录null,因此它没有找到该元素。这是因为脚本在呈现 HTML 文档之前加载和执行 - 窗口可能已加载,但文档未加载。因此它找不到要附加“动画”功能的主体元素。 -
两种可能的解决方案:1)将脚本移动到页面底部,就在关闭
</body>标记之前,所以它不会执行,直到所有的HTML都被加载(浏览器加载并执行每个标签在他们找到它的那一刻,他们不会等待所有内容加载)。 2) 将脚本包装在$(document).ready块中(正如我在之前的聊天中所建议的那样),因此在所有 HTML 准备好之前它不会执行 - 因为那个“准备”事件直到那时才会触发。 -
无论哪种方式,您还应该 1) 确保脚本位于页面的
<head>或<body>标记内,否则从技术上讲它会使 HTML 文档无效。一些浏览器可能会容忍这种情况并运行脚本,但你不应该依赖它。 2) 确保只在页面中加载一次 jQuery——现在你在两个不同的地方加载了两次——这有时会导致奇怪的副作用和问题。 3) 使用更新版本的 jQuery。 1.x 分支只有在你必须支持像 IE8 这样的非常老的浏览器时才需要,但实际上应该没有人需要它了。 -
P.S.您在上述问题中发布的 90% 的代码与问题完全无关。不清楚为什么您会期望发送电子邮件的服务器端函数与与滚动相关的客户端 Javascript 问题有任何关系?然而,您没有包含任何实际指向问题的代码。您所包含的只是一个 JSFiddle 的链接,它 没有 重现该问题(可能是因为 JSFiddle 将您发布的所有代码包装在另一个文档对象中(必须如此,所以它可以将它放在那个小框架中) ,所以它找到了元素,并掩盖了问题。
-
幸运的是我可以查看已删除的问题并检索到真实站点的链接,否则我们仍然对实际问题没有真正的线索。
标签: javascript php jquery validation