JavaScript () вызывает ошибки при загрузке, неясно, почему - PullRequest
1 голос
/ 20 мая 2019

Я использую Квазар с этим кодом:

<template>
  <div class="q-pa-md">
    <div class="q-gutter-sm row items-start">
      <q-img
        v-for="pic in picObject"
        :key="pic.id"
        :src="pic"
        @error="reportError"
        style="height: 140px; width: 140px"
      >
        <template v-slot:default>
          <div class="absolute-bottom transparant-banner">This picture loaded ok.</div>
        </template>
        <template v-slot:error>
          <div class="absolute-full flex flex-center bg-dark" style="color: red">Cannot load image</div>
        </template>
      </q-img>
    </div>
  </div>
</template>
<script>

export default {
  components: {},
  data() {
    return {
      picObject: {  "2": "https://images.takeshape.io/86ce9525-f5f2-4e97-81ba-54e8ce933da7/dev/144069dc-7390-4022-aa0f-abba022d3a2f/spec.jpg?auto=compress%2Cformat", "3": "https://natureconservancy-h.assetsadobe.com/is/image/content/dam/tnc/nature/en/photos/prescribed_burn_oregon.jpg?crop=0,120,5760,3600&wid=1640&hei=1025&scl=3.5121951219512195", "4": "https://orig11.deviantart.net/1062/f/2015/315/9/6/abstract__7_by_thejsyve1-d9gciwk.jpg", "5": "https://natureconservancy-h.assetsadobe.com/is/image/content/dam/tnc/nature/en/photos/Brown_County_Hills_Leonetti.jpg?crop=33,0,1192,656&wid=4000&hei=2200&scl=0.29818181818181816", "6": "https://www.telegraph.co.uk/content/dam/Travel/galleries/travel/destinations/northamerica/usa/US%20national%20parks/AP84847745_Yosemite_General-xlarge.jpg", "7": "http://miriadna.com/desctopwalls/images/max/Papaverous-path.jpg", "8": "https://dehayf5mhw1h7.cloudfront.net/wp-content/uploads/sites/183/2016/09/15173325/Brown_County_Indiana_Estados_Unidos_2012-10-14_DD_10.jpg", "9": "https://s-media-cache-ak0.pinimg.com/originals/19/e9/58/19e9581dbdc756a2dbbb38ae39a3419c.jpg", "12": "https://cdn.pixabay.com/photo/2015/12/01/20/28/green-1072828_960_720.jpg","13": "https://www.alwareness.org/wp-content/uploads/2018/10/Bomen-Bos.jpg", "13": "https://www.campz.be/info/wp-content/uploads/header-pic-mountain.jpeg", "14": "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSUzRyiSPfzeIogLgkY1P8ugrvzls23SMhOcJi7vmUfCe4r1nKa", "14": "https://upload.wikimedia.org/wikipedia/commons/f/ff/Pizigani_1367_Chart_10MB.jpg", "15": "https://farm6.staticflickr.com/5720/22076039308_4e2fc21c5f_o.jpg" }
    };
  },
  methods: {
    reportError(event) {
      console.log(`${event.name}: ${event.message}`);
    }
  }
};
</script>
<style>
.transparant-banner {
  color: white;
}
</style>

В браузере Chrome я получаю ошибки на нескольких изображениях.См .:

enter image description here В Firefox все работает как положено.Квазар опирается в его q-img компоненте на javascript image() с его onerror, который, очевидно, запущен.

Мои вопросы:

  1. Почему ошибки возникают, когда они кажутся случайными, а изображение показывает, что оно успешно загружено (после возникновения ошибки)?
  2. Какя могу решить эту проблему?

Этот jsfiddle показывает поведение, соответствующий код в components/Example.vue.

РЕДАКТИРОВАТЬ: сообщение об ошибке: EncodingError - The source image cannot be decoded.

Видимо .decode () вызывает ошибку .Но какова точная причина?Эта статья описывает .decode(), и это действительно относится только к Chrome.В Квазаре расшифровка имеет дело с здесь .

Ответы [ 2 ]

1 голос
/ 24 мая 2019

При использовании сети DevTools вы заметите, что загруженные изображения vue (более поздний пакет) являются поэтапными и загружаются не более 6 одновременно. Ограничение здравого смысла HTTP для одновременных открытых соединений равно 2. Вы также заметите, что загруженные квазаром изображения не следуют этому правилу: все они (12) загружаются параллельно. В Firefox все они принудительно ограничены до 2 одновременно. Я предполагаю, что происходит (единственное доказательство того, что одно и то же изображение загружается с разными размерами байтов, если вы заметили), это то, что большое количество параллельных квазар-соединений сбрасывается удаленным сервером в полете (поскольку заголовок по-прежнему равен 200) .

1 голос
/ 24 мая 2019

Image.decode - это интерфейс асинхронного браузера, который должен предотвращать блокировку основного потока при декодировании и рисовании.

Что происходит, когда эти изображения инициализируются с помощью src? Браузер начинает их скачивать. Decode дает вам обещание знать, когда его можно безопасно вставить в DOM.

Но когда вы последовательно обрабатываете некоторое количество огромных изображений (как в примере, каждое из которых составляет около 4 Мб), оно иногда искажается. Не знаю почему, но размер и число имеют значение.

Я играл с вашим массивом изображений с простым кодом, как

imagesArray.forEach(function(img) {
  var i = new Image();
  i.src = img;
  i.decode().then(function() {
    console.log("decoded");
  }).catch(function() {
    console.log("error");
  });
});

И ошибку легко получить с более чем 5-6 изображениями. Я бы предложил вместо этого использовать статические изображения (изображение Content-type).

В любом случае, Quazar использует this.__updateSrc(); для передачи значения src в backgroundImage. Именно поэтому фоны загружаются даже для случаев ошибок. Это заставляет браузер загружать эти изображения дважды! В случаях ошибки первая загрузка изображения с использованием декодирования не используется.

Если вы хотите устранить эту ошибку, закомментируйте строку с this.hasError = true внутри __ onError . Это свойство, когда true вызывает Vue, чтобы выдать ошибку для слота шаблона.

Кстати, в версии 1.0.0-rc.1 Quasar эта проблема решена , т.е. она будет загружаться без состояния ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...