Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Не оторбражается изображение в Internet Explorer


Автор: Royan 23.10.2007, 00:04
Очень странное поведение наблюдаю в IE

Есть такой HTML код 

Код

<IMG id="myImage" src="<?php "http://localhost/genimage.php";?>">


Как нетрудно догадаться в файле "genimage.php" генерируется изображение. Причем каждый раз при обращении к "genimage.php" разное.

Я решил сделать так, чтобы при нажатии на ссылку это изображение менялось вот как тут: http://recaptcha.net/learnmore.html 

Правда я пошел более простым путем и просто написал такую функцию:

Код

    function reloadImage() {
        var oImg = document.getElementById("myImage");
        oImg.src = "<?php echo "http://localhost/genimage.php?r=";?>" + Math.random();
    }


Тут может плохо видно, но в общем при нажатии на некую кнопку по которой сменяется изображение происходит вызов reloadImage() внутри которого генерируется уникальный адрес изображения ("http://localhost/genimage.php?r=" + Math.random()). В общем этот метод работает в Firefox и Opera но не работает в IE в котором место изображения отображается белое пятно. При этом метод onload этого подгружаемого изображения (объекта Image) в IE ***не*** отрабатывает

Подскажите, пожалуйста, как мне исправить этот глюк? Может это вовсе не javascript'овый вопрос а проблема с хедарами которые выбрасывает PHP?

PS
При перезагрузке страницы изображение всегда отображается во всех браузерах

Автор: Astraller 23.10.2007, 07:16
Royan, ужас. Изучите хотя-бы основы! PHP вы полняется на сервере и только на сервере!! Нельзя вставлять куски php скриптов в JS код.
В первом случае достаточно написать:
Код

<IMG id="myImage" src="http://localhost/genimage.php">

Во втором же случае тоже не надо мудрить с php!
Код

function reloadImage() {
var oImg = document.getElementById("myImage");
oImg.src = "http://localhost/genimage.php?r=" + Math.random();
}


И наконец запомните JavaScript это НЕ Java!  smile 

Автор: Royan 23.10.2007, 10:50
Astraller, Прошу прощения, я просто несколько модифицировал свой код перед отправкой вопроса на форум поэтому и получилось что в посте у меня нечто невразумительное. Тут только моя вина.
Дело в том что я изначально не сказал что код, который я привожу (в том числе и тот который я случайно пометил как Java) находится в PHP файле поэтому PHP вставки в JS код вполне себе легитимны. Посему ваши исправления это результат выполнения PHP кода.

Однако вопрос остается. 
Для пущего убеждения я написал маленький тест в котором демонстрируется баг/фича Internet Explorer
Код


<html>
  <head>
    <meta http-equiv=Content-Type content="text/html;charset=windows-1251">
  </head>
  <body>
    <script>
    function reloadImage() {
       var oImg = document.getElementById("myImage");
       oImg.src = "http://www.google.com/images/nav_logo3.png";
    }
    </script>

    <img id="myImage" src="http://forum.vingrad.ru/logo/logo.gif">
    <br/><br/>
    <a href="javascript:;" onClick="reloadImage()">Поменять изображение</a>
  </body>
</html>

Автор: pompei 23.10.2007, 11:29
А про кэширование думали?

Автор: Astraller 23.10.2007, 12:35
pompei, url'ы разные. Какое кеширование? smile 

PS Странно это. Я у себя на сайте подобным образом организовывал и все без проблем работает. smile 

Автор: Royan 23.10.2007, 14:53
Astraller, Если все таким же образом то я как Станиславский тебе скажу "Не верю!" Ты можешь привести URL сайта или способ которым ты это это реализовал?

Автор: Astraller 23.10.2007, 15:09
Royan, в личку. Покажу. Проект просто коммерческий. smile

Автор: SelenIT 23.10.2007, 18:04
Royan, попробовал Ваш пример. Результат было поставил меня в тупик своей нелогичностью: все срабатывало, при любых настройках кеширования... но только один раз: стоило почистить кеш и обновить страницу по Ctrl+F5 - все ломалось, по нажатию ссылки браузер не делал ничего, никакого запроса на сервер (смотрел плагином IeHttpHeaders). Обратил внимание, что ссылка подсвечивается как посещенная, подумал, что дело в этом, очистил history - не помогло. И тут обратил внимание на, мягко говоря, нестандартный адрес ссылки;). Стоило заменить адрес на более традиционную "решетку" - все заработало. С добавлением "return !1" в onclick в исходном варианте - тоже.

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

Автор: Royan 23.10.2007, 20:04
SelenIT, Тебе абсолютно заслуженный плюс.
Замечу, однако, что если убрать атрибут href вообще, то все тоже будет работать... вот такие вот дела

Автор: SelenIT 23.10.2007, 20:16
Цитата(Royan @  23.10.2007,  20:04 Найти цитируемый пост)
если убрать атрибут href вообще, то все тоже будет работать...

Это как раз, имхо, не удивительно: <a> без href - это просто строчный элемент (как <span>), не вызывающий никаких переходов. А вот "невидимый виртуальный переход" по javascript-ссылке - действительно загадка...

Автор: Royan 23.10.2007, 22:03
То что я прочитал по этому поводу в совокупности можно описать так. Переход по псевдо протоколу javascript: ставит IE в состояние "ожидания адресации" (pending navigation). В этом состоянии он находится до тех пор пока не происходит его адресация (возможно тут имеет место просто поступление любых данных из JS) Так вот в этом состоянии различная функциональность перестает работать либо перестает работать как ей предписано. В частности как мы убедились перестает работать механизм подгрузки и отображения изображений. То есть это особое состояние в котором поведение браузера не определено.


Автор: SelenIT 23.10.2007, 22:25
Royan, спасибо, кажется, я тоже http://groups.google.com/group/comp.lang.javascript/tree/browse_frm/thread/29f5250ebcbfca76/ed05d2132efcf609?rnum=1&_done=%2Fgroup%2Fcomp.lang.javascript%2Fbrowse_frm%2Fthread%2F29f5250ebcbfca76%2Fed05d2132efcf609%3Ftvc%3D1%26#doc_afbceca4dd685741:
Цитата(Richard Cornford)

IE treats the activation of a javascript
pseudo-protocol HREF as navigation, and when used the browser goes into
a 'waiting state' pending the arrival of a replacement for the content.
In this state many previously available browser facilities are
withdrawn, including GIF animation and image swapping.

The normal strategy for dealing with this issue is to never use a
javascript pseudo-protocol HREF that will not result in the replacement
of the contents of the current page (so never to execute a function for
its side effect).


В моем приблизительном переводе:
Цитата

IE воспринимает активацию псевдопротокола javascript: как переход по ссылке, при этом браузер переходит в состояние ожидания поступления нового контента на замену текущему. В этом состоянии многие возможности браузера отключаются, в т.ч. GIF-анимация и смена картинок.

Обычная стратегия для обхода этой проблемы - никогда не использовать href="javascript:...", не приводящих к замене содержимого текущей страницы (т.е. не вызывать функцию ради побочного эффекта).


Имхо, логично. Корнфорд, все-таки, голова!

Вот так объединенными усилиями мы действительно докопались до истины! smile

Автор: Astraller 24.10.2007, 07:59
SelenIT
Цитата

Обычная стратегия для обхода этой проблемы - никогда не использовать href="javascript:...", не приводящих к замене содержимого текущей страницы (т.е. не вызывать функцию ради побочного эффекта).

А как быть с Opera которая иногда обновляет страницу при переходепо href="#"?? И при этом естественно не выполняется onClick smile 

Автор: SelenIT 24.10.2007, 08:06
Astraller
Цитата(Astraller @  24.10.2007,  07:59 Найти цитируемый пост)
иногда обновляет

Можно уточнить - какие версии, при каких настройках?

Цитата(Astraller @  24.10.2007,  07:59 Найти цитируемый пост)
как быть

Имхо, стандартно - onclick="doSomething();return!1" (или return doSomething() с return false в самой ф-ции - как удобнее).

Автор: Astraller 24.10.2007, 08:44
SelenIT, ааа.... тьфу :( return то я изабыл. Сори. Беру свои слова в зад.

Автор: NNaarreekk 28.10.2007, 00:35
Лучше сделать чтоб при наведении на обект курсор становился рукой.

И в статусе чисто, и таких проблем не возникнет.... 

Автор: SelenIT 28.10.2007, 00:44
NNaarreekk, и еще чтоб цвет менялся и подчеркивание появлялось/исчезало, как у ссылки smile

Вообще, в принципе, здраво. Единственное "но" - иногда ссылка незаменима, когда нужна базовая функциональность при отключенном JS...

Автор: NNaarreekk 3.11.2007, 00:29
Да если JS отключен то сайт  вообше не будет работать...

Правда для этого можно ставить проверку на включенность.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)