🏠 Home 

Versions 4pda

Вывод версий приложений в Избранном 4pda, показ обновленных приложений


Install this script?
  1. // ==UserScript==
  2. // @name Versions 4pda
  3. // @namespace http://4pda.to/forum/index.php
  4. // @version 1.6.1
  5. // @description:ru Вывод версий приложений в Избранном 4pda, показ обновленных приложений
  6. // @author Azat-777
  7. // @icon http://s.4pda.to/kkRM7z1nbI3gbG5E7r0a561qtdKnE2GlKhz1ipnv.png
  8. // @match http*://4pda.to/forum/index.php?act=fav*
  9. // @match http*://4pda.to/forum/index.php?showtopic=*
  10. // @grant GM_xmlhttpRequest
  11. // @license MIT
  12. // @history:ru 26.07.2017: допиливание мелочей
  13. // @history:ru 31.07.2017: расширение функционала скрипта: подробная информация о каждом пользователе в топиках
  14. // @history:ru 04.08.2017: добавлено мигание 'NEW'
  15. // @history:ru 02.01.2018: небольшие правки кода
  16. // @history:ru 10.05.2018: изменение списка обновленных приложений
  17. // @history:ru 11.05.2018: мелкие правки и исправления
  18. // @history:ru 20.05.2018: добавлено удаление пробелов в начале и конце названий версий, чтобы из-за пробелов версия не определялась как новая
  19. // @history:ru 16.08.2018: теперь обновления не исчезают с обновлением страницы, для ручного скрытия обновлений добавлена кнопка
  20. // @history:ru 17.08.2018: правка вчерашних ошибок, добавление мелочей (title и переход к последнему непрочитанному сообщению в теме
  21. // @history:ru 17.08.2018: обновленного приложения); реализация скрытия обновлений по одному: убрад мигание NEW для обновлений, т.к. уже неактуально
  22. // @history:ru 20.08.2018: починен показ кнопки скрытия отдельного обновления; в консоли выводится объем загруженого XHR-запросами траффика
  23. // @history:ru 06.05.2019: кроме слова 'версия' другой текст, если он был, не удалялся, поправлено
  24. // @history:ru 01.06.2019: слово 'версия' не заменялось на 'v.', если после него не было пробела. Недоработка в регулярках. Поправлено
  25. // @history:ru 02.06.2019: добавлена функция отключения проверки обновлений для выбранных приложений (могут быть ошибки)
  26. // @history:ru 14.02.2020: исправлена ошибка, при которой выводился текст на месте версии
  27. // @history:ru 05.07.2022: исправлена ошибка в коде, из-за которой таблица с обновленными версиями приложений появлялась снова после скрытия
  28. // @history:ru 09.06.2023: мелкие и незначительные правки для обеспечения полной работоспособности скрипта, наверное...
  29. // @description Вывод версий приложений в Избранном 4pda, показ обновленных приложений
  30. // ==/UserScript==
  31. (function() {
  32. 'use strict';
  33. //============================================================
  34. // получение ссылки текущей страницы
  35. var URL = window.document.URL;
  36. //log(URL);
  37. //============================================================
  38. // удаляем рекламу и центрируем логотип 4pda
  39. var tbody = document.getElementsByTagName('tbody')[0],
  40. td = tbody.getElementsByTagName('td');
  41. td[1].remove();
  42. td[0].align = 'center';
  43. //============================================================
  44. var favURL = '4pda.to/forum/index.php?act=fav', i,
  45. head = document.getElementsByTagName('head')[0];
  46. //var topicURL = 'http://4pda.to/forum/index.php?showtopic=';
  47. // спойлер с объявлениями всегда скрыт
  48. if(document.querySelector('#gc_1, #go_1')) {
  49. document.querySelector('#go_1').style.display = 'none';
  50. document.querySelector('#gc_1').style.display = 'none';
  51. }
  52. var l = 0, // счетчик
  53. totalKB = 0,
  54. totalMB = 0;
  55. function log(text) {
  56. return console.log(text);
  57. }
  58. // Избранное
  59. if (~URL.indexOf(favURL))
  60. {
  61. //localStorage
  62. //localStorage.clear();
  63. //============================================================
  64. // модифицирование встроенной функции модерации тем в своем избранном
  65. var savedIDs,
  66. form = document.querySelector('#fav-sel-form'),
  67. select = form.querySelector('select'),
  68. option = document.createElement('option'),
  69. values = '';
  70. option.value = 'not_show_updates';
  71. option.innerHTML = 'Не уведомлять об обновлениях (mod)';
  72. select.insertBefore(option, select.firstChild);
  73. // сохранение IDов выбранных тем в localStorage
  74. option.onclick = function() {
  75. checkSavedIDs();
  76. if(savedIDs == '-1') {
  77. values = form.querySelector('input').value;
  78. } else {
  79. values = savedIDs + ',' + form.querySelector('input').value;
  80. }
  81. values = values.split(',');
  82. values = unique(values);
  83. localStorage.setItem('savedIDs', values);
  84. checkBan();
  85. }
  86. // удаление из массива одинаковых IDов
  87. function unique(arr) {
  88. var obj = {};
  89. for (var i = 0; i < arr.length; i++) {
  90. var str = arr[i];
  91. obj[str] = true; // запомнить строку в виде свойства объекта
  92. }
  93. return Object.keys(obj); // или собрать ключи перебором для IE8-
  94. }
  95. checkSavedIDs();
  96. function checkSavedIDs() {
  97. if(localStorage.getItem('savedIDs') === null) {
  98. localStorage.setItem('savedIDs', '-1');
  99. }
  100. savedIDs = localStorage.getItem('savedIDs');
  101. savedIDs = savedIDs.split(',');
  102. }
  103. // добавление в строке названий приложений их версий
  104. var ver;
  105. // находим таблицу
  106. var tbl = document.getElementsByClassName('ipbtable')[0];
  107. var tbody2 = tbl.getElementsByTagName('tbody')[0];
  108. var _tr = tbody2.getElementsByTagName('tr');
  109. // запихиваем в tr нужные нам строки таблицы
  110. var tr = [], id;
  111. for(i=0; i<_tr.length; i++)
  112. {
  113. if (_tr[i].hasAttribute('data-item-fid')) { // отсортировываем из таблицы только темы
  114. tr.push(_tr[i]); // запихиваем в массив tr
  115. }
  116. }
  117. var trLength = tr.length
  118. var name = []; // названия тем
  119. for (i=0; i<trLength; i++)
  120. {
  121. var tmp = tr[i].getElementsByTagName('td')[1].getElementsByTagName('span')[0].getElementsByTagName('a')[0];
  122. id = tr[i].getAttribute('data-item-fid');
  123. getVersion(tmp.getAttribute('href'), i, id);
  124. //getVersion(tmp.href, i);
  125. name.push(tmp);
  126. }
  127. //=====================================================
  128. // добавление счетчика с количеством новых версий приложений
  129. var count = 0;
  130. var main_tbl = document.createElement('table');
  131. main_tbl.id = 'main_tbl';
  132. main_tbl.innerHTML = `<tbody><tr><td id="one" style="vertical-align: top;"></td> <td id="two" style="vertical-align: top;"></td></tr></tbody>`;
  133. var _span = document.createElement('span');
  134. _span.style.color = 'black';
  135. var _span2 = document.createElement('span');
  136. _span2.style.color = 'black';
  137. var navstrip = document.getElementById('navstrip');
  138. //=====================================================
  139. var app_name,
  140. saveToHideName = [],
  141. saveToHideVer = [];
  142. /*_new = ' <mytag class="new" style="color: red"><b>NEW</b></mytag>',*/
  143. function getVersion(link, i, id)
  144. {
  145. var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest;
  146. var xhr = new XHR();
  147. xhr.open('GET', link, true);
  148. xhr.send();
  149. xhr.onload = function()
  150. {
  151. if(this.readyState === 4)
  152. {
  153. if (this.status === 200)
  154. {
  155. var response = xhr.responseText;
  156. var parser = new DOMParser();
  157. var doc = parser.parseFromString(response, 'text/html');
  158. var tbl = doc.getElementsByClassName('ipbtable');
  159. for (var j=0; j<tbl.length; j++)
  160. {
  161. if (tbl[j].hasAttribute('data-post'))
  162. {
  163. var tbody = tbl[j].getElementsByTagName('tbody')[0],
  164. tr2 = tbody.getElementsByTagName('tr')[1],
  165. td = tr2.getElementsByTagName('td')[1],
  166. div = td.getElementsByClassName('postcolor')[0],
  167. span = div.getElementsByTagName('span');
  168. for (var k=0; k<span.length; k++)
  169. {
  170. // версии приложений
  171. if (span[k].getAttribute('style') == 'font-size:12pt;line-height:100%')
  172. {
  173. if (~span[k].innerHTML.toLowerCase().indexOf('верси'))
  174. {
  175. // замена
  176. var replace_ver = span[k].innerHTML,
  177. alt_ver, t;
  178. // если тема не была открыта
  179. if (~name[i].innerHTML.indexOf('<strong>'))
  180. {
  181. replace_ver = replace_ver.toLowerCase().replace(/[А-Яа-я\s]*верси[ия]:[\s]*/, 'v.').replace(/<[\/]*b[r]*>/g, '').trim();
  182. if(~replace_ver.indexOf('v.')) {
  183. alt_ver = replace_ver;
  184. } else {
  185. alt_ver = '---';
  186. }
  187. var alt_name;
  188. alt_name = name[i].innerHTML.replace(/<[\/]*strong>/g, '');
  189. // если приложение в списке игнорируемых, т.е. не проходит проверку на обновления
  190. t = true;
  191. for(var l=0; l<savedIDs.length; l++) {
  192. if(id == savedIDs[l]) {
  193. t = false;
  194. getBannedApps(alt_name, alt_ver, id);
  195. //continue;
  196. }
  197. }
  198. // если приложение не в игноре + сравнение версий: текущей полученной и сохраненной в локальном хранилище
  199. if (t && alt_ver.localeCompare(localStorage.getItem(alt_name)) !== 0) {
  200. showNotif(alt_name, alt_ver);
  201. //console.log(name[i].innerHTML, alt_ver);
  202. }
  203. }
  204. // если тема была открыта и просмотрена
  205. else
  206. {
  207. replace_ver = replace_ver.toLowerCase().replace(/<b>[А-Яа-я\s]*верси[ия]:[\s]*/, 'v.').replace(/<[\/]*b>/g, '').trim();
  208. if(~replace_ver.indexOf('v.')) {
  209. alt_ver = replace_ver;
  210. } else {
  211. alt_ver = '---';
  212. }
  213. // если приложение в списке игнорируемых, т.е. не проходит проверку на обновления
  214. t = true;
  215. for(l=0; l<savedIDs.length; l++) {
  216. if(id == savedIDs[l]) {
  217. t = false;
  218. getBannedApps(name[i].innerHTML, alt_ver, id);
  219. //continue;
  220. }
  221. }
  222. // если приложение не в игноре + сравнение версий: текущей полученной и сохраненной в локальном хранилище
  223. if (t && alt_ver.localeCompare(localStorage.getItem(name[i].innerHTML)) !== 0 ) {
  224. showNotif(name[i].innerHTML, alt_ver);
  225. }
  226. }
  227. // вывод обновленных приложений вверху
  228. function showNotif(alt_name, alt_ver) {
  229. hideBtn.style.display = 'inline'; // показываем скрытую кнопку, если есть обновления
  230. //replace_ver += _new; // прибавляем тэг 'NEW' для новой версии
  231. count++;
  232. var goto = '<a href="'+link+'&amp;view=getnewpost"><img src="//4pda.to/s/PXtiWhZDsz1g8WshSfmv6ItmpiBfFE4lDMF4ZupTkMv.gif" alt=">N" title="Перейти к первому непрочитанному" border="0"></a> '
  233. app_name = goto + '<a href="'+link+'" title="Перейти к первому сообщению">'+alt_name + '</a>';
  234. saveToHideName.push(alt_name);
  235. saveToHideVer.push(alt_ver);
  236. showUpdates(app_name, alt_ver);
  237. }
  238. // если replace_ver содержит готовый шаблон "v.xxx", добавляем его к названию приложения
  239. if(~replace_ver.indexOf('v.')) {
  240. replace_ver = '<font color="#8A2BE2"> ' + replace_ver + '</font>'; // добавление цвета для наглядности
  241. name[i].innerHTML += replace_ver;
  242. }
  243. }
  244. break;
  245. }
  246. }
  247. break;
  248. }
  249. }
  250. }
  251. }
  252. };
  253. xhr.onerror = function() {
  254. log('onerror');
  255. alert('Ошибка');
  256. };
  257. xhr.onloadend = function(event) {
  258. //log('onloadend');
  259. totalKB += (event.loaded/####); // подсчет загруженного траффика
  260. totalMB += (event.loaded/####/####);
  261. if(++l === trLength) {
  262. addEvent(); // вешаем обработчик событий строки (появление/скрытие кноки "Скрыть")
  263. hideApp(); // скрытие строки с обновленным приложением
  264. console.log('Скачано XHR-запросами:', totalKB.toFixed(2), 'КБ |', totalMB.toFixed(2), 'МБ'); // вывод объема скачанного
  265. }
  266. };
  267. xhr.onprogress = function(event) {
  268. //log('onprogress');
  269. };
  270. }
  271. // переопределяем стиль для кнопок
  272. var btnStyle = document.createElement('style');
  273. btnStyle.type = 'text/css';
  274. var _s = `
  275. .myBtn {
  276. display: inline-block;
  277. font-family: arial,sans-serif;
  278. font-size: 10px;
  279. font-weight: bold;
  280. color: rgb(68,68,68);
  281. text-decoration: none;
  282. user-select: none;
  283. padding: .1em 1.2em;
  284. outline: none;
  285. border: 1px solid rgba(0,0,0,.1);
  286. border-radius: 2px;
  287. background: rgb(245,245,245) linear-gradient(#f4f4f4, #f1f1f1);
  288. transition: all .218s ease 0s;
  289. }
  290. .myBtn:hover {
  291. color: rgb(24,24,24);
  292. border: 1px solid rgb(198,198,198);
  293. background: #f7f7f7 linear-gradient(#f7f7f7, #f1f1f1);
  294. box-shadow: 0 1px 2px rgba(0,0,0,.1);
  295. }
  296. .myBtn:active {
  297. color: rgb(51,51,51);
  298. border: 1px solid rgb(204,204,204);
  299. background: rgb(238,238,238) linear-gradient(rgb(238,238,238), rgb(224,224,224));
  300. box-shadow: 0 1px 2px rgba(0,0,0,.1) inset;
  301. }`;
  302. var _st = document.createTextNode(_s);
  303. btnStyle.appendChild(_st);
  304. head.appendChild(btnStyle);
  305. //navstrip.appendChild(_span);
  306. navstrip.appendChild(main_tbl);
  307. var one = document.querySelector('#main_tbl #one'),
  308. two = document.querySelector('#main_tbl #two');
  309. one.appendChild(_span);
  310. two.appendChild(_span2);
  311. _span.innerHTML = 'Обновлений: <font id="_cnt" color="red">' + count + '</font> <input id="hideBtn" class="myBtn" type="button" value="Скрыть обновления" style="display: none;" /> <br/>' +
  312. `<table class="_tbl" style="border-collapse: collapse; border: 0px">
  313. <thead> <tr> <th class="brown-right-line">#</th> <th class="brown-right-line">Название</th> <th>Версия</th> </tr> </thead>
  314. <tbody> </tbody>
  315. </table>`;
  316. var _tbl = document.querySelector('._tbl'),
  317. _tbody = _tbl.querySelector('tbody'),
  318. _cnt = document.querySelector('#_cnt'),
  319. n = 0;
  320. _tbl.style.display = 'none';
  321. var tblStyle = document.createElement('style');
  322. tblStyle.type = 'text/css';
  323. var s = `
  324. ._tbl th {
  325. color: brown; background-color: white; text-align: center; padding: 2px; letter-spacing: 0px;
  326. }
  327. ._tbl td {
  328. font-size: 10px; padding: 0 5px;
  329. }
  330. ._tbl .brown-right-line {
  331. border-right: 1px solid;
  332. }
  333. ._tbl .black-right-line {
  334. border-right: 1px solid;
  335. }`;
  336. var st = document.createTextNode(s);
  337. tblStyle.appendChild(st);
  338. head.appendChild(tblStyle);
  339. // кнопка скрытия обновлений вручную
  340. var hideBtn = document.querySelector('#hideBtn');
  341. hideBtn.onclick = function() {
  342. hideBtn.style.display = 'none';
  343. // сразу сохраняем обновленные версии в память, чтобы при следующем обновлении не всплыли в таблице обновлений
  344. for(var i=0; i<saveToHideName.length; i++) {
  345. localStorage.setItem(saveToHideName[i], saveToHideVer[i]);
  346. }
  347. // скрываем таблицу с обновлениями и обнуляем счетчик
  348. _tbl.style.display = 'none';
  349. count = 0;
  350. _cnt.innerHTML = count;
  351. for(; _tbody.querySelectorAll('tr').length > 0;) {
  352. _tbl.deleteRow(1);
  353. }
  354. }
  355. _span2.innerHTML = '<div id="ban"> <input id="showBanList" class="myBtn" type="button" value="Показать ЧС" /> <input id="clearBanList" class="myBtn" type="button" value="Очистить ЧС" disabled /> </div>' +
  356. `<table class="_tbl" id="ban_tbl" style="border-collapse: collapse; border: 0px; display: none;">
  357. <thead> <tr> <th class="brown-right-line">#</th> <th class="brown-right-line">Название</th> <th class="brown-right-line">Версия</th> <th>ID темы</th> </tr> </thead>
  358. <tbody id="tbody2"> </tbody>
  359. </table>`;
  360. checkBan();
  361. function checkBan() {
  362. var tb = document.querySelector('#tbody2');
  363. if(savedIDs.length > 0 && savedIDs[0] !== '-1') {
  364. _span2.style.display = '';
  365. } else {
  366. _span2.style.display = 'none';
  367. }
  368. }
  369. var showBanList = document.querySelector('#showBanList'),
  370. clearBanList = document.querySelector('#clearBanList'),
  371. ban_tbl = document.querySelector('#ban_tbl');
  372. showBanList.onclick = function() {
  373. if(ban_tbl.style.display == 'none') {
  374. ban_tbl.style.display = 'block';
  375. showBanList.value = 'Скрыть ЧС';
  376. clearBanList.disabled = false;
  377. clearBanList.style.textDecoration = '';
  378. } else {
  379. ban_tbl.style.display = 'none';
  380. showBanList.value = 'Показать ЧС';
  381. clearBanList.disabled = true;
  382. clearBanList.style.textDecoration = 'line-through';
  383. //clearBanList.style.setProperty("text-decoration", "line-through");
  384. }
  385. }
  386. clearBanList.style.textDecoration = 'line-through';
  387. clearBanList.onclick = function() {
  388. localStorage.setItem('savedIDs', '-1');
  389. checkSavedIDs();
  390. //log(savedIDs);
  391. }
  392. // добавлению в таблицу скрытых приложений, их версии и id их темы
  393. var num = 0;
  394. function getBannedApps(app_name, ver, id) {
  395. num++;
  396. var _tbody2 = document.querySelector('#tbody2');
  397. var row =_tbody2.insertRow(-1),
  398. cell1 = row.insertCell(-1),
  399. cell2 = row.insertCell(-1),
  400. cell3 = row.insertCell(-1),
  401. cell4 = row.insertCell(-1),
  402. cell5 = row.insertCell(-1);
  403. row.className = 'myTr';
  404. cell1.className = 'black-right-line one';
  405. cell2.className = 'black-right-line';
  406. cell3.className = 'black-right-line';
  407. cell1.innerHTML = num;
  408. cell2.innerHTML = app_name;
  409. cell3.innerHTML = ver;
  410. cell4.innerHTML = id;
  411. cell5.innerHTML = '<input class="myBtn hidden" type="button" value="Удалить" style="display: none;">';
  412. }
  413. // показ количества обновлений и вывод их в таблице
  414. function showUpdates(app_name, ver)
  415. {
  416. _tbl.style.display = 'block';
  417. n++;
  418. var row = _tbody.insertRow(-1),
  419. cell1 = row.insertCell(-1),
  420. cell2 = row.insertCell(-1),
  421. cell3 = row.insertCell(-1),
  422. cell4 = row.insertCell(-1);
  423. row.className = 'myTr';
  424. cell1.className = 'black-right-line one';
  425. cell2.className = 'black-right-line';
  426. cell1.innerHTML = n; _cnt.innerHTML = count;
  427. cell2.innerHTML = app_name;
  428. cell3.innerHTML = ver;
  429. cell4.innerHTML = '<input class="myBtn hidden" type="button" value="Скрыть" style="display: none;">';
  430. }
  431. function addEvent() {
  432. var myTr = document.querySelectorAll('.myTr');
  433. for(var i=0; i<myTr.length; i++) {
  434. myTr[i].addEventListener('mouseover', function showButton() {
  435. this.querySelector('.hidden').style.display = 'block';
  436. });
  437. myTr[i].addEventListener('mouseout', function hideButton() {
  438. this.querySelector('.hidden').style.display = 'none';
  439. });
  440. }
  441. }
  442. function hideApp() {
  443. var hBut = document.querySelectorAll('.myBtn.hidden');
  444. for(var i=0; i<hBut.length; i++) {
  445. hBut[i].onclick = function() {
  446. var n = this.parentNode.parentNode.firstChild.innerHTML
  447. if(this.value === 'Скрыть') {
  448. var name = this.parentNode.parentNode.children[1].children[1].innerHTML,
  449. ver = this.parentNode.parentNode.children[2].innerHTML;
  450. localStorage.setItem(name, ver);
  451. // сброс # таблицы и удаление строк(и)
  452. _tbl.deleteRow(n);
  453. let num = _tbl.querySelectorAll('td.one');
  454. // если было скрыто последнее обновление, скрываем шапку таблицы и кнопку "Скрыть обновления"
  455. if(num.length === 0) {
  456. _tbl.style.display = 'none';
  457. hideBtn.style.display = 'none';
  458. }
  459. for(var j=0; j<num.length; j++) {
  460. num[j].innerHTML = j+1;
  461. }
  462. _cnt.innerHTML = j;
  463. } else {
  464. let id = this.parentNode.parentNode.children[3].innerHTML,
  465. arr = localStorage.getItem('savedIDs');
  466. arr = arr.split(',');
  467. for(let k=0; k<arr.length; k++) {
  468. if(id === arr[k]) {
  469. arr.splice(k, 1);
  470. }
  471. }
  472. if(arr.length !== 0) {
  473. localStorage.setItem('savedIDs', arr);
  474. } else {
  475. localStorage.setItem('savedIDs', '-1');
  476. }
  477. // сброс # таблицы и удаление строк(и)
  478. ban_tbl.deleteRow(n);
  479. let num = ban_tbl.querySelectorAll('td.one');
  480. // если было скрыто последнее обновление, скрываем шапку таблицы и кнопку "Скрыть обновления"
  481. if(num.length === 0) {
  482. ban_tbl.style.display = 'none';
  483. var banBtns = document.querySelector('#ban');
  484. banBtns.style.display = 'none';
  485. }
  486. for(j=0; j<num.length; j++) {
  487. num[j].innerHTML = j+1;
  488. }
  489. }
  490. }
  491. }
  492. }
  493. //==========================================================================
  494. // мигание 'NEW' // уже неактуально
  495. /*function mig()
  496. {
  497. var isRed = true;
  498. var nw = document.querySelectorAll('.new');
  499. var dln = nw.length;
  500. if (dln !== 0)
  501. {
  502. var morganie = setInterval(function() {
  503. if (isRed)
  504. {
  505. for (i=0; i<dln; i++)
  506. {
  507. nw[i].style.color = 'blue';
  508. }
  509. isRed = false;
  510. }
  511. else
  512. {
  513. for (i=0; i<dln; i++)
  514. {
  515. nw[i].style.color = 'red';
  516. }
  517. isRed = true;
  518. }
  519. }, 300);
  520. }
  521. }*/
  522. }
  523. else
  524. {
  525. // Топики
  526. var post = document.querySelectorAll('.postdetails > center'),
  527. userLink = document.getElementsByClassName('normalname'),
  528. link = [], // собираем все ссылки на профили
  529. ulLength = userLink.length;
  530. for (i=0; i<ulLength; i++)
  531. {
  532. getUserData(userLink[i].querySelector('a').getAttribute('href'), i);
  533. }
  534. //==========================================================================
  535. var data0, data1, data2, data3; // пол, город, дата рождения, местное время
  536. // создание области для новых данных
  537. var div = document.createElement('div');
  538. div.style.border = '1px solid lightblue';
  539. div.style.padding = '5px';
  540. div.id = 'myDiv';
  541. // Стиль для новой области
  542. var style = document.createElement('style');
  543. style.type = 'text/css';
  544. var h = '#myDiv:hover {background: PaleTurquoise; color: blue; font-size: 10pt;}';
  545. var hover = document.createTextNode(h);
  546. style.appendChild(hover);
  547. //head = document.getElementsByTagName('head')[0];
  548. head.appendChild(style);
  549. function getUserData(link, i) {
  550. var XHR = ("onload" in new XMLHttpRequest()) ? XMLHttpRequest : XDomainRequest;
  551. var xhr = new XHR();
  552. xhr.open('GET', link, true);
  553. xhr.send();
  554. xhr.onload = function()
  555. {
  556. if(this.readyState === 4)
  557. {
  558. if (this.status === 200)
  559. {
  560. var response = xhr.responseText;
  561. var parser = new DOMParser();
  562. var doc = parser.parseFromString(response, 'text/html');
  563. var main = doc.getElementsByClassName('info-list width1 black-link')[0];
  564. main.style.marginLeft = 0;
  565. main.style.paddingLeft = 0;
  566. main.style.display = 'block';
  567. main.style.listStyle = 'none';
  568. var t = main.querySelectorAll('li'),
  569. tt = '';
  570. for (var l=0; l<t.length; l++)
  571. {
  572. tt += t[l].innerHTML.replace(/<[^>]+>/g,'').replace(/(Город:)/, '$1 ').replace(/(юзера:)/, '$1 ').replace(/(рождения:)/, '$1 ') + '<br/>';
  573. }
  574. insertData(tt, i);
  575. }
  576. }
  577. };
  578. xhr.onerror = function() {
  579. log('error');
  580. alert('Ошибка');
  581. };
  582. xhr.onloadend = function(event) {
  583. //log('onloadend');
  584. totalKB += (event.loaded/####); // подсчет загруженного траффика
  585. totalMB += (event.loaded/####/####);
  586. if(++l === ulLength) {
  587. log('Скачано XHR-запросами:', totalKB.toFixed(2), 'КБ |', totalMB.toFixed(2), 'МБ'); // вывод объема скачанного
  588. }
  589. };
  590. }
  591. //==========================================================================
  592. function insertData(data0, i) {
  593. div.innerHTML = data0;
  594. post[i].appendChild(div.cloneNode(true));
  595. }
  596. }
  597. })();