JavaScript: как вынудить Изображение () не использовать кэш браузера?

Когда вы комбинируете два элемента строки, вам нужно вызвать parseInt() * для результата конкатенации, а не для конкатенации результатов parseInt(). Так и должно быть:

} else if (validAscii.includes(parseInt(item + strSplit[index+1]))){

И поскольку значения ASCII могут быть 3 цифрами, вам нужен еще один else if, который ищет item + strSplit[index+1] + strSplit[index+2].

Другая проблема заключается в том, что вы нажимаете item на строку результата. Но чтобы получить соответствующий символ, вам нужно использовать String.fromCharCode() для преобразования каскадного кода ASCII в символ.

strSplit.forEach((item, index) => {
  if (validAscii.includes(parseInt(item))) {
    result.push(String.fromCharCode(item))
  } else if (validAscii.includes(parseInt(item + strSplit[index+1]))) {
    result.push(String.fromCharCode(parseInt(item + strSplit[index+1]))
  } else if (validAscii.includes(parseInt(item + strSplit[index+1] + strSplit[index+2]))) {
    result.push(String.fromCharCode(parseInt(item + strSplit[index+1] + strSplit[index+2]))
  }
})

Обратите внимание, что использование forEach, как это, вероятно, не очень хорошая идея. Если во входных данных есть перекрывающиеся элементы, которые есть в validAscii, вы добавите оба к результату. Например. если он содержит 678, вы сопоставите оба цикла 67 и 78 , and add the corresponding characters to the result. Instead, you should use an ordinary для цикла` и увеличите индекс на количество символов, которое вы сопоставили.

10
задан Peter Mortensen 12 July 2012 в 18:59
поделиться

3 ответа

Это на самом деле походит на ошибку в браузере - Вы могли зарегистрировать по http://bugs.webkit.org, если это находится в Safari или https://bugzilla.mozilla.org/для Firefox. Почему я говорю потенциальную ошибку браузера? Поскольку браузер понимает, что не должен кэшироваться на перезагрузке, все же он действительно дает Вам кэшируемую копию изображения, когда Вы запрашиваете это программно.

Это сказало, что действительно ли Вы уверены, что на самом деле тянете что-нибудь? Canvas.drawImage API не будет ожидать изображения для загрузки и является spec'd, чтобы не потянуть, если изображение не полностью загрузилось, когда Вы пытаетесь использовать его.

Лучшая практика - что-то как:

    var myimg = new Image();
    myimg.onload = function() {
        var rx=Math.floor(Math.random()*100)*10
        var ry=Math.floor(Math.random()*100)*10
        ctx.drawImage(myimg,rx,ry);
        window.setTimeout(draw,0);
    }
    myimg.src = 'http://ohm:8080/cgi-bin/nextimg'

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

5
ответ дан 3 December 2019 в 14:12
поделиться

Самый легкий путь состоит в том, чтобы бросить постоянно меняющийся querystring на конец:

var url = 'http://.../?' + escape(new Date())

Некоторые люди предпочитают использовать Math.random() для этого вместо escape(new Date()). Но корректный путь состоит в том, чтобы, вероятно, изменить заголовки, которые веб-сервер отправляет для запрещения кэширования.

24
ответ дан 3 December 2019 в 14:12
поделиться

Вы не можете мешать ему кэшировать изображение в целом в рамках JavaScript. Но, можно играть с src/address изображения, чтобы вынудить это кэшироваться снова:

[Image].src = 'image.png?' + (new Date()).getTime();

Можно, вероятно, взять любое из решений для кэша Ajax и применить его здесь.

7
ответ дан 3 December 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: