Получить JSON с другого домена и отобразить на странице.
Добрый день, делаю виджет для Win7 сам по себе виджет это обычная HTML страничка.
по ссылке: http://tsw.ru.forexprostools.com/api...6&timeframe=60 возвращается json. я для теста сделал в блокноте страничку и в ней написал код: <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script> <script language="JavaScript"> function Refresh(){ $.get("http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60", ParseAnswer(data)); }; function ParseAnswer (data) {data = $.parseJSON(data); $("#question").text(data.summaryLast); } </script> </head> <body onLoad="Refresh()"> </body> </html> Открываю ее в Chrome и получаю в консоли ошибку: XMLHttpRequest cannot load http://tsw.ru.forexprostools.com/api...6&timeframe=60. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. Подскажите как правильно сделать? Вообще цель получить HTML который при открытии отобразит содержимое "summaryLast" и будет каждые 10 секунд обновлять страничку. |
Цитата:
Положи на сервер свой php-скрипт, который будет делать запрос и отдавать результат. И из js обращайся к нему. |
Сервера нет :( Да и настраивать сервер ради одной цифры на страничке как то не хочется.
Может быть можно как то не через ajax я в html не сильно разбираюсь... ? |
VVi3ard,
<!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script> $(document).ready(function() { function Refresh() { $.get("http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60", ParseAnswer); }; Refresh() function ParseAnswer(data) { data = $.parseJSON(data); $("#question").text(data["2186"]["summaryLast"]); } window.setInterval(Refresh, 10000) }); </script> </head> <body> <div id="question"></div> </body> </html> |
рони, не будет это работать, нужен JSONP.
VVi3ard, виджет для Win, тогда нафик вам нужны хромы и прочие? |
laimas,
работает в ie,если не с инета. Цитата:
и наконец танец с бубнами :) <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <script src="http://code.jquery.com/jquery-latest.js"></script> <script>jQuery.ajax = function (d) { var b = location.protocol, e = RegExp(b + "//" + location.hostname), f = "http" + (/^https/.test(b) ? "s" : "") + "://query.yahooapis.com/v1/public/yql?callback=?"; return function (a) { var c = a.url; if (/get/i.test(a.type) && !/json/i.test(a.dataType) && !e.test(c) && /:\/\//.test(c)) { a.url = f; a.dataType = "json"; a.data = { q: 'select * from html where url="{URL}" and xpath="*"'.replace("{URL}", c + (a.data ? (/\?/.test(c) ? "&" : "?") + jQuery.param(a.data) : "")), format: "xml" }; !a.success && a.complete && (a.success = a.complete, delete a.complete); var b = a.success; a.success = function (a) { b && b.call(this, { responseText: (a.results[0] || "").replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, "") }, "success") } } return d.apply(this, arguments) } }(jQuery.ajax);</script> <script> $(document).ready(function() { function Refresh() { $.ajax({ url: 'http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60', type: 'GET', success: ParseAnswer })}; Refresh() function ParseAnswer(data) { data = $('<div/>',{'html': data.responseText}).text(); data = JSON.parse(data); $("#question").text(data["2186"]["summaryLast"]);; } window.setInterval(Refresh, 10000) }); </script> </head> <body> <div id="question"></div> </body> </html> |
https://ru.wikipedia.org/wiki/JSONP
В jQuery нужно указать этот тип данных. А вообще ведь под систему, и хватило бы ресурсов IE и одного iframe. |
>работает в ie,если не с инета.
Ну так можно и так тогда, попробовать выполнить это: chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security Но зачем это все? |
laimas,
то есть можно сделать рабочий код на jQuery без танцев с бубнами? если да то можно ли увидеть код? сам я не смог применить JSONP к данному случаю |
Можно конечно, описание есть у разработчиков, в сети описаний и примеров тоже полно, вот первое что под руки попало.
Ну ведь пишется виджет для системы Win, то смысл в поддержке браузеров? Если не знать какого либо языка серьезного, ну можно использовать VBS. Не зная его, ну можно JS + IE + IFRAME как контейнер, и без проблем, зачем выпендриваться. :) |
laimas,
спасибо за ссылку но видимо моих знаний недостаточно чтоб воспользоваться тем кодом. |
Так надо чтобы и запрашиваемый сервер эту технологию поддерживал. Запросив по данному адресу jsonp проблем с доступом не будет, но будут проблемы:
SyntaxError: missing ; before statement {"2186":{"row":{"last":"57,760","ma":"\u041f.... Под Win, значит хватит: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <hta:application applicationname="myapp" border="thin" borderstyle="normal" caption="yes" icon="icon.ico" scroll="no" showintaskbar="yes" singleinstance="yes" maximizebutton="yes" contextmenu="yes" windowstate="maximize" selection="yes" innerborder ="no" /> <meta http-equiv="msthemecompatible" content="no" /> <meta http-equiv="X-UA-Compatible" content="IE=11" /> <script> function f(d) { alert(d) } </script> </head> <body> <iframe style="display:none" src="http://tsw.ru.forexprostools.com/api.php?action=refresher&pairs=2186&timeframe=60" name="frame" onload="f(frame.document.body.innerHTML)"></iframe> </body> </html> Сохранить с расширением .hta, вот и весь Ajax. ) |
Это пример jsonp с поддержкой сервером:
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script> $(function() { $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data){ $.each(data.items, function(i,item){ $("<img/>").attr("src", item.media.m).appendTo("#ims"); if ( i == 4 ) return false; }); }); }); </script> </head> <body> <div id="ims"> </div> </body> </html> |
laimas,
причину и решение расказал danik.js, ещё во 2 посте других решений видимо нет. |
То о чем говорил danik.js, было бы идеальным, но у автора нет сервера, но для того что он хочет ему эти проблемы и не мешают, если он только сам их не захочет. )
|
Вложений: 1
В итоге сделал часть скрипта на VBS (исходники гаджета прилагаю)
То чего хотел добился все работает четко. Возникла новая проблема. хочу теперь выводить текст: из тега "technicalSummary" но он в json кодировке, не могу понять как силами VBS его перевести в обычный текст... (Напомню что я делаю гаджет для win7) Вот функция на VBS Function objXML_onreadystatechange() If (objXML.readyState = 4) Then 'msgbox objXML.statusText If (objXML.status = 200) Then s = objXML.responseText StartUSD = InStr(1,s,"summaryLast") USDS = Mid(s,StartUSD+14,6) StartTime = InStr(StartUSD,s,"time") TimeS = Mid(s,StartTime+18,8) StartText = InStr(1,s,"technicalSummary")+19 EndText = InStr(StartText,s,"""") TextS = Mid(s,StartText,EndText-StartText) 'ResText = json_decode(TextS) document.getElementById("summaryLast").innerHTML = USDS document.getElementById("Time").innerHTML = TimeS else 'msgbox objXML.statusText document.getElementById("summaryLast").innerHTML = "" 'убираем индикатор загрузки End If End If End Function Нужно тарабарщину из TextS превратить в нормальный текст... |
Может быть можно как то эту тарабарщину из VBS вывести в HTML и уже там как то при рендеренге страницы заменить на обычный текст с помощью json_decode.
|
json_decode - это в чем?
JSON в разных средах http://json.org/, и увы в VBS нужно писать парсер, есть на git PS. А подключить JS-библиотеку json2.js, и не париться? |
Цитата:
|
JSON.parse(TextS)
После Mid() у вас должен быть валидный json. |
Цитата:
Вот если бы можно было описать функцию на JS в HTML и потом вызвать ее из VBS... |
Вообще под виндой можно данные получать через ActiveX используя WinHttpRequest
Цитата:
|
>Не работает в VBS нет объекта JSON.
Значит не подключен скрипт. >Вот если бы можно было описать функцию на JS в HTML и потом вызвать ее из VBS... А что вообще должен из себя представлять этот виджет? |
Цитата:
Я прикрепил исходник виджета можете попробовать сами. (Нужно сменить расширение с ZIP на .gadget или распаковать в папку: %USERPROFILE%\AppData\Local\Microsoft\Windows Sidebar\Gadgets |
Цитата:
Сам виджет работает и устраивает меня на 90% но хотелось бы теперь расширить его возможности добавив вывод остальной информации которую отдает сервис. Эту ссылку я вытащил из кода HTML виджета (для браузера) там много всего лишнего да и не удобно постоянно в браузер смотреть. Я понимаю что близок к разгадке но вот знаний не хватает, я java программист от веба и VBS далек... Можете установить виджет себе и посмотреть как он работает... |
Цитата:
Или его нужно подключить в HTML? |
У вас же исходник это html, вы же в нем подключаете и js свой. Ссылка на git, это не декодер, а кодер. Где-то на нем был и декодер, вернее конвертер json в xml, но что-то не нашел, уберите то, что из него взяли.
В html подключайте, например, отсюда http://ajax.cdnjs.com/ajax/libs/json...3/json2.min.js. Но вот что интересно. Вы сами урезаете строку, а если сервер изменит структуру массива, ведь тогда ничего не получится. А зная что вам надо, может тогда проще рег. выражением получить, и зачем json? PS. СБ РФ имеет сервисы, и там можно получить курсы валют в хml, может проще это использовать? |
Ответ от сервера приходит в таком виде:
{"2186":{"row":{"last":"56,381","ma":"\u041a\u0443 \u043f\u0438\u0442\u044c","ma_class":"greenFont"," clock":"<span class=\"newSiteIconsSprite greenClockIcon\"> <\/span>"},"arrowBoxClass":"upArrow","summaryLast":"5 6,381","summaryName":"USD\/RUB","summaryNameAlt":"USD\/RUB","summaryChange":"-1,037 (-1,81%)","summaryChangeClass":"redFont","technicalS ummary":"\u041a\u0443\u043f\u0438\u0442\u044c","te chnicalSummaryClass":"buy","maBuy":6,"maSell":6,"t iBuy":6,"tiSell":2},"time":"2015-03-26 08:30:06 GMT"} Я выделяю: technicalSummary и получаю такой текст: \u041a\u0443\u043f\u0438\u0442\u044c Задача превратить это в обычный текст. Я попробую подключить http://ajax.cdnjs.com/ajax/libs/json...3/json2.min.js. и обратится к его методам из скрипта VBS. |
Часовой пояс GMT +3, время: 03:11. |