只是好奇是否有人可以向我解释为什么我可以从像这样的书签请求页面:
javascript:var%20s=document.createElement('script');var data=encodeURI(location.href)+encodeURI('\n\n')+(encodeURI(document.getElementsByTagName('body')[0].innerHTML));s.setAttribute('src','http://example.com/remote.php?id=68&act=new&data='+data);document.getElementsByTagName('body')[0].appendChild(s);void(s);
哪个出去并请求页面,甚至可以提供GET变量输入。
然而,由于相同的原始政策,我无法通过jQuery之类的东西发布/获取带有ajax的XHR ...为什么?这是浏览器问题还是标准的一部分?
注意:我更改了书签。 注2:我的问题是为什么这不违反政策?
答案 0 :(得分:3)
不同之处在于您无法(直接)读取成为<script>
元素的响应。
如果URL碰巧返回定义有用功能的Javascript,您可以使用它 如果它包含任何其他内容(例如JSON或XML数据),则无法读取响应。
同样,您可以创建一个<img>
元素,指向不同域中的图像。
答案 1 :(得分:1)
此小书签未违反same origin policy。此策略仅限制XHTTP请求,此bookmarklet正在向页面添加脚本元素。
DOM元素(如图像和脚本)可以从Internet上的任何位置自由获取资源。
虽然任何脚本都可以通过DOM构建脚本或img请求来有效地执行GET请求跨域,但是除非返回的响应是正确形成的,否则它将无法从该资源中提取任何数据。适当形成的响应实际上是cross-domain ajax的基础。
答案 2 :(得分:1)
相同的原始javascript政策不允许来自不同域的页面进行通信,访问彼此的对象,无论是读取还是写入,它也不允许xmlhttprequests(ajax调用)从其他服务器请求数据。 / p>
但是,它与允许在其他服务器上引用的脚本无关。正如@SLaks所说,您可以从其他服务器添加<script>
标记,因为您可以从其他服务器添加<img>
标记。
答案 3 :(得分:0)
该bookmarklet不会xhr请求来自其他服务器的内容,但会附加来自该其他服务器的脚本,这是可接受的并且不会与same origin policy冲突。
实际上,这是进行此类跨服务器通信的已知解决方法,请查看jsonp。