bookmarklet中的Ajax:已完成操作但未给出答案

时间:2010-10-26 14:11:45

标签: php javascript ajax bookmarklet

我正在尝试自己编写书签,我已经尝试在SO中阅读一些回复,但没有回答我从脚本中得到的奇怪反应。

我正在从我的书签中进行AJAX调用,所以我做了一个小技巧:

var newScript = document.createElement("script");
newScript.type = "text/javascript";
newScript.src = "http://example.com/urlToMyJS.js";
document.body.appendChild(newScript);
void(0);

urlToMyJS.js 是这样的:

var u = 'http://example.com/scriptToCall.php';
var request = new XMLHttpRequest();
request.open("GET", u, true);
request.onreadystatechange = function() {
  var done = 4, ok = 200;
  if (request.readyState == done && request.status == ok) {
    if (request.responseText) {
      alert(request.responseText);
    }
  }
};
request.send(null);

奇怪的部分是:

  • javascript始终启动, scriptToCall.php 也一直被调用(它记录每次点击)
  • 当我点击 example.com 上的书签时,alert会显示responseText
  • 有时,在其他网站上,alert不会显示任何内容(但仍会显示)
  • 有些时候,alert甚至没有显示......(但我仍然记录了日志......)

你知道为什么会这样吗?如果是,您是否知道如何让它始终显示responseText

2 个答案:

答案 0 :(得分:0)

除非您在自己的网站(status)上测试书签,否则

ok将不会是example.com

当您将另一个站点上的书签运行到example.com时(这毕竟是拥有书签的重点),它将对example.com执行跨源XMLHttpRequest。根据您正在使用的浏览器,可能执行请求,但由于同源策略,您将无法读取响应。这是一项重要的安全功能,您无法将用户模拟XMLHttpRequests到其他服务器。

如果要将XMLHttpRequest重新发送回服务器,则必须从服务器上的文档执行此操作,通常是通过让bookmarklet创建指向<iframe>的{​​{1}}。

或者,使用JSONP(example.com包含)来调用<script>

答案 1 :(得分:0)

好吧,最后,我使用了另一个技巧:

var newScript = document.createElement("script");
newScript.type = "text/javascript";
newScript.src = "http://example.com/scriptToCall.php";
document.body.appendChild(newScript);
void(0);

这种方式(PHP正在发送javascript标头),不再需要AJAX。在我的情况下这是无稽之谈,因为两个文件都在同一个服务器/文件夹中,1个移动而不是2个!

无论如何,感谢我们将来可能会使用的所有细节!