使用javascript进行表单操作

whi*_*ack 26 javascript forms

我有一个必须在提交时执行javascript函数的表单,然后该函数将数据发布到我的php发送邮件文件并发送邮件.但它只适用于火狐.表单操作似乎没有在IE中做任何事情,我的问题是:这是从表单操作从外部文件调用函数的正确方法:

action="javascript:simpleCart.checkout()"
Run Code Online (Sandbox Code Playgroud)

simpleCart是.js文件,checkout()是函数.

提示赞赏,努力理解为什么它可以在Firefox中工作,但不是IE,铬或野生动物园.

<form name=form onsubmit="return validateFormOnSubmit(this)" enctype="multipart/form-data" action="javascript:simpleCart.checkout()" method="post">
Run Code Online (Sandbox Code Playgroud)

Ja͢*_*͢ck 46

设置为JavaScript函数的表单操作不受广泛支持,我很惊讶它在FireFox中有效.

最好的方法是将表单设置action为PHP脚本; 如果你在提交之前需要做任何事情,你可以加入onsubmit

编辑结果你不需要任何额外的功能,这里只是一个小小的改变:

function validateFormOnSubmit(theForm) {
    var reason = "";
    reason += validateName(theForm.name);
    reason += validatePhone(theForm.phone);
    reason += validateEmail(theForm.emaile);

    if (reason != "") {
        alert("Some fields need correction:\n" + reason);
    } else {
        simpleCart.checkout();
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

然后在你的形式:

<form action="#" onsubmit="return validateFormOnSubmit(this);">
Run Code Online (Sandbox Code Playgroud)


dke*_*ner 31

可以这样做:

<form action="javascript:alert('Hello there, I am being submitted');">
    <button type=submit>
        Let's do it
    </button>
</form>
<!-- Tested in Firefox, Chrome, Edge and Safari -->
Run Code Online (Sandbox Code Playgroud)

所以是的,这是一个选择,一个很好的选择.它说"提交时,请不要去任何地方,只需运行此脚本" - 非常重要.

唯一的不便是:

<form action="javascript:myFunction(this)">  <!-- won't give you the sender -->
Run Code Online (Sandbox Code Playgroud)

... 不会给你发送者对象.

但它很容易修复:

<form action="javascript:;" onsubmit="myFunction(this)">  <!-- now you have it! -->
Run Code Online (Sandbox Code Playgroud)

...现在它给你发送形式.(你可以写一个简单的"#"作为动作,这很常见 - 但是它在提交时会产生滚动到顶部的副作用.)

同样,我喜欢这种方法,因为它毫不费力且自我解释.没有"返回假",没有jQuery/domReady,没有重型武器.它只是做它似乎做的事情.当然其他方法也有效,但对我来说,这就是武士之道.

关于验证的说明

如果您只需要验证并转到另一个页面,当且仅当表单填写正确时,这是最简单的事情:

<form action="/something.php" onsubmit="return myFunction(this)">
Run Code Online (Sandbox Code Playgroud)

现在你的函数将提交发生之前运行; 如果它返回true(-ish),/ something.php将获得你的东西.Falsy值会使浏览器保持在页面上,您可以开始向用户大喊大叫,以获得无效输入.


IAM*_*L_X 5

距离这个问题提出已经快八年了,但我冒昧地给出一个以前没有给出过的答案。OP 说这不起作用:

action="javascript:simpleCart.checkout()"
Run Code Online (Sandbox Code Playgroud)

OP 表示,尽管尝试了他得到的所有好建议,但这段代码仍然失败。所以我大胆猜测一下。该操作checkout()作为类的静态方法进行调用simpleCart;但也许checkout()实际上是一个实例成员,而不是static。那要看他怎么定义了checkout()

顺便说一句,simpleCart大概是一个类名,并且按照惯例,类名的首字母大写,所以让我们在这里使用该惯例。我们就用这个名字吧SimpleCart

下面是一些示例代码,说明了如何定义checkout()实例成员。在 ECMA-6 之前,这是正确的方法:

function SimpleCart() {
    ...
}
SimpleCart.prototype.checkout = function() { ... };
Run Code Online (Sandbox Code Playgroud)

许多人使用了不同的技术,如下所示。这很流行,而且有效,但我反对它,因为实例应该在 上定义prototype一次,而以下技术在每次实例化时都定义成员this并重复执行此操作。

function SimpleCart() {
    ...
    this.checkout = function() { ... };
}
Run Code Online (Sandbox Code Playgroud)

这是ECMA-6 中的实例定义,使用官方的class

class SimpleCart {
    constructor() { ... }
    ...
    checkout()    { ... }
}
Run Code Online (Sandbox Code Playgroud)

与ECMA-6 中的静态定义进行比较。区别就只有一个字:

class SimpleCart {
    constructor() { ... }
    ...
    static checkout()    { ... }
}
Run Code Online (Sandbox Code Playgroud)

这是 ECMA-6 之前的旧方法的静态定义。请注意,该checkout()方法是在函数外部定义的。它是函数对象的成员,而不是原型对象,这就是它成为static 的原因。

function SimpleCart() {
    ...
}
SimpleCart.checkout = function() { ... };
Run Code Online (Sandbox Code Playgroud)

由于其定义方式的原因,静态函数对于关键字引用的内容会有不同的概念this。请注意,实例成员函数是使用关键字调用的this

this.checkout();
Run Code Online (Sandbox Code Playgroud)

使用类名调用静态成员函数:

SimpleCart.checkout();
Run Code Online (Sandbox Code Playgroud)

问题是 OP 希望将调用放入 HTML 中,它将处于全局范围内。他不能使用关键字,this因为this它会引用全局范围(即window)。

action="javascript:this.checkout()" // not as intended
action="javascript:window.checkout()" // same thing
Run Code Online (Sandbox Code Playgroud)

在 HTML 中使用实例成员函数没有简单的方法。您可以与 JavaScript 结合使用,在类的静态范围内创建一个注册表,然后调用代理静态方法,同时将参数传递给该代理,该代理将索引提供到实例的注册表中,然后使代理调用实际实例的成员函数。像这样的东西:

// In Javascript:
SimpleCart.registry[1234] = new SimpleCart();

// In HTML
action="javascript:SimpleCart.checkout(1234);"

// In Javascript
SimpleCart.checkout = function(myIndex) {
    var myThis = SimpleCart.registry[myIndex];
    myThis.checkout();
}
Run Code Online (Sandbox Code Playgroud)

您还可以将索引存储为元素上的属性。

但通常情况下,在 HTML 中什么也不做,而在 JavaScript 中执行所有操作并.addEventListener()使用该.bind()功能会更容易。