【问题标题】:Code works in all browsers except Firefox [closed]代码适用于除 Firefox 之外的所有浏览器 [关闭]
【发布时间】:2012-11-02 00:18:03
【问题描述】:

我一直在研究一个非常大的带有重置按钮的 html 表单。 重置时,会发生数据库操作。

我有一个这样的javascript函数,它在重置时被调用:

function clearDatabaseOfAnySavedForm() {
    window.name = 1;                        
    $.post('assets/scripts/reset-form.php');    
    window.location.reload();
    $(document).load().scrollTop(0);            
    return false;
}

这个函数中引用的php文件的代码是:

<?php
    //Authcate
    $authcate = xxxxx;  

    $username = "xxxxx";
    $password = "xxxxx";
    //$hostname = "xxxxx";  
    $hostname = "xxxxx";  
    $database = "xxxxx";
    $conn = mysql_connect($hostname, $username, $password);
    mysql_select_db($database, $conn) or die( "Unable to select database");  

    if (!empty($authcate)) {        
        $table = "xxxxx";

        $sqlSelectQuery = "SELECT * FROM $table WHERE authcate = '$authcate'";
        $selectResults = mysql_query($sqlSelectQuery);
        $selectNumResults = mysql_num_rows($selectResults);
        if ($selectNumResults > 0) {
            $sqlUpdateQuery = "DELETE FROM $table WHERE authcate = '$authcate'";
            $result = mysql_query($sqlUpdateQuery);
        } 
    }
    mysql_close($conn); 
}

所有浏览器都可以正常工作,但由于某种原因,php 文件不会在 Firefox 中被调用。 有人有什么建议吗?

【问题讨论】:

  • 您可以随时使用强大且经常更新的 $.browser 功能,如果用户有 Firefox,您可以发布一条巨大的消息“请使用 Internet Explorer,这个网站很棒!” ??
  • @adeneo 本身会使网站变得不那么好......
  • 你用萤火虫吗?你看到了什么错误信息?
  • @adeneo:我正在寻找解决方案,而不是解决方法。谢谢。
  • 在 Firefox 中调试 ajax 调用时,Firebug 是您的朋友。它使您可以查看所有出/回的内容,并解决您的错误可能在哪里。顺便说一句,这不是 Firefox 的问题。

标签: php javascript jquery mysql firefox


【解决方案1】:

您的代码充满了竞争条件和不可能的步骤。我很惊讶它会在其他浏览器中运行。

function clearDatabaseOfAnySavedForm()
{
    window.name = 1;                        
    $.post('assets/scripts/reset-form.php'); <-- call server with asynchronous call  
    window.location.reload();  <-- reload page, it will cancel out the server call
    $(document).load().scrollTop(0); <-- um page is been reload, what does this do ?
    return false;  <-- page is reloaded, what are you cancelling?
}

确保服务器上的代码运行的唯一方法是确保回调发生,而不是重新加载页面。发布请求是异步的。不能保证浏览器会执行它。大多数浏览器会在页面退出时获取任何打开的连接并终止它们。这就是 Firefox 不执行它的原因。

在 Firefox 中,您正在失去竞争条件。调用已完成,在完成与服务器的连接之前,请求被切断,因此浏览器可以发送刷新页面的请求。您需要等待请求与服务器建立连接。您需要等待 readyState 至少达到 2。

但是为什么还要费心进行 Ajax 调用,向页面提交一个发布请求。该页面将重新加载并重定向回您的来源。 Ajax 不是正确的解决方案。

【讨论】:

  • 感谢您的评论@epascarello。我基本上不关心从服务器返回的内容,因为我正在对我的数据库执行删除操作。我所关心的是删除操作发生了,但它本身并没有发生。如果 ajax 不是正确的解决方案,您认为我的问题的正确解决方案是什么?欢呼
  • 没有足够的时间发送请求,因为您正在立即重定向?
  • @user1792935 不管你是否关心从服务器返回什么,客户端没有给请求足够的时间出去。
【解决方案2】:

扩展@epascarello 的答案,您可能想要使用回调函数,这将在您的帖子完成后执行代码。阅读它here

function clearDatabaseOfAnySavedForm(){
  $.post('assets/scripts/reset-form.php', function(){
    //this will execute when the post returns
    window.location.reload();
  })
}   

而且你不需要scrollTop并返回false;

如果您不知道什么是回调函数,请阅读here。我记得当我第一次开始使用 javascript 时,这是一个非常不寻常的概念。

【讨论】:

  • 你拯救了我的一天!我实际上并没有意识到我在发送请求之前正在重新加载。
  • 感谢@epascarello 以及
  • 是的,感谢他指出了问题,我为他的回答 +1,对不起偷猎者 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多