2014-05-18 3 views
0

Итак, я работаю над элементом Polymer, который должен реагировать. Для этого мне нужен доступ к ширине текущего изображения.Может видеть ширину элемента, но все равно получить 0

Вот моя разметка

<div class="meme"> 
    <div id="memeImage"><img id="memeimg" src="{{img}}"></div> 
    </div> 

И (важно) моделирование.

.meme { 
    position: relative; 
    -webkit-box-align:center; 
    -webkit-box-pack:center; 
    display:-webkit-box; 
    } 
    #memeImage { 
    z-index: -1; 
    border: 0px; 
    margin: 0px; 
    text-align: center; 
    position: relative; 
    } 

Теперь я хочу получить ширину изображения. Для этого, в моем ready случае, я добавляю эти две строки:

console.log(this.$.memeImage); 
    console.log(this.$.memeImage.clientWidth); 

Первые печатает элемент просто отлично, и я могу видеть clientWidth и offsetWidth являются числами. Но вторая строка печатает 0. То же самое верно, когда я использую getComputedStyle().

Я думал, что это может быть потому, что образ еще не загружен, поэтому я добавил обработчик события:

this.$.memeImage.addEventListener('onload', function() { 
     console.log("image loaded"); 
    }) 

Но это никогда не получает удар.

Что я делаю неправильно и как его исправить?

+0

не может получить размеры изображения, которое еще не загружено. Скорее всего, ваша проблема – charlietfl

+0

Я должен был упомянуть, что добавление обработчика событий onload не работает. –

ответ

2

Я считаю, самым идиоматическим решением для полимера является использование Polymer's event handling.

<div class="meme"> 
    <div id="memeImage"><img id="memeimg" on-load="{{imageLoaded}}" src="{{img}}"></div> 
</div> 

Затем в декларации Polymer

Polymer('my-meme', { 
    imageLoaded: function() { 
    console.log('meme image loaded'); 
    } 
}); 

Это хорошо, потому что он ничего не добавляет к пространству имен верхнего уровня, он сохраняет код, связанный с мемой упакованной вместе, и он будет работать, даже если вы показываете изображение только условно (например,с <template if="{{something}}">)

Вы упоминаете в своем сообщении, что вы уже пробовали это:

this.$.memeImage.addEventListener('onload', function() { 
    console.log("image loaded"); 
}); 

Вообще говоря, что должно работать, но есть несколько опечаток. Попробуйте это (примечание memeImage ->memeimg и onload ->load):

this.$.memeimg.addEventListener('load', function(loadEvent) { 
    console.log("image loaded: ", loadEvent); 
}) 

Также может быть стоит экспериментировать с ready против domReady, хотя я не думаю, что это должно иметь значение в этом случае.

+0

Это отличный совет. Это то, что я использую сейчас: https://github.com/karan/x-meme/blob/master/x-meme.html#L178-L183 –

0

Согласен с @charlietfl - вы не можете получить размеры изображения, которые еще не загружены -

Событие 'load' и не 'onload'

если вы используете JQuery - просто попробуйте это -

$("#memeimg").on('load', function() { 
     console.log("image loaded"); 
    }).attr('src', 'http://i.imgur.com/xENQisG.jpg'); 

ключ должен прикрепить событие перед установкой источника - jsfiddle здесь - Если это не выполнимо - Проверьте альтернативный подход от here

+0

К сожалению, это не работает. –

+0

@ Karan Goel - Обновлен мой ответ –

+0

Это не сработает, потому что #memeimg находится в тени dom полимерного элемента и таким образом скрыт от остальной части документа. Если вы хотите использовать jquery, вы можете сделать это вместо (внутри готового обработчика полимерного элемента): '$ (this.shadowRoot) .find ('# memeimg'). On ('load', ...) ; ' –

2

Похоже, что обработчик события onload для изображения не вызван. Попробуйте использовать OnLoad событие окна:

window.onload = function() { 
     console.log(document.getElementById('memeimg').clientWidth); 
} 

window.onload должен быть уволен после того, как были загружены все изображения (не только первый). в любом случае, если по какой-то странной Polymer связанной причине нормальное событие нагрузки для изображения не срабатывает, то это должно сделать трюк на изображение: JS:

function onThisImageLoaded(thisImage) { 
      console.log(thisImage.clientWidth); 
} 

затем разметки:

<div id="memeImage"><img id="memeimg" src="https://www.gravatar.com/avatar/f9d1450403b864d6b17f30ba0ce0aee3?s=48&d=identicon&r=PG" onload="onThisImageLoaded(this);"></div> 
+0

Это работает только для первого экземпляра элемента, а не для других. Я хочу, чтобы он работал всякий раз, когда загружался этот образ. –

+0

отредактировал мой ответ, чтобы включить решение на изображение – orcaman

Смежные вопросы