【问题标题】:Executing Javascript inside of a PHP Redirect在 PHP 重定向中执行 Javascript
【发布时间】:2014-02-22 02:02:45
【问题描述】:

我一直在尝试使用 PHP 转发到最后制作一个模式窗口,在当前页面上只显示一个链接而没有模式脚本。

使用 PHP 你可以这样转发:

<?php
header( "Location: http://example.com" );

您还可以使用备用 URL 方案进行转发,例如,您可以像这样打开 SMS 消息:

<?php
header( "Location: sms:867-5309" );

例如,您可以让“http://yoursite.com/phone-number.php”在支持设备上开始短信对话,同时保持您打开的页面。

我还看到人们使用 URL 方案“javascript:”从浏览器地址栏或书签中运行 javascript。


我的问题是:每当我尝试使用 PHP 标头重定向执行 Javscript 时,什么都没有发生,就像这样:

<?php
header( "Location: javascript:alert('hey!');" );

我的问题是:为什么它不执行,有没有办法让它工作?

【问题讨论】:

  • javascript: url 不是真正的 URI 方案,它们只是您的浏览器理解的内容在某些情况下 JavaScript 适用。在重定向中并非如此。此外,sms 等其他 uri 方案通常不是专门编码到浏览器中的,而是具有更多控制权的插件。
  • ...HTTP/1.1 requires an absolute URI as argument to » Location: including the scheme, hostname and absolute path... 来自here。可以共享:,但肯定alert 不是URI..

标签: javascript php bookmarklet url-scheme


【解决方案1】:

不,javascript URI 方案只是一个假的non-standardized 方案,浏览器允许在锚元素中向后兼容以执行 JS。它已经被弃用了很长时间,以支持正确的事件语法,如下所示:

<a onclick="alert('hey!')">Click me!</a>

如果您想在“重定向”中执行 Javascript,您应该反转该方法 - 不要直接执行服务器请求,而是使用 Ajax 请求来调用服务器端代码,然后使用 onSuccess 回调来执行 JS之后运行的代码。

甚至可以使用 jQuery 或 Mootools 等库轻松地或手动使用 eval,让 Ajax 请求实际返回然后执行的 Javascript 代码,从而为您提供更大的灵活性。

【讨论】:

  • 关于最新编辑:您甚至不需要任何库来执行您返回的 JS 代码。相反,只推荐eval。节省时间。 先发制人的防御 是的,我知道 eval 是邪恶的,但您可能相信来自您自己服务器的代码。
  • 因此“容易”介于两者之间。当然可以使用带有eval 的自定义XHR 手动完成,但例如在Mootools 中是evalScripts flag defaults to true,在jQuery 中也是default behaviour。我只是在暗示图书馆可以以更简单的方式解决此类问题。
  • 据我了解,这些链接讨论的是&lt;script&gt; 标签中的代码,并且只有将它们插入到文档中,对吗?因此 eval 更容易从服务器运行一些纯代码
  • 正确,将答案编辑为指向普通的eval 选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多