Определение изменения позиции элемента HTML
РЕДАКТИРОВАТЬ: см. обновление!
У меня есть следующий html:
<body>
<span id="milestone1">
</span>
<img id="image1" src="blabla.jpeg" style="width:400px;height:200px;" />
<div id="divOverlayOverImage1" style="position:absolute; top:100px; left:40px; width:400px;height:200px;" onclick="DoFunkyStuff();"><div>
</body>
Сначала divOverlayOverImage1
располагается над Image1
, покрывая его, но если я запустил код ниже, элемент #divOverlayOverImage1
больше не будет закрывать элемент #image1
.
$("#milestone1").after('<div style="width:500px; height:500px; background-color:blue;">');
Я хочу иметь событие, которое уведомляет меня, когда #image1
изменяет свою позицию, поэтому я могу обновить позицию #divOverlayOverImage1
.
ПРИМЕЧАНИЕ: У меня нет полного контроля над dom. команда $("#milestone1").after('<div style="width:500px; height:500px; background-color:blue;">');
запускается третьей стороной.
UPDATE: У меня нет полного контроля над DOM, поэтому я не могу поместить обратный вызов в функцию добавления элементов, так как это не я делаю этот вызов.
Кроме того, я не могу изменить HTML как сумасшедший. Я просто прихожу к набору веб-сайтов, добавляю и накладываюсь на конкретный образ, обрабатывающий JavaScript и его. Существуют и другие конкуренты, которые также меняют HTML.
Ответы
Ответ 1
Если у вас есть полный контроль над DOM, и я предполагаю, что у вас есть, вы можете добавить вызов для каждого изменения, которое вы делаете в DOM, которое повлияет на это <span>
.
function yourFunction() {
$("#milestone1").after('<div style="width:500px; height:500px; background-color:blue;">');
updateMyOverlayPosition();
}
Если это не работает, вы можете попробовать следующее: Обнаружить изменения в DOM
Изменить
если вам нужны события:
$('#image').on('adjustOverlay',function(e) {
// adjust the position of the overlay
}
$("#milestone1").after('<div style="width:500px; height:500px; background-color:blue;">');
$('#image').trigger('adjustOverlay', {extra: "info", some: "parameters"});
edit2
Поскольку у вас нет полного контроля над изменениями в DOM, и вы можете удивиться, вы можете либо пойти со ссылкой, которую я уже предоставил выше, либо проверить интервал, если наложение все еще там, где оно должно быть. Это не решает проблему так, как вы этого хотите, но в DOM-изменениях нет никакого родного события, поэтому вам придется придерживаться какой-то работы.
var checkTime = 100; //100 ms interval
var check = setInterval(function() {
// adjust overlay position
}, checkTime);
Edit3
следующее возможное решение: если вы знаете, как вставлять код в DOM, вы можете попытаться изменить этот метод, чтобы он всегда запускал ваш adjustOverlayPosition()
или запускал событие, если вам нравятся события. Пример: если он вставлен в jQuery .after()
, вы можете изменить эту функцию:
jQuery.fn.extend({
// since the .after() function already exists, this will
// actually overwrite the original function. Therefore you need
// the exact code that was originally used to recreate it.
after: function() {
return this.domManip( arguments, function( elem ) {
if ( this.parentNode ) {
this.parentNode.insertBefore( elem, this.nextSibling );
}
// call the function directly
adjustOverlayPosition();
// or call an event
$('#image').trigger('adjustOverlay', {extra: "info", some: "parameters"});
}
});
Недостаток: это решение может быть рискованным и работать, только если вы знаете код, который используется первоначально. Таким образом, это также будет зависеть от версии jQuery.
Ответ 2
Одним из способов решения проблемы является реорганизация вашего макета.
Оберните свое изображение и наложите на div. Таким образом, они всегда будут оставаться таковыми.
<div id="wrap">
<img id="i1" src="..." />
<div id="overlay" />
</div>
#wrap {
position: relative;
width: 400px;
height: 200px;
}
#overlay {
position: absolute;
top: 100px;
left: 40px;
width: 400px;
height: 200px;
}
Ответ 3
Если обертывание img с ovelay является только вашим требованием, я думаю, вы можете пойти с чистым css-решением.
Попробуйте демонстрацию
HTML
<p id="milestone1">
First Overlay
</p>
<div class="img-overlay-container" style="width:400px;height:200px;">
<img id="image1" src="blabla.jpeg"/>
<div id="overlay1" onclick="alert('clicked');">
</div>
</div>
<p id="milestone2">
Second Overlay
</p>
<div class="img-overlay-container" style="width:100px;height:400px;">
<img id="image2" src="blabla.jpeg"/>
<div id="overlay2" onclick="alert('clicked');">
</div>
</div>
CSS
.img-overlay-container{
position: relative;
display:inline-block;
}
.img-overlay-container > img{
}
.img-overlay-container > div{
position:absolute;
top:0px;
left:0px;
width:100%;
height:100%;
background: rgba(3,3,3,.1);
}
Ответ 4
function changePosition(callback) {
$("#milestone1").after('<div style="width:500px; height:500px; background-color:blue;">');
callback();
}
Затем вы можете вызвать changePosition(function() {// Add your event handler function})
.
Надеюсь, это поможет вам!