Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Почему скрипт работает только в Опере? (https://javascript.ru/forum/xhtml-html-css/36575-pochemu-skript-rabotaet-tolko-v-opere.html)

evgenij-1963 20.03.2013 11:35

Почему скрипт работает только в Опере?
 
Есть скрипт, выводящий картинки наград на форуме (в профилях пользователей), результат работы которого виден только в Опере. В Хроме, Мозилле и IE ничего не видно. Как исправить код, чтобы все отображалось?
Вот этот код:
var awardsProfile = {
	uid: false,
	
	init: function () {
		if (navigator.userAgent.indexOf('MSIE') == -1) {
			document.addEventListener('DOMContentLoaded', function () {awardsProfile.start();}, false);
		}
		else {
			this.start();
		}
	},
	
	start: function () {
		JsHttpRequest.query('jsloader.php?loader=awards', {action: 'medals', users: [this.uid], profile: 'yes'},
			function (data, text) {awardsProfile.printMedals(data, text);}, false);
	},
	
	printMedals: function (data, text) {
		var div = document.getElementById('awards');
		var a, img;
		
		for (id in data.medals[this.uid]) {
			if (id = id.match(/\d+/)) {
				id = id[0];
				
				a = document.createElement('a');
				a.href = 'tools.php?action=awards&do=award&id=' + id;
				a.target = '_blank';
				a.title = data.info[id][0];
				
				img = document.createElement('img');
				img.src = data.info[id][1];
				a.appendChild(img);
			}
			else {
				a = document.createElement('a');
				a.href = 'tools.php?action=awards&do=show&member=' + this.uid;
				a.target = '_blank';
				a.innerHTML = data.medals[this.uid].a;
			}
			
			div.appendChild(a);
		}
	}
};

awardsProfile.init();

рони 20.03.2013 12:47

Цитата:

Сообщение от evgenij-1963
start();

для начала измените название функции на любое другое во всех местах скрипта где это название используется

evgenij-1963 20.03.2013 23:09

Переименование start() ничего не изменяет.
Скрипт в первом посте показан полностью. А его вызов происходит из php.
$show_awards = '';
if ($fm->exbb['awards']) {
	$fm->_Link .= "\n" . '<script type="text/javascript" language="JavaScript" src="modules/awards/javascript/awardsProfile.js" defer="true"></script>' .
		"\n" . '<script type="text/javascript" language="JavaScript">' .
		"\n awardsProfile.uid = {$user_id};" .
		"\n</script>";
}


Как сделать, чтобы скрипт из первого поста работал во всех браузерах?

рони 20.03.2013 23:23

Цитата:

Сообщение от evgenij-1963
a.innerHTML = data.medals[this.uid].a;

а вот эта a с точкой не лишняя?

danik.js 21.03.2013 06:58

Цитата:

Сообщение от evgenij-1963
defer="true"

Цитата:

Сообщение от evgenij-1963
document.addEventListener('DOMContentLoaded'

Если у скрипта выставлен атрибут defer, то он будет загружен после загрузки документа и срабатывания DOMContentLoaded. Поэтому во всех браузерах, не имеющих MSIE в строке юзерагента, скрипт не выполнится, ибо DOMContentLoaded уже произошел и второй раз не произойдет. Так что либо убрать defer, либо в скрипте вызывать this.start() вне зависимости от браузера, либо проверять document.readyState и ждать DOMContentLoaded только если он не 'complete'.

evgenij-1963 23.03.2013 15:59

Удаление атрибута defer помогло частично, скрипт теперь выполняется во всех основных браузерах, кроме IE.
danik.js, +

danik.js 23.03.2013 17:14

Можно просто опустить скрипт вниз body, перед закрывающим </body>


Часовой пояс GMT +3, время: 19:37.