настройка прокрутки некорректно работает в браузерах, отличных от IE, после загрузки изображения (JavaScript / DOM); проблема синхронизации с innerHTML

У меня неприятные проблемы с синхронизацией javascript.

К вашему сведению, страница представляет собой файл jsp, и к указанной странице прикреплен отдельный файл js и файл CDN jQuery. В целях устранения неполадок я удалил весь ненужный контент и код и вставил то, что мне нужно, в отдельные файлы jsp и js для устранения этой конкретной проблемы.

Если бы я мог где-нибудь отобразить html и js, было бы здорово. А пока я опишу это. На странице есть две кнопки: одна для загрузки изображения, а вторая для переключения функции «масштабирования» (подробнее об этом позже). Пользователь нажимает кнопку, которая загружает изображение с помощью DOM, в частности, innerHTML. Это изображение окружено горизонтальной и вертикальной полосами прокрутки. Когда пользователь включает функцию «масштабирования», изображение записывает положение щелчка мыши в событии onclick. Итак, когда это включено, пользователь нажимает на изображение, и загружается более крупная версия того же изображения, опять же, с использованием DOM и innerHTML. Самый последний шаг, самый важный, с использованием положения мыши, полосы прокрутки будут фокусироваться и центрироваться на выбранной точке (с помощью scrollLeft и scrollTop).

Все это безупречно работает в IE. Однако в браузерах, отличных от IE (например, FireFox), требуется пара щелчков мышью, чтобы настройка прокрутки соответствовала внутреннему HTML. То есть, когда пользователь «увеличивает» в первый раз, изображение загружается, но полосы прокрутки не регулируются. Требуется еще два последовательных щелчка, чтобы он заработал так же, как в IE. Я исследовал innerHTML, и в FireFox он работает медленнее, чем в IE.

Как я могу это исправить? Кто-нибудь еще пытался загрузить изображение в FireFox с помощью JavaScript и немедленно настроить положение прокрутки на изображении? Опять же, первый и каждый раз после этого срабатывает в IE. Но у браузеров, отличных от IE, возникают проблемы.

Я пробовал использовать innerHTML, replaceChild, appendChild, ничего из того, что я пробовал, пока не исправляет.

Спасибо.

Обновление: я хотел узнать, связана ли эта проблема с чем-то внутри полос прокрутки или просто с изображениями; поэтому я заменил изображение на ‹p> ...‹ p> и запрограммировал его прокрутку сразу после загрузки ** первого * изображения с помощью инициированного пользователем события onclick. Что интересно, это сработало. Затем я заменил текст изображением, и оно снова было сломано.

Таким образом, после загрузки изображения с использованием DOM (т.е. innerHTML) любые попытки программной прокрутки в браузерах, отличных от IE, будут прерваны. Однако, если вы программно прокрутите еще раз, он будет вести себя нормально.

Обновление2: я попытался использовать методы для программной отмены события в конце вызова и немедленного повторного вызова функции, но это не устранило проблему.

Затем я попытался загрузить изображение с помощью jquery, и, похоже, это сработало. Я адаптировал его из двух других статей о stackoverflow: Может Я получаю изображение и загружаю его через ajax в div, а img onload не не работает в IE7 (чтобы обойти проблему с кешированием).

Вот код, который я использовал:

image = new Image();
image.src = "sample.gif?d=" + new Date(); // passing unique url to fix IE (see link above)
image.onload = function () {
  $("#imgcontainer").empty().append(image);
  // document.getElementById("imgcontainer").appendChild(image); // This worked, too
  // $("#imgcontainer").html("<img src=\"sample.gif?d=" + new Date() + "\"></img>"); // Failed
  // document.getElementById("imgcontainer").innerHTML = "<img src=\"sample.gif?d" + new Date() + "\"></img>"; // Failed
  $("#imgcontainer").scrollTop(25);
};
image.onerror = function () {
  $("#imgcontainer").empty().html("That image is not available.");
}

$('#imgcontainer').empty().html('Loading...');

Я полагаю, что ключом был метод onload. Я попытался использовать jQuery.html () внутри метода onload, но это не сработало. Итак, это подтверждает, что определенно существовала проблема времени, связанная с innerHTML и тем, как и когда изображение загружается в DOM. И метод onload в сочетании с собственным методом appendChild DOM или эквивалентной реализацией appendChild jQuery устранил проблему.

Обновление3:

Что касается предложения Мртшермана ниже -

Вот мой код:

var outerDIV, innerDIV, html;
outerDIV = document.createElement("div");
outerDIV.id = "content";
document.getElementById("body_id").appendChild(outerDIV); // attach div to body

innerDIV = document.createElement("div");
innerDIV = "ImageHolder";

image = new Image();
image.src = "sample.gif?d=" + new Date();

document.getElementById("content").appendChild(innerDIV);
document.getElementById("ImageHolder").style.height=image.height + "px";
document.getElementById("ImageHolder").style.width=image.width + "px";

html = "<img src=\"sample.gif\"></img>";

$("#content").scrollTop(100);
$("#ImageHolder").html(html);

Я создал внутренний div для размещения изображения. После создания указанного div я скорректировал его размер в зависимости от размеров изображения. Я настроил прокрутку в js, а затем прикрепил изображение к DOM через innerHTML, и оно не прокручивалось. Я изменил ширину и высоту на некоторый фиксированный размер больше, чем изображение, и оно прокручивалось. Но это не тот эффект, который нужно сделать, чтобы контейнер был больше изображения. Спасибо за помощь.

Update4: Что эквивалентно коду, который я написал в Update2 при использовании document.createElement ("img") вместо new Image ()? Событие onload не оказывает такого же влияния, как в объекте Image; событие onload здесь является важным ингредиентом.

Спасибо.


person user717236    schedule 03.10.2011    source источник


Ответы (2)


Если вы знаете размеры новых изображений, я бы отправил их первыми. Затем вы можете изменить размер контейнера для изображения, настроить полосы прокрутки и затем получить изображение.

person mrtsherman    schedule 04.10.2011
comment
Я задокументировал свою попытку по вашему предложению выше. Это не совсем сработало; он работает только в том случае, если контейнер больше изображения, но это противоречит цели. - person user717236; 05.10.2011

См. Исходный вопрос Update2 для решения, которое я использовал.

person user717236    schedule 05.10.2011