2014-11-13 4 views
0

В процессе работы над простым проектом (или, по крайней мере, я думал, что это просто), когда пользователь нажимает кнопку, и в приведенном выше текстовом поле появляется случайное высказывание, сгенерированное с помощью php. У меня нет доступа к файлу php, поэтому я не вижу код и чувствую себя немного потерянным. Проблема, с которой я верю, является ошибкой в ​​том, как Im обрабатывает ответ с сервера (функция handleServerResponse). Любой совет будет принят во внимание.Обработка ответа сервера AJAX

В попытке отладки, я видел это сообщение: (я изменил URL)

XMLHttpRequest не может загрузить HTTP: somephp.php. Нет Заголовок «Access-Control-Allow-Origin» присутствует на запрошенном ресурсе . Поэтому исходный 'null' не допускается.

код до сих пор:

var xmlHttp = createXmlHttpRequestObject(); 

function createXmlHttpRequestObject(){ 
var xmlHttp; 

if(window.ActiveXObject){ 
    try{ 
     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    }catch(e){ 
     xmlHttp = false; 
     } 
    }else{ 
    try{ 
     xmlHttp = new XMLHttpRequest(); 
    }catch(e){ 
     xmlHttp = false; 
    } 
    } 

if(!xmlHttp) 
    alert("Error 1"); 
    else 
    return xmlHttp; 
} 


$("#BtnReset").click(function() { 
    $("#TBSaying").val(""); 
}) 

$("#BtnGetSaying").click(function() { 
    process(); 
}) 


function process(){ 
    if(xmlHttp.readyState==0 || xmlHttp.readyState==4){ 
    xmlHttp.open("GET", "http://somephp.php", true); 
    xmlHttp.onreadystatechange = handleServerResponse; 
    xmlHttp.send(null); 
    }else{ 
     setTimeout('process()', 1000); 
    } 
} 

function handleServerResponse(){ 
    if(xmlHttp.readyState==4){ 
     if(xmlHttp.status==200){ 
     xmlResponse = xmlHttp.responseXML; 
     xmlDocumentElement = xmlResponse.documentElement; 
     message = xmlDocumentElement.firstChild.data 
     $("#TBSaying").val(message); 
     }else{ 
     alert('error 2'); 
     } 
    } 
} 

Прочитайте документацию JQuery и начал свежие, загрузив его на том же сервере, в котором PHP проживает и работает. вот окончательный код: Спасибо всем, что посоветовал!

$("#BtnReset").click(function() { 
    $("#TBSaying").val(""); 
}) 

$("#BtnGetSaying").click(function() { 
    process(); 
}) 


function process(){ 
      // AJAX Code To Submit Form. 
      $.get("http://somephp.php",function(data){ 
      $("#TBSaying").val(data); 
    }); 
} 
+1

Просьба описать более подробную информацию о том, с чем вы хотите помочь. Что именно вы наблюдаете (например, что происходит при запуске этого кода)? Что именно вам ожидают? Вы видели какие-либо ошибки в журнале отладки? Вы разместили инструкции 'console.log()' в своей функции ответа сервера, чтобы точно увидеть, какие данные там возвращаются? Предполагается, что перед отправкой вам будут предложены основные этапы отладки, чтобы вы могли описать, какие шаги вы уже предприняли, и где именно вы застряли. – jfriend00

+0

Ваш вопрос, поскольку он стоит сейчас, не является чем-то, на что мы можем ответить (недостаточная информация). Требуется гораздо больше информации от вас. Без этой дополнительной информации этот вопрос необходимо будет закрыть. – jfriend00

ответ

0

Ваш Javascript кажется ужасным, но, увы, не так "Access-Control-Allow-Origin" является сервером-сторонний (PHP?) Ошибка, извините.

сказать ребятам сервера, чтобы добавить что-то вроде

header("Access-Control-Allow-Origin: *"); 

, чтобы увидеть, если ваш браузер правильно ^^

на Замечание,

  1. предупреждение ("Ошибка 1"); должен, вероятно, использовать console.log или вместо этого использовать новую ошибку().
  2. Почему xmlHttp как глобальный, может просто использовать процесс (e) {var xhr = e.target; ...} вместо
  3. don ' t сделать это setTimeout ('process()', 1000); , do setTimeout (процесс, 1000);
+0

Спасибо за ваш совет! Я выбрал это как правильный ответ, потому что ваш комментарий «ваш javascript кажется ужасным» заставил меня вернуться и сделать это более правильным, чистым (хотя, может быть, и не идеальным) способом. Я обновил свой оригинальный пост выше. Еще раз спасибо. – exeleon

1

Ajax-звонки из браузера ограничены так называемыми «ограничениями на то же происхождение». В основном это означает, что по умолчанию вы можете сделать только вызов Ajax на том же сервере, на котором появилась веб-страница. Это означает, что вы не можете сделать регулярный вызов Ajax на сервере в другом домене, порту или протоколе.

Вы можете прочитать примерно о той же политике происхождения here.

Существует три способа ограничения этого ограничения, но все они требуют сотрудничества с сервером.

  1. CORS. Сервер, на который вы делаете запрос, помещает заголовки в свои ответы, которые сообщают обозревателю, разрешен ли запрос на перекрестный поиск или даже какие домены ему разрешены. Это дает браузеру разрешение на завершение вызовов Ajax, которые не имеют одинаковое происхождение.

  2. JSONP. Вы можете узнать больше о JSONP here. В основном, вы запрашиваете скрипт с целевого сервера, и сценарий кодируется таким образом, что он предоставит вам необходимый вам ответ (обычно в формате данных JSON).

  3. Прокси-сервер. Вы находите или кодируете прокси-сервер сервера, который будет запрашивать у вас данные с другого сервера. Поскольку связь между сервером и сервером не ограничена одними и теми же ограничениями происхождения, иногда вы можете найти другой сервер, который позволяет передавать ему запросы с кросс-началом, которые затем получат данные для вас, а затем возвратят их вам.

+0

как об использовании [YQL] (https://developer.yahoo.com/yql/) в качестве более безопасной альтернативы ситуациям, когда простые запросы ajax не могут быть отправлены на сервер из-за ограничений происхождения? –

+0

На самом деле это называется политикой того же происхождения, и это не только домен, но и протокол, порт и хост должны быть одинаковыми. – Fraser

+0

Спасибо за ваш ответ. Итак, если все js-коды верны, если я загружаю этот проект (html и js) на тот же сервер, на котором находится php, тогда он должен работать? – exeleon

Смежные вопросы