Не удалось избежать публикации минималистского метода без зависимости или библиотек. Для этого требуется новый API-интерфейс. Могу ли я использовать его?
var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
fetch(url)
.then(res => res.blob())
.then(blob => console.log(blob))
С помощью этого метода вы также можете легко получить arraybuffer, text и json
Я сделал простой тест производительности по сравнению с версией синхронизации Джереми es6. Версия синхронизации будет блокировать UI некоторое время.
// get some dummy gradient image
var img=function(){var a=document.createElement("canvas"),b=a.getContext("2d"),c=b.createLinearGradient(0,0,200,100);a.width=a.height=3000;c.addColorStop(0,"red");c.addColorStop(1,"blue");b.fillStyle=c;b.fillRect(0,0,a.width,a.height);return a.toDataURL()}();
async function perf() {
const blob = await fetch(img).then(res => res.blob())
// turn it to a dataURI
const url = img
const b64Data = url.split(',')[1]
// Jeremy Banks solution
const b64toBlob = (b64Data, contentType = '', sliceSize=512) => {
const byteCharacters = atob(b64Data);
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: contentType});
return blob;
}
// bench blocking method
let i = 1000
console.time('b64')
while (i--) {
await b64toBlob(b64Data)
}
console.timeEnd('b64')
// bench non blocking
i = 1000
// so that the function is not reconstructed each time
const toBlob = res => res.blob()
console.time('fetch')
while (i--) {
await fetch(url).then(toBlob)
}
console.timeEnd('fetch')
console.log('done')
}
perf()
Используя JQuery может не быть маршрут, которым Вы хотите следовать, так как это было бы на стороне клиента... Существует ли причина, которую Вы не шифруете на стороне сервера?
Ну, так же, как комментарий Вы, вероятно, хотите, чтобы источник имел одетый адрес электронной почты и затем использовал jQuery, чтобы исправить или создать ссылку, чтобы иметь корректный адрес..., потому что боты будут смотреть на источник, не результаты выполнения Вашего JavaScript ;-)
К виду автожелезнодорожных перевозок на то, что предлагал Mike Stone, что я сделаю, шифруют его на серверной стороне и имеют что-то на серверной стороне, которая дешифрует его и возвратит его назад как JSON (jsonresult в mvc платформе, веб-сервисе, http обработчик, безотносительно). Тем путем Вы могли использовать jQuery для de-obfuscate адреса электронной почты, когда Вы хотели, но он все еще перепутает любого бота, который не поддерживает сценарий Java. Снова это не пуленепробиваемое решение, но оно может сделать то, что Вы ищете.
Семантические нацисты сказали бы "кодирование", "не шифрование". Шифрование подразумевает, что секрет требуется, чтобы декодировать. Преобразование в синтаксис объекта HTML было бы достойным процессом кодирования для не допускания надоедливых людей, но боты могли легко декодировать его.
То, что я сделал, запутывают его, когда это представляется, и скройте его, затем используйте JavaScript, чтобы зафиксировать путаницу и показать ссылку.
Например, можно представить это с сервера:
<a href="mailto:some_address^^some_domain$$com" style='display:none'>Email me</a>
затем использование JavaScript можно использовать regex для свопинга ^^
для @
и $$
для .
Независимо от того, что схема, которую можно придумать, будет, вероятно, прекрасна. Конечно, если бот понимает JavaScript затем, он не имеет значения так или иначе.
Вы заблокируете 95% ботов, которые появляются, Ваш путь и остальная часть Ваших пользователей будут видеть адрес очень хорошо.