Форум программистов, компьютерный форум, киберфорум
JavaScript: API
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/34: Рейтинг темы: голосов - 34, средняя оценка - 4.50
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,071
1
Chrome Extention

Не работает XMLHttpRequest

22.10.2015, 13:26. Показов 6921. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно вот простейший код:
Javascript
1
2
3
4
5
6
var text = document.getElementById("text");
var xhr = new XMLHttpRequest();
xhr.open("POST", 'test.html', false);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send("text=test");
if (xhr.responseText) scale.innerHTML = xhr.responseText;
На обычной html странице такой код работает. Если вставить его в расширение Chrome, ничего не работает. Выполнение останавливается на строке xhr.send("text=test");
В чём дело?
Сразу говорю: в манифесте расширения test.html прописана, остальные скрипты работают, проблема только с описанным.

Добавлено через 21 час 26 минут
Так, концепция немного изменилась... Оказывается, описанный выше код не работает в Chrome ни в расширении, ни в отдельной html странице. Но при этом отлично работает в IE. Что-то я совсем теперь растерялся....
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2015, 13:26
Ответы с готовыми решениями:

Неправильно работает объект XMLhttprequest
Здравствуйте, почему-то неправильно работает объект XMLhttprequest. Страница со слайдами, при...

XMLHttpRequest
Здравствуйте, нужна помощь по XHR (XMLHttpRequest)! Допустим отправляю GET запрос на /msg.php ...

XMLHttpRequest
Вопрос про XMLHttpRequest — надо post запросом отправить картинку с моего сервера на другой сервер.

XMLHttpRequest()
Здравствуйте,уважаемые ,программисты,у меня такой вот вопрос,пытаюсь отправить на сервер...

4
30 / 30 / 29
Регистрация: 11.10.2014
Сообщений: 268
22.10.2015, 14:18 2
scale вы откуда нарисовали?

Javascript
1
2
3
4
5
6
7
8
9
var text = document.getElementById("text");
var xhr = new XMLHttpRequest();
xhr.open("POST", 'test.html', false);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send("text=test");
if (xhr.readyState == 4 && xhr.status == 200) {
var response = xhr.responseText;
console.log( response );
}
1
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,071
22.10.2015, 14:47  [ТС] 3
Enough1987, да это просто опечатка. Я на память код перепечатывал, после многочасовых мучений с этим скриптом бошка совсем не варила

Добавлено через 8 минут
А решение я нашёл, хотя и не очень понял его суть
Решение проблемы оказалось на стороне сервера. Надо было перед ответом добавить
PHP
1
header("Access-Control-Allow-Origin: *");
Взял я это здесь
Если кто-нибудь ещё объяснит подробно, что это значит, буду очень благодарен
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
22.10.2015, 15:29 4
Лучший ответ Сообщение было отмечено ChildOfFlowers как решение

Решение

Цитата Сообщение от ChildOfFlowers Посмотреть сообщение
Оказывается, описанный выше код не работает в Chrome ни в расширении, ни в отдельной html странице. Но при этом отлично работает в IE.
и скорее всего, каком-то старом IE, верно? Я почти уверен, что ваша проблема связана с same origin policy

Не по теме:

дурацкий перевод на русский этого термина, хотя слово origin в таком контексте, пожалуй, сложно перевести. Вообщем, сути оно не отражает, это именно Same Origin, а не Same Domain

, если кратко, то нельзя посылать произвольные ajax-запросы на другой домен, порт или протокол просто так. причина простая: некий "нехороший" домен (сайт) может отправить от вашего имени запрос, например, к vk.com, а поскольку вы там наверняка там (ну или не вы, а кто-то другой) аутентифицированы, пароль он у вас не спросит

Не по теме:

куки отправляются автоматически, иначе бы вам пришлось сильно попотеть, чтобы реализовать ajax для своей админки на сайте, например

соответственно, серией запросов к vk.com и их обработкой, парсингом (этим отличается ajax, например, от запроса простой картинки, и даже отправкой формы -- это можно делать и без дополнительных разрешений) злоумышленник на клиентской стороне сможет считать ваши сообщения, а потом отправить к себе на сервер.
Понятно, что конкретно vk наверняка имеет и дополнительные меры защиты, или какой-нибудь яндекс, но реализовывать такое иногда очень сложно.
В расширениях, как и во всяких джаво-андроидах, обычно используются списки разрешений -- манифесты. Вы декларируете, что вам нужно, например, обращаться к такому-то сайту, или вообще ко всем сайтам, и тогда вы будете иметь на это право, без дополнительных условий. Однако, эти же декларации будут показаны и пользователю, во время установки этого расширения. Предположим, вы ставите себе приложение-фонарик, или будильник, а он от вас запрашивает право на доступ ко всем сайтам или личным контактам -- это будет странно, зачем ему это? В то же время, отсутствие таких деклараций гарантирует (ну в идеальном мире, без уязвимостей самих операционных систем и браузеров), что это приложение не сможет воспользоваться этим API.
Код
Access-Control-Allow-Origin: *
это крайне нерекомендуемая настройка, с точки безопасности. Это позволяет слать кросдоменные запросы на ваш домен отовсюду, то есть если вы на сервере не защитились хотя бы от того кейса, который я указал, с вашего сайта могут стянуть личную информацию у зарегистрированного человека, в том числе и у вас, если вы зайдете на какой-то "плохой" сайт. причем, если вы не логирруете заголовки Referer и Origin, вы об этом даже никогда не узнаете, и не узнаете, какой именно сайт стянул вашу инфу, потому что запросы будут идти непосредственно с клиента, то есть от вас.
По настройке CORS можете почитать в той же википедии, достаточно указать только доверенные вам домены. для использования звездочки в этом заголовке должны быть очень веские основания, и вы, как говорят, обязательно должны понимать, что делаете. Обычно ее туда ставят во всяких публичных API, где действительно запрос может идти с любого домена, и в фоне -- все данные и так открыты, и их нет смысла скрывать.
Но при разработке расширений, я бы рекомендовал воспользоваться манифестами. Как это конкретно сделать -- не спрашивайте, меня хватило всего на пару юзер-скриптов небольших для каких-то сайтов, и то это было очень давно и неправда в конце концов, я не фронтендер, и javascript знаю довольно поверхностно.
Первой же ссылкой нагуглил статью на хабре http://habrahabr.ru/post/198652/ , вроде бы там показан более-менее полный цикл разработки.
1
15 / 14 / 9
Регистрация: 16.04.2012
Сообщений: 1,071
22.10.2015, 19:13  [ТС] 5
NEbO, Спасибо большое за разъяснение. С вашей помощью разобрался и переделал всё как надо. В манифесте у меня изначально был указан нужный адрес. Но, как оказалось, он был указан в неправильной форме. Я всего лишь не придал значения буквам www в адресе, за что поплатился двумя днями поисков.
0
22.10.2015, 19:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2015, 19:13
Помогаю со студенческими работами здесь

XMLHTTPRequest
В общем, задача такая: Необходимо с помощью JavaScript (возможно с помощью XMLHTTPRequest)...

XMLHTTPRequest
Скажите, возможно ли за один заход получить 3 файла через XMLHTTPRequest? у меня есть 3 файла,...

XMLHTTPREQUEST
function fun() { var xmlhttp = getXmlHttp(); xmlhttp.open('GET',...

XMLHttpRequest
Всем доброго времени суток. У меня возникла проблема при реализации скрипта, который делает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru