Какой код JavaScript лучше всего подходит для создания элемента img

Я хочу создать простой фрагмент JS-кода, который создает элемент изображения в фоновом режиме и ничего не отображает. Элемент изображения будет вызывать URL-адрес отслеживания (например, Omniture) и должен быть простым и надежным и работать только в IE 6 = <. Вот код, который у меня есть:

var oImg = document.createElement("img");
oImg.setAttribute('src', 'http://www.testtrackinglink.com');
oImg.setAttribute('alt', 'na');
oImg.setAttribute('height', '1px');
oImg.setAttribute('width', '1px');
document.body.appendChild(oImg);

Это самый простой, но самый надежный (безошибочный) способ сделать это?

Я не могу использовать фреймворк вроде jQuery. Это должен быть простой JavaScript.

Определите «лучший». Самый быстрый? Самый простой?

Andrew Hedges 22.10.2008 22:03

@steveniseki он использовал en.wikipedia.org/wiki/Hungarian_notation

Iiridayn 01.05.2018 22:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
115
2
301 521
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Вам разрешено использовать фреймворк? jQuery и Прототип делают подобные вещи довольно простыми. Вот образец в Prototype:

var elem = new Element('img', { 'class': 'foo', src: 'pic.jpg', alt: 'alternate text' });
$(document).insert(elem);
var img = new Image(1,1); // width, height values are optional params 
img.src = 'http://www.testtrackinglink.com';
var img = document.createElement('img');
img.src = 'my_image.jpg';
document.getElementById('container').appendChild(img);

@AndreiCristianProdan Используйте console.info между каждой парой строк, чтобы вы точно знали, в какой строке он замораживается.

Rodrigo 01.08.2019 15:52

jQuery:

$('#container').append('<img src = "/path/to/image.jpg"
       width = "16" height = "16" alt = "Test Image" title = "Test Image" />');

Я обнаружил, что это работает даже лучше, потому что вам не нужно беспокоиться о том, что HTML ускользнет от чего-либо (что должно быть сделано в приведенном выше коде, если значения не были жестко закодированы). Также легче читать (с точки зрения JS):

$('#container').append($('<img>', { 
    src : "/path/to/image.jpg", 
    width : 16, 
    height : 16, 
    alt : "Test Image", 
    title : "Test Image"
}));

Он специально не просил jQuery.

Alex 30.03.2014 03:30

Кроме того, разбор текста в код бессмыслен, неэффективен и просто ленив. Кто бы это ни читал, не делайте так. Я имею в виду, если вы вставляете буквальный <img ... /> в DOM, тогда сделайте это с помощью innerHTML. Я просто не понимаю этого: /

aexl 25.04.2016 17:01
Ответ принят как подходящий
oImg.setAttribute('width', '1px');

px предназначен только для CSS. Используйте либо:

oImg.width = '1';

чтобы установить ширину через HTML, или:

oImg.style.width = '1px';

чтобы установить его через CSS.

Обратите внимание, что старые версии IE не создают правильный образ с document.createElement(), а старые версии KHTML не создают правильный узел DOM с new Image(), поэтому, если вы хотите быть полностью обратно совместимыми, используйте что-то вроде:

// IEWIN boolean previously sniffed through eg. conditional comments

function img_create(src, alt, title) {
    var img = IEWIN ? new Image() : document.createElement('img');
    img.src = src;
    if ( alt != null ) img.alt = alt;
    if ( title != null ) img.title = title;
    return img;
}

Также будьте осторожны с document.body.appendChild, если сценарий может выполняться, когда страница находится в процессе загрузки. Вы можете получить изображение в неожиданном месте или получить странную ошибку JavaScript в IE. Если вам нужно иметь возможность добавить его во время загрузки (но после запуска элемента <body>), вы можете попробовать вставить его в начало тела, используя body.insertBefore(body.firstChild).

Чтобы сделать это незаметно, но по-прежнему иметь изображение, фактически загруженное во всех браузерах, вы можете вставить <div> с абсолютным позиционированием вне страницы в качестве первого дочернего элемента тела и поместить любые изображения для отслеживания / предварительной загрузки, в которых вы не хотите быть видимыми. там.

Разве только new Image() не будет работать лучше всего при любых обстоятельствах?

Alexis Wilke 01.08.2016 01:20

Кратчайший путь:

(new Image()).src = "http:/track.me/image.gif";

Если он не добавлен в документ, нет уверенности, что изображение src будет извлечено вообще (зависит от браузера).

bobince 23.10.2008 16:26

Есть ли у кого-нибудь случаи, когда браузеры не загружают это изображение, если оно не прикреплено к DOM?

antoine129 09.12.2013 20:56

Я тестировал это в IE, FF, Chrome и Safari - все изображения загружают без добавления в DOM. Это проблема старых браузеров?

Seanonymous 31.03.2015 02:39

Как отмечали другие, если вам разрешено использовать фреймворк, такой как jQuery, лучше всего использовать его, поскольку он, скорее всего, сделает это наилучшим образом. Если вам не разрешено использовать фреймворк, я думаю, что манипулирование DOM - лучший способ сделать это (и, на мой взгляд, правильный способ сделать это).

Для полноты картины я бы также предложил использовать способ InnerHTML - хотя я бы не назвал его лучшим способом ...

document.getElementById("image-holder").innerHTML = "<img src='image.png' alt='The Image' />";

Кстати, innerHTML не так уж и плох

Я использовал этот метод для сетки изображений 50x50. Когда я попробовал описанный выше метод добавления, время выполнения подскочило со 150 мс до 2250 мс. Поэтому я думаю, что innerHTML намного эффективнее.

Nicholas 17.10.2013 22:09

вы могли бы просто сделать:

var newImage = new Image();
newImage.src = "someImg.jpg";

if (document.images)
{
  document.images.yourImageElementName.src = newImage.src;
}

Простой :)

Просто чтобы добавить полный пример html JS

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <title>create image demo</title>
    <script>


        function createImage() {
            var x = document.createElement("IMG");
            x.setAttribute("src", "http://www.iseebug.com/wp-content/uploads/2016/09/c2.png");
            x.setAttribute("height", "200");
            x.setAttribute("width", "400");
            x.setAttribute("alt", "suppp");
            document.getElementById("res").appendChild(x);
        }

    </script>
</head>
<body>
<button onclick = "createImage()">ok</button>
<div id = "res"></div>

</body>
</html>

Это метод, которым я следую, чтобы создать цикл тегов img или один тег, как вы хотите

method1 :
    let pics=document.getElementById("pics-thumbs");
            let divholder=document.createDocumentFragment();
            for(let i=1;i<73;i++)
            {
                let img=document.createElement("img");
                img.class = "img-responsive";
                img.src=`images/fun${i}.jpg`;
                divholder.appendChild(img);
            }
            pics.appendChild(divholder);

или же

method2: 
let pics = document.getElementById("pics-thumbs"),
  imgArr = [];
for (let i = 1; i < 73; i++) {

  imgArr.push(`<img class = "img-responsive" src = "images/fun${i}.jpg">`);
}
pics.innerHTML = imgArr.join('<br>')
<div id = "pics-thumbs"></div>

Другие вопросы по теме