Thought I would just report back my findings, now that I have it all working. The following client-side code (slightly abridged and anonymized) contains all the work-arounds I needed to address the prblems outlined in this thread and works on IE (8.0.6001), FF(3.5.9), and Chrome (5.0.375.55 beta). Still yet to test under older versions of browsers. Many thanks to all who responded.
I should also add that I needed to make sure that the server response needed to include:
Response.ContentType = "text/xml" ;
for it to work with IE. FF didn’t mind if the ContentType was text/HTML but IE coughed.
Code to create an XMLHTTP request:
function GetXMLHTTPRequest ()
{
var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] ; //activeX versions to check for in IE
if (window.ActiveXObject) //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
{
for (var i=0; i < activexmodes.length ; i++)
{
try
{
return new ActiveXObject(activexmodes[i]) ;
}
catch (e)
{ //suppress error
}
}
}
else if (window.XMLHttpRequest) // if Mozilla, Safari etc
{
return new XMLHttpRequest () ;
}
else
{
return (false) ;
}
}
Code to return the text value of a record node:
function GetRecordElement (ARecordNode, AFieldName)
{
try
{
if (ARecordNode.getElementsByTagName (AFieldName) [0].textContent != undefined)
{
return (ARecordNode.getElementsByTagName (AFieldName) [0].textContent) ; // Chrome, FF
}
if (ARecordNode.getElementsByTagName (AFieldName) [0].text != undefined)
{
return (ARecordNode.getElementsByTagName (AFieldName) [0].text) ; // IE
}
return ("unknown") ;
}
catch (Exception)
{
ReportError ("(GetRecordElement): " + Exception.description) ;
}
}
Code to perform the AJAX request:
function GetRecord (s)
{
try
{
ReportStatus ("") ;
var xmlhttp = GetXMLHTTPRequest () ;
if (xmlhttp)
{
xmlhttp.open ("GET", "blahblah.com/AJAXget.asp?...etc", true) ;
if (xmlhttp.overrideMimeType)
{
xmlhttp.overrideMimeType("text/xml") ;
}
xmlhttp.setRequestHeader ("Content-Type", "text/xml; charset="utf-8"") ;
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4)
{
if (xmlhttp.responseXML != null)
{
var xmlDoc = xmlhttp.responseXML;
var ResultNodes = xmlDoc.getElementsByTagName ("Result") ;
if (ResultNodes != null)
{
var PayloadNode = xmlDoc.getElementsByTagName ("Payload") ;
if (PayloadNode != null)
{
var ResultText = ResultNodes [0].firstChild.nodeValue ;
if (ResultText == "OK")
{
ReportStatus (ResultText) ;
var RecordNode = PayloadNode [0].firstChild ;
if (RecordNode != null)
{
UpdateRecordDisplay (RecordNode) ; // eventually calls GetRecordElement
}
else
{
ReportError ("RecordNode is null") ;
}
}
else
{
ReportError ("Unknown response:" + ResultText) ;
}
}
else
{
ReportError ("PayloadNode is null") ;
}
}
else
{
ReportError ("ResultNodes is null") ;
}
}
else
{
ReportError ("responseXML is null") ;
}
}
else
{
ReportStatus ("Status=" + xmlhttp.readyState) ;
}
}
ReportStatus ("Requesting data ...") ;
xmlhttp.send (null) ;
}
else
{
ReportError ("Unable to create request") ;
}
}
catch (err)
{
ReportError ("(GetRecord): " + err.description) ;
}
}
Thought I would just report back my findings, now that I have it all working. The following client-side code (slightly abridged and anonymized) contains all the work-arounds I needed to address the prblems outlined in this thread and works on IE (8.0.6001), FF(3.5.9), and Chrome (5.0.375.55 beta). Still yet to test under older versions of browsers. Many thanks to all who responded.
I should also add that I needed to make sure that the server response needed to include:
Response.ContentType = "text/xml" ;
for it to work with IE. FF didn’t mind if the ContentType was text/HTML but IE coughed.
Code to create an XMLHTTP request:
function GetXMLHTTPRequest ()
{
var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] ; //activeX versions to check for in IE
if (window.ActiveXObject) //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
{
for (var i=0; i < activexmodes.length ; i++)
{
try
{
return new ActiveXObject(activexmodes[i]) ;
}
catch (e)
{ //suppress error
}
}
}
else if (window.XMLHttpRequest) // if Mozilla, Safari etc
{
return new XMLHttpRequest () ;
}
else
{
return (false) ;
}
}
Code to return the text value of a record node:
function GetRecordElement (ARecordNode, AFieldName)
{
try
{
if (ARecordNode.getElementsByTagName (AFieldName) [0].textContent != undefined)
{
return (ARecordNode.getElementsByTagName (AFieldName) [0].textContent) ; // Chrome, FF
}
if (ARecordNode.getElementsByTagName (AFieldName) [0].text != undefined)
{
return (ARecordNode.getElementsByTagName (AFieldName) [0].text) ; // IE
}
return ("unknown") ;
}
catch (Exception)
{
ReportError ("(GetRecordElement): " + Exception.description) ;
}
}
Code to perform the AJAX request:
function GetRecord (s)
{
try
{
ReportStatus ("") ;
var xmlhttp = GetXMLHTTPRequest () ;
if (xmlhttp)
{
xmlhttp.open ("GET", "blahblah.com/AJAXget.asp?...etc", true) ;
if (xmlhttp.overrideMimeType)
{
xmlhttp.overrideMimeType("text/xml") ;
}
xmlhttp.setRequestHeader ("Content-Type", "text/xml; charset="utf-8"") ;
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4)
{
if (xmlhttp.responseXML != null)
{
var xmlDoc = xmlhttp.responseXML;
var ResultNodes = xmlDoc.getElementsByTagName ("Result") ;
if (ResultNodes != null)
{
var PayloadNode = xmlDoc.getElementsByTagName ("Payload") ;
if (PayloadNode != null)
{
var ResultText = ResultNodes [0].firstChild.nodeValue ;
if (ResultText == "OK")
{
ReportStatus (ResultText) ;
var RecordNode = PayloadNode [0].firstChild ;
if (RecordNode != null)
{
UpdateRecordDisplay (RecordNode) ; // eventually calls GetRecordElement
}
else
{
ReportError ("RecordNode is null") ;
}
}
else
{
ReportError ("Unknown response:" + ResultText) ;
}
}
else
{
ReportError ("PayloadNode is null") ;
}
}
else
{
ReportError ("ResultNodes is null") ;
}
}
else
{
ReportError ("responseXML is null") ;
}
}
else
{
ReportStatus ("Status=" + xmlhttp.readyState) ;
}
}
ReportStatus ("Requesting data ...") ;
xmlhttp.send (null) ;
}
else
{
ReportError ("Unable to create request") ;
}
}
catch (err)
{
ReportError ("(GetRecord): " + err.description) ;
}
}
Иногда встречается ошибка javascript … есть null или не является объектом.
Internet Explorer после такой ошибки останавливает дальнейшее выполнение сценария и (при соответствующей настройке) сообщает об ошибке желтым треугольником в левом нижнем углу.
Итак, в чем же дело.. Причем тут Null и объекты?
Очевидное объяснение — скрипт пытается обратиться к переменной, значение которой null, или же это обращение к свойству переменной, которая не является объектом. Все-таки это ошибка javascript-программы.
Частые причины ошибки “есть null или не является объектом”
1. Попытка обратиться к несуществующему свойству объекта:
a=1; alert (a.property);
2. Попытка обратиться к несуществующему элементу массива:
a = []; alert (a[1]);
Internet Explorer в сообщении об ошибке указывает строку, в которой она обнаружена. Рекомендуется проверить все похожие обращения к переменным.
Если Вам известны другие причины появления ошибки “null или не является объектом”- сообщайте в комментарии..
ps. В некоторых WYSIWYG-редакторах в ранних версиях часто встречались такие ошибки…
Метки: javascript
Опубликовано
Четверг, Август 5, 2010 в 12:58 в следующих категориях: Без рубрики.
Вы можете подписаться на комментарии к этому сообщению через RSS 2.0.
Вы можете добавить комментарий, или trackback со своего сайта.
Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)
html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)
ссылка (для отправки по почте)
Всем доброго времени суток.
У меня возникла проблема при реализации скрипта, который делает запрос к MySQL, не обновляя страницу. Нашел пример реализации такого скрипта (http://www.webmascon.com/topic… es/13a.asp), написал подобный на локальном сервере, но при тестировании возникает ошибка.
Строка:21
Символ: 4
Ошибка: ‘response’ есть null или не является объектом
Соответственно, ни какого соединения и обновления данных на странице не происходит.
Помогите мне, пожалуйста. Я уже голову себе сломал %)
Я написал сокращенную версию своего скрипта, чтобы было нагляднее:
HTML5 | ||
|
— это основной файл «test.php». Он формирует страницу и запускает таймер. через каждые 10 сек должен происходить запрос к «js_test.php», и забираться из MySQL очередная запись.
Код «js_test.php»:
PHP | ||
|
Но ни чего не происходит. IE выводит вышеприведенную ошибку через каждые 10 сек.
Очень рассчитываю на вашу помощь. Заранее благодарен.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
Я разрабатываю страницу, которая извлекает изображения из Flickr и Panoramio через поддержку AJAX jQuery.
сторона Flickr работает нормально, но когда я пытаюсь $.get(url, callback)
из Panoramio я вижу ошибку в консоли Chrome:
XMLHttpRequest не удается загрузить http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150 — … Origin null не допускается Access-Control-Allow-Origin.
Если я запрашиваю этот URL из браузера напрямую, он работает нормально. Что происходит, и могу ли я обойти это? Я составляю свой запрос неправильно, или это то, что Panoramio делает, чтобы помешать тому, что я пытаюсь сделать?
Google не обнаружил никаких полезных матчей на сообщение об ошибке.
редактировать
вот пример кода, который показывает проблема:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150';
$.get(url, function (jsonp) {
var processImages = function (data) {
alert('ok');
};
eval(jsonp);
});
});
вы можете запустите пример в интернете.
Изменить 2
спасибо Дарину за его помощь в этом. ПРИВЕДЕННЫЙ ВЫШЕ КОД НЕВЕРЕН. используйте этот код:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150&callback=?';
$.get(url, function (data) {
// can use 'data' in here...
});
});
16 ответов
для протокола, насколько я могу судить, у вас было две проблемы:—18—>
-
вы не передавали спецификатор типа «jsonp» вашему
$.get
, поэтому он использовал обычный XMLHttpRequest. Однако ваш браузер поддерживал CORS (общий доступ к ресурсам Cross-Origin), чтобы разрешить междоменный XMLHttpRequest, если сервер его использовал. Вот где пришла. -
я думаю, вы упомянули, что вы запускали его из файла: / / URL. Есть два способа для заголовков CORS сигнализировать, что междоменный XHR в порядке. Один-послать
Access-Control-Allow-Origin: *
(который, если вы достигли Flickr через$.get
, Они, должно быть, делали), в то время как другой должен был Эхо назад содержимоеOrigin
заголовок. Однако,file://
URLs производят nullOrigin
который не может быть авторизован через echo-back.
первый был решен окольным путем предложением Дарина использовать $.getJSON
. Это немного волшебство, чтобы изменить тип запроса от его значение по умолчанию «json «для» jsonp», если он видит подстроку callback=?
в URL.
это решило второе, больше не пытаясь выполнить запрос CORS от file://
URL-адрес.
чтобы уточнить для других людей, вот простые инструкции по устранению неполадок:
- если вы пытаетесь использовать JSONP, убедитесь, что один из следующих случаев:
- вы используете
$.get
и setdataType
вjsonp
. - вы используете
$.getJSON
и включенcallback=?
в URL.
- вы используете
- если вы пытаетесь выполнить междоменный XMLHttpRequest через CORS…
- убедитесь, что вы тестируете через
http://
. Скрипты, запущенные черезfile://
имеют ограниченную поддержку CORS. - убедитесь, что браузер фактически поддерживает CORS. (Opera и Internet Explorer опаздывают на вечеринку)
- убедитесь, что вы тестируете через
возможно, вам нужно добавить заголовок в вызываемый скрипт, вот что я должен был сделать в PHP:
header('Access-Control-Allow-Origin: *');
Подробнее кросс-доменный AJAX-ОУ, веб-служб (по-французски).
для простого HTML-проекта:
cd project
python -m SimpleHTTPServer 8000
выберите файл.
работает для меня на Google Chrome v5.0.375.127 (я получаю предупреждение):
$.get('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150',
function(json) {
alert(json.photos[1].photoUrl);
});
также я бы рекомендовал вам использовать $.getJSON()
метод вместо этого, как и предыдущий не работает на IE8 (по крайней мере на моей машине):
$.getJSON('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150',
function(json) {
alert(json.photos[1].photoUrl);
});
вы можете онлайн отсюда.
обновление:
теперь, когда вы показали свой код, я вижу с этим проблем. У вас есть как анонимная функция, так и встроенная функция, но оба будут называться processImages
. Вот как работает поддержка JSONP jQuery. Обратите внимание, как я определяю callback=?
чтобы вы могли использовать анонимную функцию. Вы можете прочитать больше об этом в документации.
еще одно замечание: вы не должны звонить эвалу. Параметр, переданный вашей анонимной функции, уже будет проанализирован в JSON с помощью jQuery.
пока запрашиваемый сервер поддерживает формат данных JSON, используйте интерфейс JSONP (JSON Padding). Это позволяет вам делать внешние доменные запросы без прокси-серверов или причудливых заголовков.
нам удалось это через http.conf
файл (отредактирован и перезапущен службой HTTP):
<Directory "/home/the directory_where_your_serverside_pages_is">
Header set Access-Control-Allow-Origin "*"
AllowOverride all
Order allow,deny
Allow from all
</Directory>
на Header set Access-Control-Allow-Origin "*"
, вы можете поставить точный URL.
Если вы выполняете локальное тестирование или вызываете файл из чего-то вроде file://
тогда вам нужно отключить безопасность браузера.
на MAC:
open -a Google Chrome --args --disable-web-security
в моем случае тот же код отлично работал в Firefox, но не в Google Chrome. Консоль JavaScript Google Chrome сказала:
XMLHttpRequest cannot load http://www.xyz.com/getZipInfo.php?zip=11234.
Origin http://xyz.com is not allowed by Access-Control-Allow-Origin.
Refused to get unsafe header "X-JSON"
мне пришлось удалить часть www URL Ajax, чтобы она правильно соответствовала исходному URL-адресу, и тогда она работала нормально.
Не все серверы поддерживают jsonp. Это требует, чтобы сервер установил функцию обратного вызова в его результатах. Я использую это, чтобы получить ответы json с сайтов, которые возвращают чистый json, но не поддерживают jsonp:
function AjaxFeed(){
return $.ajax({
url: 'http://somesite.com/somejsonfile.php',
data: {something: true},
dataType: 'jsonp',
/* Very important */
contentType: 'application/json',
});
}
function GetData() {
AjaxFeed()
/* Everything worked okay. Hooray */
.done(function(data){
return data;
})
/* Okay jQuery is stupid manually fix things */
.fail(function(jqXHR) {
/* Build HTML and update */
var data = jQuery.parseJSON(jqXHR.responseText);
return data;
});
}
Я использую сервер Apache, поэтому я использовал модуль mod_proxy. Включить модули:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
потом добавил:
ProxyPass /your-proxy-url/ http://service-url:serviceport/
наконец, передайте прокси-url вашему скрипту.
в качестве заключительной ноты документация Mozilla явно говорит это
приведенный выше пример завершится ошибкой, если заголовок будет помечен как:
Access-Control-Allow-Origin: *. поскольку Access-Control-Allow-Origin явно упоминает http://foo.пример,
содержимое credential-cognizant возвращается в вызывающий веб
содержание.
Как следствие-это не просто плохая практика, чтобы использовать ‘*’. Просто делать не работать:)
Я также получил ту же ошибку в Chrome (я не проверяла другие браузеры). Это было из-за того, что я двигался дальше. domain.com вместо www.domain.com — … Немного странно ,но я мог бы решить проблему, добавив следующие строки.реврайт. Он перенаправляет domain.com к www.domain.com и проблема была решена. Я ленивый веб-посетитель, поэтому я почти никогда не печатаю www, но, по-видимому, в некоторых случаях это требуется.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/ [R=301,L]
убедитесь, что вы используете последнюю версию jQuery. Мы столкнулись с этой ошибкой для JQuery 1.10.2, и ошибка была решена после использования JQuery 1.11.1
0
автор: Ganesh Kamath — ‘Code Frenzy’
люди,
Я столкнулся с аналогичной проблемой. Но, используя Fiddler, я смог добраться до проблемы. Проблема в том, что URL-адрес клиента, настроенный в реализации CORS на стороне веб-API,не должен иметь косой черты. После отправки запроса через Google Chrome и проверьте TextView на заголовки раздел скрипача, сообщение об ошибке гласит что-то вроде этого:
*»указанное происхождение политики your_client_url:/’ является недопустимым. Он не может заканчиваться косой чертой.»
Это очень странно, потому что он работал без каких-либо проблем в Internet Explorer, но дал мне головную боль при тестировании с помощью Google Chrome.
Я удалил косую черту в коде CORS и перекомпилировал веб-API, и теперь API доступен через Chrome и Internet Explorer без каких-либо проблем. Пожалуйста, попробуй.
спасибо,
Энди!—1—>
в опубликованном решении есть небольшая проблема по CodeGroover выше, где, если вы измените файл, вам придется перезапустить сервер, чтобы фактически использовать обновленный файл (по крайней мере, в моем случае).
Так что поиск немного, я нашел этот использование:
sudo npm -g install simple-http-server # to install
nserver # to use
и тогда он будет служить в http://localhost:8000
.
Cannot get data with XMLHttpRequest (status 0 and responseText is empty):
xmlhttp=new XMLHttpRequest(); xmlhttp.open("GET","http://www.w3schools.com/XML/cd_catalog.xml", true); xmlhttp.onreadystatechange=function() { if(xmlhttp.readyState==4) alert("status " + xmlhttp.status); } xmlhttp.send();
It alerts «status 0».
The same situation with the localhost request (cd_catalog.xml is saved as a local file)
xmlhttp.open("GET","http://localhost/cd_catalog.xml", true);
But with the localhost IP request
xmlhttp.open("GET","http://127.0.0.1/cd_catalog.xml", true);
and with the local file request
xmlhttp.open("GET","cd_catalog.xml", true);
everything is OK (status 200)
What can cause the problem (status=0) with the online request?
PS: Live HTTP Headers shows that everything is OK in all 4 cases:
HTTP/1.1 200 OK Content-Length: 4742
PS2: Apache local web server on VMWare (host OS Win7, Guest OS Ubuntu, Network adapter – NAT). Browser – Firefox.
sdo
6523 silver badges13 bronze badges
asked Feb 15, 2011 at 15:54
9
status is 0 when your html file containing the script is opened in the browser via the file scheme. Make sure to place the files in your server (apache or tomcat whatever) and then open it via http protocol in the browser. (i.e. http://localhost/myfile.html) This is the solution.
YakovL
7,17112 gold badges58 silver badges93 bronze badges
answered Apr 16, 2012 at 11:58
Abhishek_8Abhishek_8
6315 silver badges2 bronze badges
7
The cause of your problems is that you are trying to do a cross-domain call and it fails.
If you’re doing localhost development you can make cross-domain calls — I do it all the time.
For Firefox, you have to enable it in your config settings
signed.applets.codebase_principal_support = true
Then add something like this to your XHR open code:
if (isLocalHost()){
if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
}
}
For IE, if I remember right, all you have to do is enable the browser’s Security setting under «Miscellaneous → Access data sources across domains» to get it to work with ActiveX XHRs.
IE8 and above also added cross-domain capabilities to the native XmlHttpRequest objects, but I haven’t played with those yet.
Greg Dubicki
5,3972 gold badges54 silver badges64 bronze badges
answered Mar 8, 2011 at 1:27
SlammerSlammer
3312 silver badges2 bronze badges
5
Actually make sure your button type is Button not Submit, that caused status conflict where I met recently.
answered Dec 29, 2011 at 17:14
dyuandyuan
2613 silver badges2 bronze badges
1
If the server responds to an OPTIONS method and to GET and POST (whichever of them you’re using) with a header like:
Access-Control-Allow-Origin: *
It might work OK. Seems to in FireFox 3.5 and rekonq 0.4.0.
Apparently, with that header and the initial response to OPTIONS, the server is saying to the browser, «Go ahead and let this cross-domain request go through.»
robsch
9,1148 gold badges61 silver badges96 bronze badges
answered Sep 30, 2011 at 9:40
1
Consider also the request timeout:
Modern browser return readyState=4 and status=0 if too much time passes before the server response.
Alexis Wilke
18.3k10 gold badges79 silver badges144 bronze badges
answered Jun 29, 2016 at 10:56
3
Add setRequestHeader("Access-Control-Allow-Origin","*")
to your server response.
Geo
3,1285 gold badges40 silver badges82 bronze badges
answered May 5, 2013 at 10:44
IvanIvan
711 silver badge1 bronze badge
I had faced a similar problem. Every thing was okay, the «readystate» was 4, but the «status» was 0. It was because I was using a Apache PHP portable server and my file in which I used the «XMLHttpRequest» object was a html file. I changed the file extension to php and the problem was solved.
answered Nov 7, 2011 at 3:16
ReyanReyan
411 bronze badge
Open javascript console. You’ll see an error message there. In my case it was CORS.
answered Dec 29, 2017 at 23:35
JarekczekJarekczek
7,2663 gold badges44 silver badges66 bronze badges
To see what the problem is, when you get the cryptic error 0 go to … | More Tools | Developer Tools (Ctrl+Shift+I) in Chrome (on the page giving the error)
Read the red text in the log to get the true error message. If there is too much in there, right-click and Clear Console, then do your last request again.
My first problem was, I was passing in Authorization headers to my own cross-domain web service for the browser for the first time.
I already had:
Access-Control-Allow-Origin: *
But not:
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization
in the response header of my web service.
After I added that, my error zero was gone from my own web server, as well as when running the index.html file locally without a web server, but was still giving errors in code pen.
Back to … | More Tools | Developer Tools while getting the error in codepen, and there is clearly explained: codepen uses https, so I cannot make calls to http, as the security is lower.
I need to therefore host my web service on https.
Knowing how to get the true error message — priceless!
answered Sep 7, 2018 at 17:11
MayaMaya
4217 silver badges12 bronze badges
1
To answer the question of why http://127.0.0.1/cd_catalog.xml
works while
http://localhost/cd_catalog.xml
doesn’t: Firefox is treating 127.0.0.1 and localhost as two different domains.
answered May 30, 2013 at 10:09
Tomi AarnioTomi Aarnio
2,3461 gold badge19 silver badges13 bronze badges
Here’s another case in which status === 0
, specific to uploading:
If you attach a 'load'
event handler to XHR.upload
, as suggested by MDN (scroll down to the upload part of ‘Monitoring progress’), the XHR object will have status=0
and all the other properties will be empty strings. If you attach the 'load'
handler directly to the XHR object, as you would when downloading content, you should be fine (given you’re not running off localhost).
However, if you want to get good data in your 'progress'
event handlers, you need to attach a handler to XHR.upload
, not directly to the XHR object itself.
I’ve only tested this so far on Chrome OSX, so I’m not sure how much of the problem here is MDN’s documentation and how much is Chrome’s implementation…
answered Apr 18, 2015 at 22:46
ericsocoericsoco
23.9k29 gold badges97 silver badges127 bronze badges
Alex Robinson already (and first) gives the correct answer to this issue. But to elaborate it a little more…
You must add the HTTP response header:
Access-Control-Allow-Origin: *
If you do this, the result is not just ‘might work’, but ‘will work’.
NB What you need to add is an HTTP response header — so you can only do this on a server which you control. It will never be possible to directly fetch http://w3schools.com/XML/cd_catalog.xml from its original URL using an XMLHttpRequest
(as per OP’s question), because that resource does not (at least, not as of 24 Apr 2015) include any such CORS header.
http://en.wikipedia.org/wiki/Cross-origin_resource_sharing gives more info.
answered Apr 24, 2015 at 9:01
MikeBeatonMikeBeaton
3,0483 gold badges34 silver badges44 bronze badges
My problem similar to this was solved by checking my html code. I was having an onclick
handler in my form submit button to a method. like this : onclick="sendFalconRequestWithHeaders()"
. This method in turn calls ajax just like yours, and does what I want. But not as expected, my browser was returning nothing.
Learned From someone’s hardwork, I have returned false in this handler, and solved.
Let me mention that before arriving to this post, I have spent a whole 3-day weekend and a half day in office writing code implementing CORS filters
, jetty config
, other jersey and embedded jetty
related stuff — just to fix this., revolving all my understanding around cross domain ajax requests
and standards stuff. It was ridiculous how simple mistakes in javascript make you dumb.
To be true, I have tried signed.applets.codebase_principal_support = true
and written isLocalHost() **if**
. may be this method needs to be implemented by us, firefox says there is no such
Now I have to clean my code to submit git patch cleanly. Thanks to that someone.
answered Nov 25, 2013 at 8:57
Siva TummaSiva Tumma
1,68712 silver badges23 bronze badges
A browser request «127.0.0.1/somefile.html» arrives unchanged to the local webserver, while «localhost/somefile.html» may arrive as «0:0:0:0:0:0:0:1/somefile.html» if IPv6 is supported.
So the latter can be processed as going from a domain to another.
answered Aug 10, 2015 at 17:00
Alex Robinson and bmju provided valuable information to understand cross-origin issues. I wanted to add that you may need to make an explicit OPTIONS call in your client code before making the desired GET/POST (e.g. against a CORS OAuth service endpoint). Your browser/library may not automatically handle the OPTIONS request. Gruber, this is one of the possible answers to your question.
answered Sep 2, 2015 at 8:08
I had the same problem (readyState was 4 and status 0), then I followed a different approach explained in this tutorial:
https://spring.io/guides/gs/consuming-rest-jquery/
He didn’t use XMLHttpRequest at all, instead he used jquery $.ajax() method:
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="hello.js"></script>
</head>
<body>
<div>
<p class="greeting-id">The ID is </p>
<p class="greeting-content">The content is </p>
</div>
</body>
and for the public/hello.js file (or you could insert it in the same HTML code directly):
$(document).ready(function()
{
$.ajax({
url: "http://rest-service.guides.spring.io/greeting"
}).then(function(data) {
$('.greeting-id').append(data.id);
$('.greeting-content').append(data.content);
});
});
answered Nov 23, 2016 at 11:54
RMDevRMDev
1631 silver badge11 bronze badges
1
I had to add my current IP address (again) to the Atlas MongoDB whitelist and so got rid of the XMLHttpRequest status 0 error
answered Sep 28, 2018 at 17:07
AnjaAnja
4394 silver badges11 bronze badges
bottle app in python:
@route('/mazer2/get', method='POST')
def GetMaze2():
if MazeCore == None: abort(666, "MazeCore поломался :///")
Check()
Comm = request.body.read().decode("utf-8")
Map = MazeCore.GetMaze2(Comm, TestToken2())
response.headers["Access-Control-Allow-Origin"] = "*" #Here ;'-} It helped me
return Map
answered Mar 6, 2021 at 13:49
I had the same problem when I tried to consume some web methods created by python in a flask environment, by XMLHttpRequest.
After inspecting the firefox console, I realised that the cause of problem was Same Origin Policy, which prevents calling web methods of a different ORIGIN (An Origin consists of a 3 part tuple including: protocol, domain, and port number).
For me, the solution was to use CORS, and fortunately there is a python package named flask-cors which I used and everything works fine.
answered Aug 28, 2021 at 18:04
EhsanEhsan
112 bronze badges
I just had this issue because I used 0.0.0.0
as my server, changed it to localhost
and it works.
answered Mar 29, 2019 at 13:45
VadVad
3,9243 gold badges27 silver badges34 bronze badges
Edit: Please read Malvolio’s comments below as this answer’s knowledge is outdated.
You cannot do cross-domain XMLHttpRequests.
The call to 127.0.0.1
works because your test page is located at 127.0.0.1
, and the local test also works since, well… it’s a local test.
The other two tests fail because JavaScript cannot communicate with a distant server through XMLHttpRequest.
You might instead consider either:
- XMLHttp-request your own server to fetch your remote XML content for you (php script, for example)
- Trying to use a service like GoogleAppEngine if you want to keep it full JavaScript.
Hope that helps
answered Feb 15, 2011 at 16:16
Gabriel S.Gabriel S.
1,9412 gold badges20 silver badges30 bronze badges
4
XMLHttpRequest
это API, который предоставляет клиенту функциональность для обмена данными между клиентом и сервером. Данный API предоставляет простой способ получения данных по ссылке без перезагрузки страницы. Это позволяет обновлять только часть веб-страницы не прерывая пользователя. XMLHttpRequest используется в AJAX запросах и особенно в single-page приложениях.
XMLHttpRequest изначально был разработан Microsoft и позже заимствован Mozilla, Apple, и Google. Сейчас он стандартизирован WHATWG. Несмотря на своё название, XMLHttpRequest
может быть использован для получения любых типов данных, не только XML, и поддерживает протоколы помимо HTTP (включая file
и ftp).
Чтобы начать работать с XMLHttpRequest
, выполните этот код:
var myRequest = new XMLHttpRequest();
более детальное описание создание объекта, можно увидеть в разделе Using XMLHttpRequest.
Список методов объекта
XMLHttpRequest(JSObject objParameters); |
---|
void abort(); |
DOMString getAllResponseHeaders(); |
DOMString? getResponseHeader(DOMString header); |
void open(DOMString method, DOMString url, optional boolean async, optional DOMString? user, optional DOMString? password); |
void overrideMimeType(DOMString mime); |
void send(); void send(ArrayBufferView data); void send(Blob data); void send(Document data); void send(DOMString? data); void send(FormData data); |
void setRequestHeader(DOMString header, DOMString value); |
Нестандартные методы |
[noscript] void init(in nsIPrincipal principal, in nsIScriptContext scriptContext, in nsPIDOMWindow ownerWindow); |
[noscript] void openRequest(in AUTF8String method, in AUTF8String url, in boolean async, in AString user, in AString password); |
void sendAsBinary(in DOMString body); Устарело |
Поля объекта
Attribute | Type | Description | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Function? |
Callback — функция, которая вызывается всякий раз, когда поле Внимание: Он не должен использоваться в синхронных |
||||||||||||||||||||
readyState |
unsigned short |
Состояние запроса:
|
||||||||||||||||||||
response |
varies |
Тело сущности запроса. Согласно полю |
||||||||||||||||||||
responseText Только для чтения |
DOMString |
Ответ на запрос в виде строки или null в случае если запросне успешен или ответ ещё не получен. |
||||||||||||||||||||
responseType |
XMLHttpRequestResponseType |
Может использоваться для определения типа ответа.
Note: Starting with Gecko 11.0 |
||||||||||||||||||||
responseXML Только для чтения |
Document? |
Ответ является объектом DOM Примечание: Если сервер не работает с заголовком (не |
||||||||||||||||||||
status Только для чтения |
unsigned short |
Статус ответа на запрос. Равен кодам HTTP (200 — успешно, 404 не найдено, 301 — перенесено навсегда). |
||||||||||||||||||||
statusText Только для чтения |
DOMString |
Строка статуса ответа. В отличи от поля status , эта строкавключает в себя текст — (« 200 OK «, например). |
||||||||||||||||||||
timeout |
unsigned long |
Время в миллисекундах, после которого запрос будет отменён. Значение 0 Примечание: Вы можете не использовать поле timeout |
||||||||||||||||||||
ontimeout |
Function |
Колбэк-функция которая будет вызвана в случае таймаута. |
||||||||||||||||||||
upload |
XMLHttpRequestUpload |
Загрузка (upload process) может отслеживаться обработчиком события. | ||||||||||||||||||||
withCredentials |
boolean |
Определяет что cross-site запрос, согласно Примечание: Не влияет на same-site запросы. Примечание: Начиная с Gecko 11.0 |
Нестандартные свойства
Attribute | Type | Description |
---|---|---|
channel Только для чтения |
nsIChannel |
The channel used by the object when performing the request. This isnull if the channel hasn’t been created yet. In the case ofa multi-part request, this is the initial channel, not the different parts in the multi-part request. Requires elevated privileges to access. |
mozAnon Только для чтения |
boolean |
Если значение равно true, запрос отправляется без куки и заголовков |
mozSystem Только для чтения |
boolean |
Если значение равно true, same origin policy не будут использоваться в |
mozBackgroundRequest |
boolean |
Этот метод не может быть вызван из контекста страницы. Для того Флаг, означающий что запрос от пользователя надо скрыть. Для В случае, если для продолжения запроса нужна какая-то аутентификация, Note: Этот флаг должен быть выставлен до вызова метода |
mozResponseArrayBuffer Вышла из употребления с версии Gecko 6Только для чтения |
ArrayBuffer |
Массив, в который ляжет ответ от сервера, если ответ приходит в виде Javascript массива ([]). В случае, если запрос не удалось завершить, или если запрос не был отправлен, то это поле будет null. |
multipart Вышла из употребления с версии Gecko 22 |
boolean |
This Gecko-only feature was removed in Firefox/Gecko 22. Indicates whether or not the response is expected to be a stream of This enables support for server push; for each XML document that’s Note: When this is set, the |
Конструктор
XMLHttpRequest()
Конструктор создаёт объект XMLHttpRequest. Он должен быть вызван перед обращением к любому методу класса.
Gecko/Firefox 16 добавляет нестандартные параметры в конструктор, для лучшего взаимодействия с режимом инкогнито, (смотри Bug 692677). Установка флага mozAnon
в значение true
создаёт сущность AnonXMLHttpRequest()
описанную в XMLHttpRequest спецификации, но не реализованную не в одном из браузеров (информация сентября 2012).
XMLHttpRequest ( JSObject objParameters );
Параметры (нестандартные)
objParameters
-
Вы можете использовать два флага:
mozAnon
-
Boolean: Использование этого флага уберёт из запроса заголовки origin, и user credentials. Кроме этого, куки не будут отправлены в запросе, если только они не будут добавлены к запросу специально, через метод setRequestHeader.
mozSystem
-
Boolean: Если выставить этот флаг в значение
true
то это позволит делать cross-доменные запросы без необходимости получения специальных заголовков со стороны сервера (CORS). Для использования этого флага необходимо использовать дополнительный флаг*mozAnon: true
, поскольку для отправки запроса на другой домен, нельзя использовать куки и креды пользователя. Этот флаг работает только с привилегированными (одобренными) приложениями; он не сработает с произвольно загруженными страницами.*
Методы
abort()
Отменяет запрос, если он был отправлен.
DOMString getAllResponseHeaders();
Возвращает все заголовки ответа как строку, или null
если ответ не был получен. Для multypart запросов возвращает заголовки текущей части запроса, а не всего канала.
DOMString? getResponseHeader(DOMString header);
Возвращает значение указанного заголовка из полученного ответа, или null
в случает если ответ не получен, или такого заголовка в ответе нет. Возвращаемая строка имеет кодировку UTF.
Примечание: Примечание: Если в ответе есть заголовки с одни названием, то значения этих заголовков будут объеденены в одну строку, разделённую запятой и пробелом.
open()
Инициализирует запрос. Этот метод может (и должен) быть вызван из JavaScript-кода; если необходимо вызвать запрос из нативного кода, то нужно использовать метод openRequest()
.
Примечание: Вызов этого метода из активного запроса (если метод open() или
openRequest() уже были вызваны
) эквивалентно вызову метода abort()
.
void open( DOMString method, DOMString url, optional boolean async, optional DOMString user, optional DOMString password );
Параметры
method
-
HTTP метод отправки сообщения — «GET», «POST», «PUT», «DELETE», и проч.. Ignored for non-HTTP(S) URLs.
url
-
URL адрес, на который будет отправлено сообщение.
async
-
Необязательный boolean параметр, по умолчанию равный
true
. Определяет, будет ли запрос отправлен асинхронно. Если значение равноfalse
, методsend()
вернёт ответ в общем потоке работы приложения (иначе говоря, приложение зависнет на некоторое время), в противном случае, ответ может быть получен только при помощи определённых обработчиков событий. В случае, если используется отправкаmultipart
запроса, то этот атрибут должен бытьtrue
, или будет выброшено исключение.Примечание: Начиная с Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), синхронные запросы объявлены как deprecated, в силу того что все пользователи недовольны тем, что приложение «зависает».
user
-
Необязательный параметр, используется для аутентификации пользователя. По умолчанию, пустая строка.
password
-
Необязательный параметр, используется для аутентификации пользователя. По умолчанию пустая строка.
overrideMimeType()
Переопределяет MIME тип, получаемый от сервера. Это может быть использовано, например, для того чтобы получить и распарсить данные в формате text/xml, даже, если сервер сообщает что это не так. Этот метод должен быть вызван перед вызовом метода send()
.
void overrideMimeType(DOMString mimetype);
send()
Отправляет запрос. Если запрос асинхронный (а по умолчанию это так), этот метод вернёт значение сразу после того как метод вызван.
Примечание: Примечание переводчика: в этом случае, в ответе не будет содержаться информации, которая пришла с сервера, поскольку она ещё не пришла. Для того чтобы получить эту информацию, нужно слушать события загрузки, или использовать promise.
Если запрос синхронный, то метод вернёт значение только после того, как придёт запрос от сервера.
Примечание: все необходимые обработчики событий должны быть установлены перед вызовом send()
.
Примечание: Лучше не использовать параметр ArrayBuffer. Сейчас он не входит в спецификацию XMLHttpRequest
. Вместо него можно использовать ArrayBufferView (смотри таблицу совместимости для различных версий).
void send(); void send(ArrayBuffer data); void send(ArrayBufferView data); void send(Blob data); void send(Document data); void send(DOMString? data); void send(FormData data);
Примечания
Если тип data — Document
, то он будет сериализован перед отправкой. Firefox до версии 3 всегда отправляет такой запрос в кодировке UTF-8; Firefox 3 отправляет данные в той кодировке, которая указаны в body.xmlEncoding
, или UTF-8 если такой информации нет.
If it’s an nsIInputStream
, it must be compatible with nsIUploadChannel
‘s setUploadStream()
method. In that case, a Content-Length header is added to the request, with its value obtained using nsIInputStream
‘s available()
method. Any headers included at the top of the stream are treated as part of the message body. The stream’s MIMEtype should be specified by setting the Content-Type header using the setRequestHeader()
method prior to calling send()
.
The best way to send binary content (like in files upload) is using an ArrayBufferView (en-US) or Blobs (en-US) in conjuncton with the send()
method. However, if you want to send a stringifiable (en-US) raw data, use the sendAsBinary()
(en-US) method instead, or the StringView
Non native typed arrays superclass.
Устанавливает значение заголовка HTTP-запроса. Вы должны вызвать setRequestHeader()
после open()
, но перед send()
. Если данный метод вызывается несколько раз с одним и тем же заголовком, все значения объединяются в один заголовок запроса.
void setRequestHeader( DOMString header, DOMString value );
Параметры
-
Имя заголовка, значение которого будет установлено.
value
-
Значение, заданное как тело заголовка.
Нестандартные методы
init()
Инициализирует объект для использования с C++ кодом.
Предупреждение: Внимание: Этот метод нельзя вызывать из JavaScript.
[noscript] void init( in nsIPrincipal principal, in nsIScriptContext scriptContext, in nsPIDOMWindow ownerWindow );
Параметры
principal
-
Принцип, используемый для запроса; не должен быть
null
. scriptContext
-
Контекст скрипта, используемого для запроса; не должен быть
null
. ownerWindow
-
Окно, связанное с запросом; может быть
null
.
openRequest()
Инициализирует запрос. Этот метод должен использоваться из собственного кода; для инициализации запроса из кода JavaScript вместо этого используйте используйте open()
метод. Смотрите документацию для open()
.
sendAsBinary() Устарело
Вариант метода send()
который посылает бинарные данные.
Примечание: Этот нестандартный метод считается устарелым по состоянию на Gecko 31 (Firefox 31 / Thunderbird 31 / SeaMonkey 2.28), и со временем будет удалён. Взамен может использоваться стандарт метода send(Blob data).
void sendAsBinary( in DOMString body );
Данный метод используется в сочетании с методом readAsBinaryString,
который присутствует в FileReader
(en-US) API, и позволяет прочитать и загрузить файл любого типа (en-US) и превратить необработанные данные в JSON-строку (en-US).
Параметры
body
-
Тело запроса в виде DOMstring. Эти данные конвертированы в строку с однобайтовыми символами с помощью усечения (удаления байта с высоким порядком в каждом символе).
sendAsBinary()
polyfill
Since sendAsBinary()
is an experimental feature, here is a polyfill for browsers that don’t support the sendAsBinary()
method but support typed arrays (en-US).
/*
|*|
|*| :: XMLHttpRequest.prototype.sendAsBinary() Polyfill ::
|*|
|*| https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#sendAsBinary()
|*|
*/
if (!XMLHttpRequest.prototype.sendAsBinary) {
XMLHttpRequest.prototype.sendAsBinary = function (sData) {
var nBytes = sData.length, ui8Data = new Uint8Array(nBytes);
for (var nIdx = 0; nIdx < nBytes; nIdx++) {
ui8Data[nIdx] = sData.charCodeAt(nIdx) & 0xff;
}
/* send as ArrayBufferView...: */
this.send(ui8Data);
/* ...or as ArrayBuffer (legacy)...: this.send(ui8Data.buffer); */
};
}
Примечание: It’s possible to build this polyfill putting two types of data as argument for send()
: an ArrayBuffer
(en-US) (ui8Data.buffer
– the commented code) or an ArrayBufferView
(en-US) (ui8Data
, which is a typed array of 8-bit unsigned integers (en-US) – uncommented code). However, on Google Chrome, when you try to send an ArrayBuffer
, the following warning message will appear: ArrayBuffer is deprecated in XMLHttpRequest.send(). Use ArrayBufferView instead.
Another possible approach to send binary data is the StringView
Non native typed arrays superclass in conjunction with the send()
method.
Notes
- By default, Firefox 3 limits the number of
XMLHttpRequest
connections per server to 6 (previous versions limit this to 2 per server). Some interactive web sites may keep anXMLHttpRequest
connection open, so opening multiple sessions to such sites may result in the browser hanging in such a way that the window no longer repaints and controls don’t respond. This value can be changed by editing thenetwork.http.max-persistent-connections-per-server
preference inabout:config
. - From Gecko 7.0 headers set by setRequestHeader are sent with the request when following a redirect. Previously these headers would not be sent.
XMLHttpRequest
is implemented in Gecko using thensIXMLHttpRequest
,nsIXMLHttpRequestEventTarget
, andnsIJSXMLHttpRequest
interfaces.- When a request reaches its timeout value, a «timeout» event is raised.
Events
onreadystatechange
as a property of the XMLHttpRequest
instance is supported in all browsers.
Since then, a number of additional event handlers were implemented in various browsers (onload
, onerror
, onprogress
, etc.). These are supported in Firefox. In particular, see nsIXMLHttpRequestEventTarget
and Using XMLHttpRequest.
More recent browsers, including Firefox, also support listening to the XMLHttpRequest
events via standard addEventListener
APIs in addition to setting on*
properties to a handler function.
Permissions
When using System XHR via the mozSystem
property, for example for Firefox OS apps, you need to be sure to add the systemXHR
permission into your manifest file. System XHR can be used in privileged or certified apps.
"permissions": {
"systemXHR":{}
}
Совместимость с браузерами
BCD tables only load in the browser
See also
User-1151851215 posted
Hello everybody
We are using the ASP.Net AJAX Framework for http requests to our webservices.
Recently I got this error message out of the blue (Web application running and a window popping up):
**************************************************************************
Microsoft JScript runtime error: ‘a._xmlHttpRequest.readyState’ is null or not an object
**************************************************************************
When I debug with Visual Studio and draw object a to the watch list I see «a» is an object but with «a._xmlHttpRequest» i get :
a._xmlHttpRequest —> Variable uses an Automation type not supported in JScript Error
and with «a._xmlHttpRequest.readyState»
a._xmlHttpRequest.readyState —> a._xmlHttpRequest.readyState’ is null or not an object Error
This is the source drawn out of MS AJAX code:
*****************************************************************************
Sys.Net.XMLHttpExecutor=function()
{
Sys.Net.XMLHttpExecutor.initializeBase(this);
var a=this;
this._xmlHttpRequest=null;
this._webRequest=null;
this._responseAvailable=false;
this._timedOut=false;
this._timer=null;
this._aborted=false;
this._started=false;
this._onReadyStateChange=function()
{
if(a._xmlHttpRequest.readyState===4) <===== Here the error happens.
{
a._clearTimer();
a._responseAvailable=true;
a._webRequest.completed(Sys.EventArgs.Empty);
if(a._xmlHttpRequest!=null)
{
a._xmlHttpRequest.onreadystatechange=Function.emptyMethod;
a._xmlHttpRequest=null
}
}
};
this._clearTimer=function()
{
if(a._
…………..
*****************************************************************************
Is this a bug or a feature? Any ideas what can cause this?
Any tips are welcome. I still have the debugging session open.
Thanks
DeLurk
24.02.2012, 15:29 |
|||
|
|||
Ошибка только в IE генерируется это: <?xml version="1.0" encoding="utf8" standalone="yes"?><response><action>ok</action><kiosk><![CDATA[<tr> <th class="table_header" width="70">№</th> <th class="table_header" width="160"> </th> <th class="table_header" width="160">Адрес</th> <th class="table_header" width="160">Стороны <img style="vertical-align: middle; margin-left: 20px;" src="images/side.png" alt="Ошибка xmlhttprequest есть null или не является объектом" /></th> <th class="table_header" width="390">Информация</th> </tr><tr><td width="70" class="table_num1"><span class="num_kiosk">1</span></td><td width="160" class="table_l1"><img src="/uploads/Products/product_1/thumb_1_16.JPG" class="thumb" /></td><td width="160" class="table_l1">Октябрьский проспект, 16</td><td width="160" class="table_l1"><a class="fancybox" href="/uploads/Products/product_1/1_16.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_a_active.png" /></a><img src="images/side_b.png" /><img src="images/side_c.png" /><a class="fancybox" href="/uploads/Products/product_1/DSC07038.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_d_active.png" /></a><br /><br /><p style="color: #b80000;"><strong>просмотр фото</strong></p></td><td width="390" class="table_l1">Остановка, супермаркет «Глобус», крупный жилой район</td></tr><tr><td width="70" class="table_num1"><span class="num_kiosk">2</span></td><td width="160" class="table_l1"><img src="/uploads/Products/product_2/thumb_DSC04931.JPG" class="thumb" /></td><td width="160" class="table_l1">Профсоюзная, 78</td><td width="160" class="table_l1"><a class="fancybox" href="/uploads/Products/product_2/DSC04931.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_a_active.png" /></a><img src="images/side_b.png" /><img src="images/side_c.png" /><a class="fancybox" href="/uploads/Products/product_2/DSC04932.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_d_active.png" /></a><br /><br /><p style="color: #b80000;"><strong>просмотр фото</strong></p></td><td width="390" class="table_l1">Остановка, супермаркет «Глобус», крупный жилой район</td></tr><tr><td width="70" class="table_num1"><span class="num_kiosk">3</span></td><td width="160" class="table_l1"><img src="/uploads/Products/product_3/thumb_3__3-.JPG" class="thumb" /></td><td width="160" class="table_l1">Калинина, 3</td><td width="160" class="table_l1"><img src="images/side_a.png" /><img src="images/side_b.png" /><img src="images/side_c.png" /><a class="fancybox" href="/uploads/Products/product_3/3__3-.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_d_active.png" /></a><br /><br /><p style="color: #b80000;"><strong>просмотр фото</strong></p></td><td width="390" class="table_l1">Сеть магазинов «продуктовая лавка», магазин «1000 мелочей», парк цирка</td></tr><tr><td width="70" class="table_num1"><span class="num_kiosk">4</span></td><td width="160" class="table_l1"><img src="/uploads/Products/product_4/thumb_4_--.JPG" class="thumb" /></td><td width="160" class="table_l1">Перекресток Кольцова и Упита</td><td width="160" class="table_l1"><a class="fancybox" href="/uploads/Products/product_4/4_--.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_a_active.png" /></a><img src="images/side_b.png" /><img src="images/side_c.png" /><a class="fancybox" href="/uploads/Products/product_4/.___4.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_d_active.png" /></a><br /><br /><p style="color: #b80000;"><strong>просмотр фото</strong></p></td><td width="390" class="table_l1">Новый жилой район, ТЦ «Красная горка»</td></tr><tr><td width="70" class="table_num1"><span class="num_kiosk">5</span></td><td width="160" class="table_l1"><img src="/uploads/Products/product_5/thumb_5__60-.JPG" class="thumb" /></td><td width="160" class="table_l1">Октябрьский проспект, 60</td><td width="160" class="table_l1"><a class="fancybox" href="/uploads/Products/product_5/5__60-.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_a_active.png" /></a><img src="images/side_b.png" /><img src="images/side_c.png" /><a class="fancybox" href="/uploads/Products/product_5/_-_60.JPG"><img alt="Ошибка xmlhttprequest есть null или не является объектом" src="images/side_d_active.png" /></a><br /><br /><p style="color: #b80000;"><strong>просмотр фото</strong></p></td><td width="390" class="table_l1">Магазин «Принто», остановка, салон красоты</td></tr>]]></kiosk><pages><![CDATA[<div class="total_kiosk"><p>Всего 103 киосков</p></div><div class="links_kiosk"><div class="first_btn_address" onclick="getKiosk(0,'table_kirov','pages_kirov','Киров');"><p>‹‹ ‹‹</p></div><div class="btn_address" onclick="getKiosk(0,'table_kirov','pages_kirov','Киров');"><p>‹‹</p></div><div class="btn_address_active"><p id="activepage">1</p></div><div class="btn_address" onclick="getKiosk(1,'table_kirov','pages_kirov','Киров');"><p>2</p></div><div class="btn_address" onclick="getKiosk(2,'table_kirov','pages_kirov','Киров');"><p>3</p></div><div class="btn_address" onclick="getKiosk(1,'table_kirov','pages_kirov','Киров');"><p>››</p></div><div class="first_btn_address" onclick="getKiosk(20,'table_kirov','pages_kirov','Киров');"><p>›› ››</p></div></div>]]></pages></response> |
Всем доброго времени суток.
У меня возникла проблема при реализации скрипта, который делает запрос к MySQL, не обновляя страницу. Нашел пример реализации такого скрипта (http://www.webmascon.com/topic… es/13a.asp), написал подобный на локальном сервере, но при тестировании возникает ошибка.
Строка:21
Символ: 4
Ошибка: ‘response’ есть null или не является объектом
Соответственно, ни какого соединения и обновления данных на странице не происходит.
Помогите мне, пожалуйста. Я уже голову себе сломал %)
Я написал сокращенную версию своего скрипта, чтобы было нагляднее:
HTML5 | ||
|
— это основной файл «test.php». Он формирует страницу и запускает таймер. через каждые 10 сек должен происходить запрос к «js_test.php», и забираться из MySQL очередная запись.
Код «js_test.php»:
PHP | ||
|
Но ни чего не происходит. IE выводит вышеприведенную ошибку через каждые 10 сек.
Очень рассчитываю на вашу помощь. Заранее благодарен.
Я разрабатываю страницу, которая извлекает изображения из Flickr и Panoramio через поддержку AJAX jQuery.
сторона Flickr работает нормально, но когда я пытаюсь $.get(url, callback)
из Panoramio я вижу ошибку в консоли Chrome:
XMLHttpRequest не удается загрузить http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150 — … Origin null не допускается Access-Control-Allow-Origin.
Если я запрашиваю этот URL из браузера напрямую, он работает нормально. Что происходит, и могу ли я обойти это? Я составляю свой запрос неправильно, или это то, что Panoramio делает, чтобы помешать тому, что я пытаюсь сделать?
Google не обнаружил никаких полезных матчей на сообщение об ошибке.
редактировать
вот пример кода, который показывает проблема:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150';
$.get(url, function (jsonp) {
var processImages = function (data) {
alert('ok');
};
eval(jsonp);
});
});
вы можете запустите пример в интернете.
Изменить 2
спасибо Дарину за его помощь в этом. ПРИВЕДЕННЫЙ ВЫШЕ КОД НЕВЕРЕН. используйте этот код:
$().ready(function () {
var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150&callback=?';
$.get(url, function (data) {
// can use 'data' in here...
});
});
16 ответов
для протокола, насколько я могу судить, у вас было две проблемы:—18—>
-
вы не передавали спецификатор типа «jsonp» вашему
$.get
, поэтому он использовал обычный XMLHttpRequest. Однако ваш браузер поддерживал CORS (общий доступ к ресурсам Cross-Origin), чтобы разрешить междоменный XMLHttpRequest, если сервер его использовал. Вот где пришла. -
я думаю, вы упомянули, что вы запускали его из файла: / / URL. Есть два способа для заголовков CORS сигнализировать, что междоменный XHR в порядке. Один-послать
Access-Control-Allow-Origin: *
(который, если вы достигли Flickr через$.get
, Они, должно быть, делали), в то время как другой должен был Эхо назад содержимоеOrigin
заголовок. Однако,file://
URLs производят nullOrigin
который не может быть авторизован через echo-back.
первый был решен окольным путем предложением Дарина использовать $.getJSON
. Это немного волшебство, чтобы изменить тип запроса от его значение по умолчанию «json «для» jsonp», если он видит подстроку callback=?
в URL.
это решило второе, больше не пытаясь выполнить запрос CORS от file://
URL-адрес.
чтобы уточнить для других людей, вот простые инструкции по устранению неполадок:
- если вы пытаетесь использовать JSONP, убедитесь, что один из следующих случаев:
- вы используете
$.get
и setdataType
вjsonp
. - вы используете
$.getJSON
и включенcallback=?
в URL.
- вы используете
- если вы пытаетесь выполнить междоменный XMLHttpRequest через CORS…
- убедитесь, что вы тестируете через
http://
. Скрипты, запущенные черезfile://
имеют ограниченную поддержку CORS. - убедитесь, что браузер фактически поддерживает CORS. (Opera и Internet Explorer опаздывают на вечеринку)
- убедитесь, что вы тестируете через
возможно, вам нужно добавить заголовок в вызываемый скрипт, вот что я должен был сделать в PHP:
header('Access-Control-Allow-Origin: *');
Подробнее кросс-доменный AJAX-ОУ, веб-служб (по-французски).
для простого HTML-проекта:
cd project
python -m SimpleHTTPServer 8000
выберите файл.
работает для меня на Google Chrome v5.0.375.127 (я получаю предупреждение):
$.get('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150',
function(json) {
alert(json.photos[1].photoUrl);
});
также я бы рекомендовал вам использовать $.getJSON()
метод вместо этого, как и предыдущий не работает на IE8 (по крайней мере на моей машине):
$.getJSON('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150',
function(json) {
alert(json.photos[1].photoUrl);
});
вы можете онлайн отсюда.
обновление:
теперь, когда вы показали свой код, я вижу с этим проблем. У вас есть как анонимная функция, так и встроенная функция, но оба будут называться processImages
. Вот как работает поддержка JSONP jQuery. Обратите внимание, как я определяю callback=?
чтобы вы могли использовать анонимную функцию. Вы можете прочитать больше об этом в документации.
еще одно замечание: вы не должны звонить эвалу. Параметр, переданный вашей анонимной функции, уже будет проанализирован в JSON с помощью jQuery.
пока запрашиваемый сервер поддерживает формат данных JSON, используйте интерфейс JSONP (JSON Padding). Это позволяет вам делать внешние доменные запросы без прокси-серверов или причудливых заголовков.
нам удалось это через http.conf
файл (отредактирован и перезапущен службой HTTP):
<Directory "/home/the directory_where_your_serverside_pages_is">
Header set Access-Control-Allow-Origin "*"
AllowOverride all
Order allow,deny
Allow from all
</Directory>
на Header set Access-Control-Allow-Origin "*"
, вы можете поставить точный URL.
Если вы выполняете локальное тестирование или вызываете файл из чего-то вроде file://
тогда вам нужно отключить безопасность браузера.
на MAC:
open -a Google Chrome --args --disable-web-security
в моем случае тот же код отлично работал в Firefox, но не в Google Chrome. Консоль JavaScript Google Chrome сказала:
XMLHttpRequest cannot load http://www.xyz.com/getZipInfo.php?zip=11234.
Origin http://xyz.com is not allowed by Access-Control-Allow-Origin.
Refused to get unsafe header "X-JSON"
мне пришлось удалить часть www URL Ajax, чтобы она правильно соответствовала исходному URL-адресу, и тогда она работала нормально.
Не все серверы поддерживают jsonp. Это требует, чтобы сервер установил функцию обратного вызова в его результатах. Я использую это, чтобы получить ответы json с сайтов, которые возвращают чистый json, но не поддерживают jsonp:
function AjaxFeed(){
return $.ajax({
url: 'http://somesite.com/somejsonfile.php',
data: {something: true},
dataType: 'jsonp',
/* Very important */
contentType: 'application/json',
});
}
function GetData() {
AjaxFeed()
/* Everything worked okay. Hooray */
.done(function(data){
return data;
})
/* Okay jQuery is stupid manually fix things */
.fail(function(jqXHR) {
/* Build HTML and update */
var data = jQuery.parseJSON(jqXHR.responseText);
return data;
});
}
Я использую сервер Apache, поэтому я использовал модуль mod_proxy. Включить модули:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
потом добавил:
ProxyPass /your-proxy-url/ http://service-url:serviceport/
наконец, передайте прокси-url вашему скрипту.
в качестве заключительной ноты документация Mozilla явно говорит это
приведенный выше пример завершится ошибкой, если заголовок будет помечен как:
Access-Control-Allow-Origin: *. поскольку Access-Control-Allow-Origin явно упоминает http://foo.пример,
содержимое credential-cognizant возвращается в вызывающий веб
содержание.
Как следствие-это не просто плохая практика, чтобы использовать ‘*’. Просто делать не работать:)
Я также получил ту же ошибку в Chrome (я не проверяла другие браузеры). Это было из-за того, что я двигался дальше. domain.com вместо www.domain.com — … Немного странно ,но я мог бы решить проблему, добавив следующие строки.реврайт. Он перенаправляет domain.com к www.domain.com и проблема была решена. Я ленивый веб-посетитель, поэтому я почти никогда не печатаю www, но, по-видимому, в некоторых случаях это требуется.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/ [R=301,L]
убедитесь, что вы используете последнюю версию jQuery. Мы столкнулись с этой ошибкой для JQuery 1.10.2, и ошибка была решена после использования JQuery 1.11.1
0
автор: Ganesh Kamath — ‘Code Frenzy’
люди,
Я столкнулся с аналогичной проблемой. Но, используя Fiddler, я смог добраться до проблемы. Проблема в том, что URL-адрес клиента, настроенный в реализации CORS на стороне веб-API,не должен иметь косой черты. После отправки запроса через Google Chrome и проверьте TextView на заголовки раздел скрипача, сообщение об ошибке гласит что-то вроде этого:
*»указанное происхождение политики your_client_url:/’ является недопустимым. Он не может заканчиваться косой чертой.»
Это очень странно, потому что он работал без каких-либо проблем в Internet Explorer, но дал мне головную боль при тестировании с помощью Google Chrome.
Я удалил косую черту в коде CORS и перекомпилировал веб-API, и теперь API доступен через Chrome и Internet Explorer без каких-либо проблем. Пожалуйста, попробуй.
спасибо,
Энди!—1—>
в опубликованном решении есть небольшая проблема по CodeGroover выше, где, если вы измените файл, вам придется перезапустить сервер, чтобы фактически использовать обновленный файл (по крайней мере, в моем случае).
Так что поиск немного, я нашел этот использование:
sudo npm -g install simple-http-server # to install
nserver # to use
и тогда он будет служить в http://localhost:8000
.