【问题标题】:Refresh page after button was clicked and location changed单击按钮并更改位置后刷新页面
【发布时间】:2012-08-21 11:03:15
【问题描述】:

我有一个按钮,它通过使用 javascript 将页面的位置更改为我的 php 脚本来生成一个 word 文档,该脚本在与位置更改相同的页面上输出文件:

header('Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename="' .$templateName . '.docx"');
readfile( $tempFileName);

无论如何,当我单击按钮时,php 脚本会更改包含按钮的页面所包含的一行数据。单击按钮后,它只是生成word文档,但刷新页面,因此用户会认为该按钮仅具有生成word文档的效果,而没有更改记录,仅刷新页面后,用户会注意到按钮的不同之处。

我的按钮的 HTML 是这样的:

<input type="button" value="Generate Final Demand" onClick="self.location='DOCXGenerateDocument.php?templ=finaldemand&invoiceid=<?=$_GET['id']?>'">

对于如何在文档返回后完成刷新页面的任务有什么想法吗?

【问题讨论】:

  • 是在你的 php.ini 中启用了短标签还是你使用的是 php 5.4?
  • 我使用最新版本的 PHP 并启用了短标签。

标签: php javascript html


【解决方案1】:

一种解决方案是使用setTimeout() 并猜测页面何时应该返回,然后在超时触发时执行document.location.reload(true)

它不漂亮,但它应该可以完成工作。

【讨论】:

    【解决方案2】:

    不要使用self.location,而是使用window.location

    例如 onClick="window.location='DOCXGenerateDocument.php?templ=finaldemand&amp;invoiceid=&lt;?=$_GET['id']?&gt;'"

    让我知道这是否有效。
    如需更多参考,您可以查看 MDN 上的 link

    【讨论】:

    • 页面未刷新,数据未加载到页面上。
    【解决方案3】:

    一个相对简单的方法是利用 PHP 中的会话锁定。让我们假设您的 DOCX 生成脚本使用会话并且在脚本结束之前不会释放它。现在,如果浏览器尝试加载另一个也使用会话的 PHP 脚本,第二个脚本将停止,直到第一个脚本完成。只需使用“location.reload()”使第二个脚本成为动态加载的 Javascript,然后您就拥有了所需的内容。

    开始下载的功能:

    function getDoc() {
        self.location='DOCXGenerateDocument.php?templ=finaldemand&invoiceid=<?=$_GET['id']?>';
        setTimeout("var s = document.createElement('SCRIPT'); s.src = 'read.js.php'; document.body.appendChild(s);", 100);
    }
    

    重载脚本:

    <?php session_start(); ?>
    location.reload();
    

    【讨论】:

    • 不幸的是脚本不使用会话,因此解决方案变得无用。
    • 然后使用flock()。将随机生成的数字传递给两个脚本,让它们尝试锁定同一个临时文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多