Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как узнать что у пользователя отключены картинки ? (https://javascript.ru/forum/misc/5151-kak-uznat-chto-u-polzovatelya-otklyucheny-kartinki.html)

micscr 20.09.2009 09:54

Как узнать что у пользователя отключены картинки ?
 
Всем привет.
Пишу меню на картинках, а если они отключены,
то хочу не сдвигать текст.
Как из JS узнать что отключены картинки?
Спасибо.

Gvozd 20.09.2009 12:19

img_load=false;
document.getElementsByTagName('img')[0].onload=function(
img_load=true;
){}
window.onload=(){
if(img_load==false){
//картинки не загружены
}
}

возможно как-то так
но не уверен а проверять лень сейчас
только мне кажется что ваша проблема(хотч не могу сказать точно, так как вы почти ничего не сказали о ней) решается правильной версткой

micscr 20.09.2009 16:16

Спасибо Gvozd работает Ваш метод.

У меня пункт меню - картинка, которая идет фоном divа, а текст в диве
сдвинут на left=-9999px (метода - с сайта Попова). Там говорят надпись нужна для поисковых роботов да и если картинки отключены - сделаю left=5px, чтоб видно что-то было пользователю.

И еще вопрос чтоб тему не создавать новую в этом же контексте.
Вот код:
function two()
{
       var obj=document.getElementById('yyy');// div - пункт меню
	if (obj) {
	var img=new Image();
	img.src='bfon30.jpg'; // та картинка что нужна
	//alert(img.width); //- по умолчанию верные размеры
	//alert(img.height);
	obj.style.height=img.height+'px'; // Задаю ячейке
	obj.style.width=img.width+'px';  // верные размеры
	obj.style.backgroundImage='url("bfon30.jpg")'; // вставляю фон ячейке
	}
}

Так появляется нормально позиционированный пункт меню.
Одно беспокоит :
var img=new Image();img.src='bfon30.jpg';//(1)

- здесь я подгрузил уже в браузер картинку, а тут:
obj.style.backgroundImage='url("bfon30.jpg")';//(2)

походу второй раз будет грузиться картинка? Или нет(может быть в буфере браузера она уже)?
Хотелось бы как-то назначить второму первое.

Gvozd 20.09.2009 20:46

Цитата:

Сообщение от micscr
походу второй раз будет грузиться картинка? Или нет(может быть в буфере браузера она уже)?

если картинка первым кодом успеет загрузится, то для второго кода она возможно будет взята из кеша.
для того чтобы гарантировать что картинка будет загружена к моменту выполнения второго кода, надо поместить его в обработчик события onload объекта рисунка
вопрос в том, что даже в таком случае нельзя гарантировать что браузер не полезет скачивать рисунок по второму разу
гарантировать можно только в случае, если создан HTML-объект рисунка, и затем вставляется в DOM-дерево
можно повысить шанс кеширования, при помощи заголовков с сервера
только у меня вопрос по этому коду:
зачем нужен код (1)?
по сути ничего полезного в данном контексте он не делает
кеширование в пределах одного блока просто не сделает пользы, даже если бы оно имело место быть
Цитата:

Сообщение от micscr
Хотелось бы как-то назначить второму первое.

поясните-не понял

micscr 21.09.2009 09:25

Цитата:

Сообщение от Gvozd (Сообщение 30508)
1)
зачем нужен код (1)?
по сути ничего полезного в данном контексте он не делает
2)
Хотелось бы как-то назначить второму первое.
поясните-не понял

1)
Я пишу класс чтоб в него добавлялись только такие данные:
уровень меню(к кому относится), фон(наша картинка), текст, ссылка на обработчик. Только такие данные заносятся и obj.vivodmenu(); - меню готовенькое на экране.(пока только 3-ех уровневое - думаю больше не надо)
Пункт меню у меня - картинка с надписью, и узнать величину блока div {position:absolute} можно только по размерам картинки:
var img=new Image();     img.src='bfon30.jpg';     obj.style.height=img.height+'px';

для этого создаю картинку.

2) Если бы картинка шла не фоном, я бы добавил в див картинку потомка и написал:
newimage.src=img.src
использовал бы уже загруженную.
А тут
obj.style.backgroundImage='url("bfon30.jpg")';

нужно backgroundImage передать строку и как загруженную уже картинку использовать не знаю.

Gvozd 21.09.2009 09:39

Цитата:

Сообщение от micscr
можно только по размерам картинки

не обратил внимания сразу
Цитата:

Сообщение от micscr
newimage.src=img.src
использовал бы уже загруженную.

далеко не факт, что картинка будет из кеша взята
я же написал, что гарантировать это нельзя.особенно, если вы не помещаете этот код в обработчик события onload рисунка-прелоадера
Цитата:

Сообщение от micscr
нужно backgroundImage передать строку

что-то вроде этого?
obj.style.backgroundImage='url("'+img.src+'")';

но загрузку из кеша гарантировать все равно нельзя
впрочем как и предзагрузку(что рисунок будет получен до того момента, как мы решим выяснить его размеры)
лучше всего делать так(на кеширование пофиг, но зато вычисление размеров будет верно работать когда на сервер поместите свой код)
function two()
{
       var obj=document.getElementById('yyy');// div - пункт меню
    if (obj) {
    var img=new Image();
	img.onload=function()
		{
		//тут рисунок уже гарантировано загружен, и можно выяснять его размеры
		//тут создается замыкание, и поэтому img продолжает быть видимым
		//alert(img.width); //- по умолчанию верные размеры
		//alert(img.height);
		obj.style.height=img.height+'px'; // Задаю ячейке
		obj.style.width=img.width+'px';  // верные размеры
		obj.style.backgroundImage='url("'+img.src+'")';// вставляю фон ячейке
		}
    img.src='bfon30.jpg'; // та картинка что нужна
    }
}

micscr 21.09.2009 09:50

Да так буду делать.
У меня кнопки будут инициализироваться по ходу анализа страницы (
<javascript> в head). Там буду создавать объект и в нем new Image.
А вывод меню будет в onload body.
onload body - это же последнее событие когда все onload элементов уже отработали, или это только для элементов документа, а не new Image()?

Gvozd 21.09.2009 10:15

Цитата:

Сообщение от micscr
onload body - это же последнее событие когда все onload элементов уже отработали, или это только для элементов документа, а не new Image()?

не могу сказать наверняка. скорее всего нет
погуглите

в любом случае, событие загрузки может наступить до загрузки вообще какого-либо из рисунков. по нажатию кнопки "остановить" пользователем
поэтому лучше подстраховатся

даже в таком случае я не совсем понял как вы собираетесь организовать код?
в таком виде, главное чтобы ваша функция two() вызывалась после того, как появится упоминаемый в ней div
остальное-необязательно

micscr 21.09.2009 11:13

Все спасибо, дальше уже сам.
Меню на основе текста в дивах уже у меня написано,
теперь хочу с картинками поуниверсальней
(как на сайте http://www.eurovision.tv/page/news/moscow2009)


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