JavaScript书签包含POST命令

3

我试图创建一个JavaScript书签,使用HTTP POST方法从浏览器向我的PHP表单发送数据。但是似乎无法正常工作...请有人检查一下并告诉我原因吗?

var xhr = new XMLHttpRequest();
var params="v=66b12127";
xhr.open("POST", "http://google.com/index.php", true);
xhr.onreadystatechange = function() {
    if(this.readyState == 4) {
        window.alert("works");
    }
}
xhr.send(params);

以书签格式:

javascript:var xhr=new XMLHttpRequest();var params="v=66b12127";xhr.open("POST","http://google.com/index.php",true);xhr.onreadystatechange=function(){if(this.readyState==4){window.alert("works");}}xhr.send(params);

这对我来说像是一个跨域问题。 - Ignacio Vazquez-Abrams
我认为你是正确的,你知道任何解决方案吗? - David19801
4个回答

6
在大多数情况下,由于跨域限制(也称为同源策略),您无法执行POST请求。然而,如果您只对请求感兴趣而不关心答案,那么有一个解决方案:使用书签工具,插入一个带有适当操作属性的form,然后运行表单的DOM对象的.submit()函数。请注意,这将重新加载整个页面。如果要避免这种情况,请创建一个iframe并将表单的target属性设置为其名称。您可以选择隐藏iframe或者——如果您希望用户看到结果——保持可见。

1

确实这是一个跨域问题。使用普通的AJAX请求,您只能限定在页面所在的域。现代浏览器(FF3.5+,IE8+,Safari 4+,Chrome 4+;Opera根本不支持)支持一种称为跨域资源共享(另请参见此文档进行更简短和实用的介绍)的东西。如Telanor所说,服务器必须以Access-Control-Allow-Origin头响应才能正常工作(如果不是您自己的服务器,则没有机会),如果要使用基于cookie的身份验证,事情就会变得更加复杂。此外,在大多数浏览器中,您可以使用与普通AJAX请求相同的API,但在IE8中,您需要创建一个XDomainRequest对象而不是XMLHttpRequest。(当然,有一些框架可以隐藏丑陋的部分;例如,jQuery的AJAX函数支持它。)

如果你需要它在旧的浏览器中工作,但不关心远程站点的响应,只需要 POST 调用发生,创建一个隐藏的 iframe 并在其中发布。如果您需要旧版浏览器并需要返回数据,则情况会变得更加丑陋;有一些像 this 这样的 hack,但实现起来很麻烦。


0

那个谷歌页面返回了404。不过,假设你只是把这个页面放在那里作为一个例子,如果你拥有要发布的页面,请让它回复一个 Access-Control 头:http://ejohn.org/blog/cross-site-xmlhttprequest/

如果你不拥有该网站,你可以创建一个 PHP 页面来接受跨站点请求并将它们转发到其他网站。


0

你也可以编写用户脚本。

GreaseMonkey 支持 GM_xmlhttpRequest,它类似于标准的XMLHttpRequest,但允许跨越同源策略边界。

如果需要,你还应该能够将其与书签脚本集成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接