同步表单发布后触发JavaScript事件?

同步表单发布后触发JavaScript事件?,javascript,php,post,Javascript,Php,Post,好的,我认为没有一种方法可以做到这一点,不使用iframe,也不通过ajax调用提交表单,但无论如何,我想我会问的 假设我有一个具有以下配置的web服务器 public/ ├── file.php ├── index.php └── myfile.csv 在index.php上,我有一个表单。这是一个POST表单,其动作为file.php。该表单附带了一个JS事件处理程序,用于在提交时向DOM中插入一些“加载…”文本 index.php 为了完整起见,这里是myfile.csv: myfile

好的,我认为没有一种方法可以做到这一点,不使用iframe,也不通过ajax调用提交表单,但无论如何,我想我会问的

假设我有一个具有以下配置的web服务器

public/
├── file.php
├── index.php
└── myfile.csv
index.php
上,我有一个表单。这是一个POST表单,其动作为
file.php
。该表单附带了一个JS事件处理程序,用于在提交时向DOM中插入一些“加载…”文本

index.php 为了完整起见,这里是
myfile.csv

myfile.csv 现在,我的问题是:

在我的文件被提供并开始下载之后,我可以删除插入DOM中的“加载…”文本吗

同步表单发布后是否会触发JS事件


正如我所说,我认为没有,但我想四处看看。

您在这里所做的似乎是使用浏览器“缓存”继续显示页面,即使浏览器请求了另一个页面,该页面返回了一个文件,而不是要解释的HTML

根据我的经验,我们使用jQueryAjax来显示/隐藏“加载”DIV

(对于非ajax解决方案,向下滚动)

然后在页面底部有一个javascript部分,其中说明:

<script>
//HIDE THE LOADING DIV
getElementById('loading_div').css("display", "none");
</script>

然后,他们将看到这个加载div,直到文件被处理完毕,然后是带有重载的页面(但下载对话框将保留)

“我认为如果不使用iframe,就没有办法做到这一点,”
正确-iframe是目前最好的解决方案,而且非常简单。Jusr创建一个隐藏的iframe,将表单操作设置为所述iframe。附加2个js函数-一个是表单提交事件,它显示一个加载div,一个是iframe onload事件,它隐藏了itThanks@Steve。我认为你是对的,你的建议很有道理。我只是想再次检查一下我是否丢失了一些明显的东西。OP正在尝试启动文件下载,这在ajax上不起作用,也不能同时发送文件mime类型头和重定向头
<?php
// Dummy file
$file = 'myfile.csv';

// Simulate heavy calculations...
sleep(3);

if (file_exists($file)) {
    // Download the file
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . basename($file) . '"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
}
?>
Hello,World
$.ajax({
    url: script_url,
    cache: false,
    async: sync_type,
    type: "POST",
    data: form_data,
    dataType: "html",
    beforeSend: function(jqXHR, settings)
    {
        //BUILD LOADING HTML
        loading_html = '<div class="ajax-loading">&nbsp;</div>';

        //SHOW LOADING
        switch(return_mode)
        {
            case 'append':
                $('#'+container_id).addClass('ajax-loading');
            break;

            case 'prepend':
                $('#'+container_id).addClass('ajax-loading');
            break;

            default:
                $('#'+container_id).html(loading_html);
            break;
        }//END SWITCH RETURN MODE

    },//END FUNCTION BEFORESEND
    success: function(html_returned, success_code, jqXHR_object) 
    {
        switch(return_mode)
        {
            case 'append':
                //APPEND HTML RESPONSE
                $('#'+container_id).append(html_returned);

            break;

            case 'prepend':
                $('#'+container_id).prepend(html_returned);

            break;

            default:
                //REPLACE CONTAINER CONTENTS WITH HTML RESPONSE
                $('#'+container_id).html(html_returned);

            break;
        }//END SWITCH RETURN MODE

    },//END FUNCTION SUCCESS
    error: function(jqXHR, exception) 
    {

        //SHOW ERRORS 
        if (jqXHR.status === 0) 
        {
            //alert('Not connect.\n Verify Network.');
        } else if (jqXHR.status == 404) 
        {
            //alert('Requested page not found. [404]');
        } else if (jqXHR.status == 500) 
        {
            //alert('Internal Server Error [500].');
        } else if (exception === 'parsererror') 
        {
            //alert('Requested JSON parse failed.');
        } else if (exception === 'timeout') 
        {
            //alert('Time out error.');
        } else if (exception === 'abort') 
        {
            //alert('Ajax request aborted.');
        } else {
            //alert('Uncaught Error.\n' + jqXHR.responseText);
        }//END IF JQXHR.STATUS === 0
    },//END FUNCTION ERROR
    complete: function(jqXHR, textStatus)
    {
        //REMOVE LOADING CLASS
        $('#'+container_id).removeClass('ajax-loading');

    }
getElementById('loading_div').css("display", "block");
<script>
//HIDE THE LOADING DIV
getElementById('loading_div').css("display", "none");
</script>
header("Location: my_page_url.php");