Ajax в букмарклете: действие выполнено, но ответа не дано - PullRequest
0 голосов
/ 26 октября 2010

Я пытаюсь сделать свой собственный букмарклет, и я уже пытался прочитать какой-то ответ в 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 всегда вызывается тоже (он регистрирует каждое попадание)
  • alert показывает responseText, когда я нажимаю на букмарклет на example.com
  • Иногда на других сайтах alert ничего не показывает (но все равно появляется)
  • В некоторых других случаях alert даже не отображается ... (но у меня все еще есть журнал ...)

У вас есть идеи, почему это происходит? И если да, у вас есть идея, как я могу сделать так, чтобы всегда показывалось responseText?

Ответы [ 2 ]

0 голосов
/ 26 октября 2010

Ну, наконец, я использовал другой трюк:

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 за все детали, которые я мог бы использовать в будущем!

0 голосов
/ 26 октября 2010

status не будет ok, если вы не тестируете букмарклет на своем собственном сайте (example.com).

Когда вы запускаете букмарклет на другом сайте, отличном от example.com (что, в конце концов, означает весь смысл наличия букмарклета), он будет выполнять перекрестный источник XMLHttpRequest с example.com. В зависимости от того, какой браузер вы используете, он может выполнить запрос, но вы не сможете прочитать ответ из-за одной и той же политики происхождения. Это важная функция безопасности, которая не позволяет выполнять олицетворение пользователем запросов XMLHttp на другие серверы.

Если вы хотите сделать XMLHttpRequest обратно на ваш сервер, вы должны сделать это из документа на вашем сервере, обычно с помощью букмарклета создать <iframe>, указывающий на example.com.

В качестве альтернативы, используйте JSONP (<script> включение) для вызова scriptToCall.php.

...