代码之家  ›  专栏  ›  技术社区  ›  Shikiryu DhruvJoshi

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

  •  0
  • Shikiryu DhruvJoshi  · 技术社区  · 15 年前

    我试着做自己的书签,我已经试着读了一些回应,但是没有什么能回答我从剧本中得到的奇怪反应。

    我正在用书签打Ajax电话,所以我做了一个小技巧:

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

    以及 乌尔托米JS.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脚本 也总是被调用(它记录每次命中)
    • 这个 alert 显示 responseText 当我点击书签时 示例.com
    • 有时,在其他网站上, 警觉的 不显示任何内容(但仍显示)
    • 其他时候, 警觉的 甚至不显示…(但我仍然有日志命中…)

    你知道为什么会这样吗?如果是的话,你知道我怎样才能让它一直显示 响应文本 ?

    2 回复  |  直到 15 年前
        1
  •  0
  •   bobince    15 年前

    status 不会的 ok 除非你在自己的网站上测试书签( example.com )

    当你在不同的网站上运行书签 示例.com (这毕竟是拥有一个书签的关键所在),它将执行一个跨源XMLHttpRequest 示例.com . 这取决于您使用的浏览器,可能 请求,但由于同一来源策略,您将无法读取响应。它是一个重要的安全特性,您不能让用户模拟xmlhttpRequests到其他服务器。

    如果要使xmlhttpRequest返回到服务器,则必须从服务器上的文档中进行,通常通过让bookmarklet创建一个 <iframe> 指向 示例.com .

    或者,使用jsonp( <script> 包括)呼叫 scriptToCall.php .

        2
  •  0
  •   Shikiryu DhruvJoshi    15 年前

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

    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个!

    不管怎样,感谢Bobince为我将来可能使用的所有细节!

    推荐文章