无法使用javascript重定向

无法使用javascript重定向,javascript,html,Javascript,Html,我有一个验证信用卡凭证的页面。在我需要将用户重定向到另一个页面之前,一切都很好 功能vNumarCard(numar) { 控制台日志(numar); var cardno=/^(?:4[0-9]{12}(?[0-9]{3})?)$/; 如果(!numar.match(/^(?:4[0-9]{12}(?[0-9]{3})?)/) { 返回false; } 其他的 { 返回true; } } 函数vDataExp(数据){ 控制台日志(数据); if(!data.match(/(0[1-9]|

我有一个验证信用卡凭证的页面。在我需要将用户重定向到另一个页面之前,一切都很好

功能vNumarCard(numar)
{
控制台日志(numar);
var cardno=/^(?:4[0-9]{12}(?[0-9]{3})?)$/;
如果(!numar.match(/^(?:4[0-9]{12}(?[0-9]{3})?)/)
{
返回false;
}
其他的
{
返回true;
}
}
函数vDataExp(数据){
控制台日志(数据);
if(!data.match(/(0[1-9]| 1[0-2])[/][0-9]{2}/){
返回false;
}
否则{
var d=新日期();
var anCurent=d.getFullYear();
变量lunaCurenta=d.getMonth()+1;
var parti=data.split('/');
VarAN=parseInt(parti[1],10)+2000;
var luna=parseInt(parti[0],10);
if(an

康帕拉
丙泊酚生产选择酯 电邮: Nume: 努玛卡: 数据包括: CVC: 康帕拉
您应该为您的函数使用
返回true

function vNumarCard(numar) {
 //validation code
 return true;
 }

function vDataExp(data) {
 //validation code
 return true;
 }

function vCVC(cvc) {
 //validation code
 return true;
 }
然后你可以用这个:

if ( vNumarCard(numar) && vDataExp(data) && vCVC(cvc) ) {
  location.href = 'success.html';
}
Cumpara
您有一个带有两个作业的按钮:

  • 运行代码(验证+重定向)
  • 提交表格
所以我猜浏览器在做这两件事。由于这两个操作都涉及加载(不同的)页面,因此只有最后一个成功完成“wins”

如果您确实不打算向服务器提交表单数据,则应将
type=“submit”
属性更改为
type=“button”


在任何情况下,都不清楚为什么您首先拥有一个表单,因为您似乎完全放弃了它的值。我假定您还有一些未共享的附加过程(例如AJAX调用)。

当单击“提交”按钮时,表单会被提交。由于表单没有
action
属性,因此表单将被提交到当前URL,这就是重新加载同一页面的原因。事件处理程序在默认操作(表单提交)之前执行,因此即使尝试在事件处理程序中重定向,也会被表单提交覆盖,这就是重定向被取消的原因

解决方案是防止表单提交。首先,您应该使用表单上的
onSubmit
侦听器,而不是按钮上的
onClick
侦听器。您不必这样做,但这被认为是良好的做法,有助于提高可访问性。
您需要将
事件
参数传递给函数,如下所示:

<form onSubmit="verDate(event);">
function verDate(event){
    event.preventDefault();
    var numar = document.getElementsByName("numarCard")[0].value;
    var data = document.getElementsByName("dataExp")[0].value;
    var cvc = document.getElementsByName("codCVC")[0].value;

    verCard(numar,data,cvc);
}
这应该可以解决您的问题,但我还想建议,一种更简洁的方法是,不显式重定向,而是将成功页面设置为表单的操作属性(即
),而不是在表单有效时重定向,而是运行
事件.preventDefault()
仅当表单无效时。这是处理表单的正确方法,尽可能多地利用默认行为


另外,专业提示:如果您想在JS作业中获得更高的分数,请使用添加事件侦听器,而不是将它们作为HTML中的内联属性添加。

只是一个提示,不回答问题。不需要键入vNumarCard(numar)==true,只需编写fun1()&&fun2()&&fun3(),项目中success.html在哪里?试试
“/success.html”
谢谢你的提示!success.html位于同一位置。“不起作用”不是一个有用的描述(如果它起作用,你不会问)。您是否检查了浏览器开发工具?我已检查,没有错误或警告。我不知道如何更好地解释这个问题。谢谢你的回答,但它似乎并没有解决问题。表单背后的故事是,对于我必须制作的项目,我需要从用户那里获取并检查数据。起初我使用php,但后来我发现php部分不会被评分,所以我不得不使用javascript重新制作所有内容。去掉
type
属性不会有帮助,因为表单中的按钮默认为
submit
。他需要显式地设置
type=“button”
,它才能工作。顺便说一句,当您有表单元素时使用表单总是一个好处,因为它有助于可访问性和类似的元事物,所以最好“装饰”表单,使其以您想要的方式运行并可能优雅地降级,而不是完全不在表单上下文中工作。
function verDate(event){
    event.preventDefault();
    var numar = document.getElementsByName("numarCard")[0].value;
    var data = document.getElementsByName("dataExp")[0].value;
    var cvc = document.getElementsByName("codCVC")[0].value;

    verCard(numar,data,cvc);
}