【问题标题】:Need help implementing jQuery Form plug-in需要帮助实现 jQuery Form 插件
【发布时间】:2023-08-04 22:48:01
【问题描述】:

正如下面的 inkedmn 所指出的,我最初发布的内容相当于一堵代码 - 太多了,任何人都无法帮助我。因此,我没有创建一个新的问题/线程,而是决定重做这个 - 标题仍然适用于问题。

我正在尝试实现jQuery Form 插件。我的最终目标是 1)在提交之前验证表格 2)上传选择的文件,和 3) 将提交的表单数据发送到处理脚本,并将文件和表单数据写入数据库。

我使用某种 ajax 插件进行此操作的前 三个 尝试都失败了。因此,我从一个简单的 ajax 表单开始,该表单将两个表单字段发送到一个脚本,该脚本应该返回成功运行,然后显示一条消息。然后,一旦我开始工作,我将逐步处理数据,然后(希望)上传文件。

以下代码取自 jQuery Form 插件的示例代码。

这是 HTML 表单:

<form id="myForm" action="testProcessAjaxUploadForm.php" method="post"> 
    Name: <input type="text" name="name" /> 
    Comment: <textarea name="comment"></textarea> 
    <input type="submit" value="Submit Comment" /> 
</form>

这是 jQuery 代码:

// bind 'myForm' and provide a simple callback function 
$('#myForm').ajaxForm(function() { 
    alert("Thank you for your comment!"); 
});

这是假定处理检索到的表单数据并返回一些内容以便显示 javascript 警报的 php 代码:

<?php
    require_once ('../scripts/logging.php');
    $log = new Logging();

    if (isset($_POST['comment']) && isset($_POST['name'])) {
        $log->lwrite('name: ' . $_POST['name'] . ', comment: ' . $_POST['comment']);
    } else {
        $log->lwrite('Nothing passed to the script.');
    }

    //return true;
    return $_POST['name'];
    //echo $_POST['name'];

第一行记录写入日志文件,所以我知道脚本正在执行。当使用任一返回行时,浏览器只会在地址栏中加载一个带有脚本文件名的空白页面,当使用 echo 时,名称会显示在页面上,而脚本的文件名则显示在地址栏中。在任何情况下,javascript 的谢谢消息都不会显示。

我错过了什么?

更新

PHP 代码可以正常工作就我编写它的方式而言。这意味着它可以获取已发布的表单字段并使用它们。 jQuery Form 插件示例页面说明了示例代码,“如果服务器返回成功状态,那么用户将看到“谢谢”消息。所以我想我的问题是,“应该返回什么 php 脚本会导致 jQuery 代码检测到成功响应以便显示感谢消息?

Link to testing pagephp脚本内容可以在comment.txt文件中与网页同文件夹查看

【问题讨论】:

  • 如果您提供特定/问题或问题,您可能会更幸运地让人们回答。您已经发布了大量代码进行整理,但并没有详细说明您的问题。
  • 点得好,着墨。我知道要查看很多代码。当我发布它时,我想了很多,但我不知道从哪里开始或如何找出导致设置不起作用的原因。尽管它隐藏在我的帖子的第一段中,但我将重申代码当前正在执行的操作:根据需要上传文件并将信息写入数据库,但页面会刷新。我对现有代码的期望是要显示的警报并且页面不会刷新。如果有人能建议如何减少我必须更轻松地排除故障,那就太好了。
  • 如果你只是得到一个空白页,我猜你的 PHP 脚本有问题。我建议将您的 PHP 精简为非常基本且易于扫描的错误,看看是否可行,然后从那里构建您的 PHP 脚本。
  • @Jason,查看更新信息以解决您的建议。

标签: jquery forms plugins file-upload


【解决方案1】:

为您的 JavaScript 尝试类似的方法:

// bind 'myForm' and provide a simple callback function 
$('#myForm').ajaxForm({ 
    success: function() { 
        alert("Thank you for your comment!"); 
    });
});

PHP 返回什么并不重要——它可以是真的,也可以是回显语句。 “成功”来自服务器——这样当页面加载成功时,它将返回“成功”状态。如果页面不存在,或者访问被禁止,会返回错误码。

【讨论】:

  • 这直接来自示例页面,我确实尝试过 - 将 url 和 type 属性移动到选项对象中,然后使用 "$('#myForm').ajaxForm(options); ",但最终甚至没有调用或将数据传递给 php 脚本!
  • 您是否尝试过完全使用示例提供的内容?您的 jQuery 代码是否加载到“$(document).ready()”函数中?你现在如何设置它,JS 可以工作,但是当你使用选项时——也许你没有正确设置它们...尝试完全复制它们在示例页面上的显示方式。
  • 克里斯,我(再次)重新制作了 html 页面,复制/粘贴了 javascript 和表单,并确保它是正确的。然后我添加了一个comment.php 文件,它只是记录了发布的数据。 相同的结果 :( 浏览器加载了带有空白页面的 comment.php 文件。为什么没有显示警报?!?这令人沮丧 - 我一定错过了一些简单的东西 - 我已经放我的公共文件夹中的文件 - 随意查看它们here。您可以在 .../testUpload/comment.txt 看到 php 脚本
  • 当我查看源代码时,您的“警报”如下所示:a lert("Thank you for your comment!");尝试删除 a 和 l 之间的空格。如果您使用的是 Mac,但看不到它,请尝试在两个字母之间插入并按退格键。
  • 就是这样! - 总是简单的事情完全破坏了整个事情!谢谢!
【解决方案2】:

您的表单元素

&lt;input type="submit" value="Submit Comment" /&gt;

导致您将脚本加载到带有已发布变量的新页面中。这意味着您的 ajax 函数没有时间执行返回,因为浏览器正在直接为您加载新的 php 页面。为了防止这种情况,您需要从提交按钮中删除type="submit",这样浏览器就不会自动将您带到 php 脚本。

这样,当异步执行 ajax 时,您会留在页面上,并且由于您还没有离开页面,因此可以看到您的回调函数(在本例中为感谢提醒)。

【讨论】:

  • 虽然我绝不是专家,但我不确定我是否同意您删除 type 属性的理由,因为我正在处理的网站上的所有提交按钮都有该属性他们都在使用ajax。另外,当我从按钮中删除 type 属性时,它就变成了一个普通的框,显示了 value 属性并且无法点击。
  • 然后改成按钮标签。事实上,你的浏览器会自动加载一个带有提交按钮的新页面,所以如果你点击它并且它会将你带到实际的 php 页面而不是异步加载它,那么这就是正在发生的事情。