2016-06-15 2 views
2

Есть изображения. Когда я нажимаю на один из них, я хочу выделить его и отобразить его имя в списке.Как выделить выбранное изображение и показать его имя в списке

HTML

<img class="high" id="x" src="images/Chrysanthemum.jpg" alt="Chrysanthemum" width="300" height="200" onclick="mySelect()"> 

JS

function mySelect() { 
    document.getElementById("x").style.border = "3px dotted blue"; 
} 

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

example image

При нажатии на изображение, оно должно выделить. И его имя должно появиться в соответствующем <li>.

Когда я нажимаю на другое изображение, он должен выделить этот и высветить один до. И имя соответствующего <li> следует заменить на заполнителем.

+0

Используйте ** JQuery ** для этого типа проблем. Это быстрее и удобнее. – sudar

+1

Я изучаю ** JavaScript ** сейчас, я понятия не имею о ** JQuery ** – JIMMY

+1

По-моему, лучше не начинать с jQuery. Всегда лучше понимать ** основы ** (JavaScript) ** сначала ** перед использованием библиотеки. – Sun

ответ

0

Есть две вещи, чтобы сделать:

  1. Переключить имя класс
  2. Сменныйli.innerHTML с img.alt

    // List.children.lenght and imgs.children.length must always be the same! 
    
    var imgs = document.getElementById("images"); 
    var list = document.getElementById("list"); 
    var cN = "active"; 
    
    for (var i = 0; i < imgs.children.length; i += 1) { 
        (function(i) { 
         imgs.children[i].addEventListener("click", function() { 
          this.className === "" ? this.className = cN : this.className = ""; // Toggle class name 
    
          // Swap img.alt with li.innerHTML 
          var temp = list.children[i].innerHTML; 
          list.children[i].innerHTML = this.alt; 
          this.alt = temp; 
         }); 
        })(i); 
    } 
    

Полный пример:

// List.children.lenght and imgs.children.length must always be the same! 
 

 
var imgs = document.getElementById("images"); 
 
var list = document.getElementById("list"); 
 
var cN = "active"; 
 

 
for (var i = 0; i < imgs.children.length; i += 1) { 
 
    (function(i) { 
 
     imgs.children[i].addEventListener("click", function() { 
 
      // Toggle class name 
 
      this.className === "" ? this.className = cN : this.className = ""; 
 

 
      // Swap img.alt with li.innerHTML 
 
      var temp = list.children[i].innerHTML; 
 
      list.children[i].innerHTML = this.alt; 
 
      this.alt = temp; 
 
     }); 
 
    })(i); 
 
}
.container ul { 
 
    padding: 0; 
 
    list-style: none; 
 
} 
 

 
.container ul, 
 
.container #images { 
 
    float: left; 
 
    margin: 15px; 
 
} 
 

 
.container #images img:hover { 
 
    cursor: pointer; 
 
} 
 

 
.active { 
 
    border: 3px dotted brown; 
 
}
<div class="container"> 
 
    <ul id="list"> 
 
     <li>Image1</li> 
 
     <li>Image2</li> 
 
     <li>Image3</li> 
 
    </ul> 
 
    <div id="images"> 
 
     <img src="http://unsplash.it/100/70?image=10" alt="Title 1"> 
 
     <img src="http://unsplash.it/100/70?image=15" alt="Title 2"> 
 
     <img src="http://unsplash.it/100/70?image=20" alt="Title 3"> 
 
    </div> 
 
</div>

+0

Было бы полезно, если вы также покажете, как выбрать ** несколько изображений **. – JIMMY

+0

Я обновил свой ответ! – Sun

-1

Это один из способов, как вы можете решить:

HTML:

<div> 
<div><img class='image' title="title 1" src="https://www.mathconsult.ch/static/unipoly/33.256.gif" ></div> 
<div><img class='image' title="title 2" src="https://www.mathconsult.ch/static/unipoly/33.256.gif" ></div> 
<div><img class='image' title="title 3" src="https://www.mathconsult.ch/static/unipoly/33.256.gif" ></div> 

</div> 

CSS

.image{ 
width:150px; 
height:150px; 
float:left; 
cursor:pointer; 
} 

.active{ 
    border:1px solid #ff0000; 

} 

.title{ 

} 

JS

$('document').ready(function(){ 

    $('.image').click(function(){ 

    $('.title').remove(); 
    $('.image').removeClass('active'); //removes old active class 

    $(this).addClass('active'); 
    $(this).before("<div class='title'>"+$(this).attr("title")+"</div>"); 


}); 

}); 

jsFiddle

+0

Что делать, если OP не хочет использовать jQuery? – Jorrex

+0

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

+0

OP сказал, что он все еще изучает JavaScript. По-моему, лучше не путать * новичка * с библиотекой! – Sun

0

Под «именем изображения» вы, мужчины, «alt» текст в элементе изображения?

var imageName = document.getElementById("x").getAttribute("alt"); 

document.getElementById("firstName").innerHtml = imageName 
+0

Да название изображения «alt» 'function mySelect() { var imageName = document.getElementById (" x "). GetAttribute (" alt "); document.getElementById ("x"). Style.border = "3px dotted blue"; document.getElementById ("firstName"). InnerHtml = imageName } ' его не заменяя имя – JIMMY

+0

Получил, я скопировал код и не видел, что вы пропустили"; " теперь работает. – JIMMY

0

Я принял решение в простой JS, не требуется jQuery. Полагаю, это то, о чем вы просили или как можно ближе к требуемому решению?

var images = document.getElementsByClassName("high"); 
 
var list = document.getElementById("lstNames"); 
 
for(var i = 0; i < images.length; i++) 
 
{ 
 
\t images[i].addEventListener("click", onSelection, false); 
 
    var a = document.createElement("a"); 
 
    
 
    a.setAttribute("href", "#"); 
 
    a.setAttribute("data-index", i); 
 
    a.innerHTML = images[i].getAttribute("alt"); 
 
    a.addEventListener("click", highlightImage, false); 
 
    
 
    
 
    var li = document.createElement("li"); 
 
    li.appendChild(a); 
 
    
 
    
 
    list.appendChild(li); 
 
} 
 
    
 
    
 
    function highlightImage() 
 
    { 
 
    \t var index = this.getAttribute("data-index"); 
 
    for(var i = 0; i < images.length; i++) 
 
    \t images[i].style.border = ""; 
 
     
 
    images[index].style.border = "3px dotted blue"; 
 
    } 
 

 

 

 

 
function onSelection() 
 
{ 
 
\t for(var i = 0; i < images.length; i++) 
 
    \t images[i].style.border = ""; 
 

 

 

 
\t if(this.style.border === "") 
 
    { 
 
    \t this.style.border = "3px dotted blue"; 
 
    } 
 
    else 
 
    { 
 
\t \t this.style.border = ""; 
 
    } 
 
}
.wrapper { 
 
    width: 100%; 
 
} 
 

 
.details { 
 
    width: 15%; 
 
    height: 150px; 
 
    float: left; 
 
} 
 

 
#lstNames { 
 
    display: inline; 
 
} 
 

 
#lstNames li { 
 
    list-style: none; 
 
} 
 

 

 
.images { 
 
    width: 84%; 
 
    float: left; 
 
    
 
} 
 

 

 
.high { 
 
    width: 200px; 
 
    height: 150px; 
 
}
<div class="wrapper"> 
 
    <div class="details"> 
 
    <u>Image selection</u> 
 
    <br/> 
 
    <ul id="lstNames"> 
 
    
 
    </ul> 
 
    </div> 
 
    <div class="images"> 
 
    <img class="high" src="http://media.mnn.com/assets/images/2015/09/pink-chrysanthemum.jpg.638x0_q80_crop-smart.jpg" alt="Chrysanthemum"/> 
 
    <img class="high" src="http://www.caoping8.com/wp-content/uploads/2014/06/popular-landscaping-pleasant-landscaping-companies-hiring-in-las-vegas-landscaping-las-vegas-jobs-jaramillo-landscaping-las-vegas-jeffs-landscaping-las-vegas-landscaping-jobs-las-vegas-nevada-j.jpg" alt="Rock landscape"/> 
 
    <img class="high" src="http://www.essentialnaturaloils.com/image/data/white%20lotus%202.jpg" alt="Flower"/> 
 
    </div> 
 
</div>

0

Это может быть сделано с помощью нескольких операций:

1 - Получить элемент

Чтобы получить элемент существует пять способов сделать что:

  • document.getElementById('idName')
  • document.getElementsByClassName('class name')[element index] (0 базовый индекс)
  • document.getElementsByTagName('tag name')[element index] (0 базисный индекс)
  • document.querySelectorAll('.class or #id or tag')[element index] (0 базисный индекс)
  • document.querySelector('.class or #id or tag') (вернет первый элемент)

Например, мы получим элемент по имени класса:

var image = document.getElementsByClassName('high')[0]; 

Но [0] получите первое изображение, и мы должны получить все изображения, так что мы будем делать с переменной равно 0 и увеличивать ее до он достигает последнего изображения (изображения.длина), используя for петлю, а затем положить эту переменную вместо 0

var image = document.getElementsByClassName('high'); 

for (var i = 0; i < image.length; i++) { 
    image[i].addEventListener('click', function() { 
    // functions to be invoked 
    }); 
} 

2 - Сбросить границу для всех изображений с каждым нажмите

Сделать функцию для сброса границы все изображения с использованием новой петли for со свежей переменной

function resetBorder() { 
    for (var v = 0; v < images.length; v++) { 
    images[v].style.border = ''; 
    } 
} 

3 - Добавить границу для щелкнули элемента

Для этой части мы создадим функцию и дать ему аргумент. то вместо того, чтобы использовать this.style.border (потому что она будет называться функцией), мы добавим стиль к аргументу

function addBorderTo(thisImage) { 
    thisImage.style.border = '4px solid #00f'; 
} 

затем измените аргумент this, когда мы вызываем функцию addBorderTo(this);


4 - Показать детали элемента с щелчком

Мы получим элемент, который удерживает t он деталь изображения (li или р) , а затем получить атрибут альта для щелкнули изображения, которые держат имя изображения функции выше

function showImageDetails(thisImage) { 
    var imgDetails = document.querySelectorAll('.imgDetails p')[1]; 
    imgDetails.textContent = thisImage.getAttribute('alt'); 
} 

Тогда код может быть оптимизирован для выглядеть:

https://jsfiddle.net/89znymLm/4/

var images = document.getElementsByClassName('high'); 
 
var imagesLen = images.length; 
 
var imgDetails = document.querySelectorAll('.imgDetails p')[1]; 
 

 
// loop through each image and and addEventListener for each one 
 
for (var i = 0 ; i < imagesLen; i++) { 
 
    images[i].addEventListener('click', function() { 
 
    resetBorder(); 
 
    addBorderTo(this); 
 
    showImageDetails(this); 
 
    }); 
 
} 
 

 
// make a new loop for each click and reset images by it 
 
function resetBorder() { 
 
    for (var v = 0; v < imagesLen; v++) { 
 
    images[v].style.border = ''; 
 
    } 
 
} 
 

 
function addBorderTo(thisImage) { 
 
    thisImage.style.border = '4px solid #00f'; 
 
} 
 

 
function showImageDetails(thisImage) { 
 
    imgDetails.textContent = thisImage.getAttribute('alt'); 
 
}
.cont { 
 
    width: 700px; 
 
    list-style-type: none; 
 
    overflow: hidden 
 
} 
 

 
.imgDetails { 
 
    width: 100px; 
 
    float: left; 
 
    margin-top: 30px 
 
} 
 

 
.imgDetails p:first-child { 
 
    text-decoration: underline; 
 
} 
 

 
.imagesHolder { 
 
    float: left 
 
} 
 

 
.imagesHolder li { 
 
    display: inline-block 
 
}
<div class="cont"> 
 
    <div class="imgDetails"> 
 
    <p>image selection</p> 
 
    <p>image name</p> 
 
    </div> 
 
    <ul class="imagesHolder"> 
 
    <li><img class="high" src="http://placehold.it/150x120/3498db" alt="first image"></li> 
 
    <li><img class="high" src="http://placehold.it/150x120/8e44ad" alt="second image"></li> 
 
    <li><img class="high" src="http://placehold.it/150x120/e74c3c" alt="third image"></li> 
 
    </ul> 
 
</div>

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