我正在尝试创建一个javascript bookmarklet,它将使用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);
答案 0 :(得分:6)
在大多数情况下,由于跨域限制(也称为Same origin policy),您无法执行POST请求。但是,如果您仅对执行请求感兴趣并且对阅读答案不感兴趣,则有一个解决方案:使用bookmarklet,插入带有相应action属性的form
,然后运行表单的DOM对象的.submit()
函数。请注意,这将重新加载整个页面。如果您想避免这种情况,请同时创建iframe
并将表单的target
属性设置为其名称。您可以选择隐藏iframe,或者 - 如果您希望用户查看结果 - 请将其隐藏起来。
答案 1 :(得分:1)
确实这是一个跨域问题。对于常规的AJAX请求,您只能访问该页面所在的域。现代浏览器(FF3.5 +,IE8 +,Safari 4 +,Chrome4 +; Opera根本不支持)支持名为Cross-Origin Resource Sharing的内容(另请参阅this document以获得更短且更实用的介绍)。正如Telanor所说,服务器必须使用Access-Control-Allow-Origin
标头来响应(如果它不是您自己的服务器,那就没有运气),如果您想要基于cookie的身份验证,事情会变得复杂得多。此外,虽然您可以在大多数浏览器中使用与普通AJAX请求相同的API,但在IE8中,您需要创建一个XDomainRequest对象而不是XMLHttpRequest。 (当然,有一些框架可以隐藏丑陋的部分;例如,jQuery AJAX函数支持它。)
如果您需要它在较旧的浏览器中工作,但不关心远程站点的回复,只有发生POST调用,创建一个不可见的iframe并在那里发布。如果您需要旧的浏览器并需要返回数据,事情会变得更加丑陋;有像this这样的黑客攻击,但是实施这个问题真是太痛苦了。
答案 2 :(得分:0)
该google页面返回404.但是,假设您只是将其放在那里作为示例,如果您拥有试图发布到的页面,请让它回复Access-Control
标题:{{3} }
如果您不拥有该网站,则可以创建一个接受跨网站请求的PHP页面,并将其转发到其他网站。
答案 3 :(得分:0)
您也可以编写用户名。
GreaseMonkey支持GM_xmlhttpRequest,它类似于标准XMLHttpRequest,但允许跨越相同的原始策略边界。
如果您仍需要,还应该能够将它与bookmarklet集成。