2016-05-24 2 views
-1

Я трогание с html5 и не уверен, если я делаю что-то неправильно здесь.Передача функции во время выполнения цикла

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

я поставил простую jsfiddle здесь https://jsfiddle.net/rohannayak90/9u9rtf84/

data = JSON.parse('{"error":false,"items":[{"id":1,"name":"John"},{"id":2,"name":"Jordan"}]}'); 

jQuery.each(data.items, function(counter, item) { 
    //console.log(item); 
    h = '<a href="#" onclick="' + generateCallBack(item) + ';">' + item.name + '</a></br>'; 
    $('#portfolio').append(h); 
}); 

function generateCallBack(argItem) { 
    return function() { 
     itemSelected(argItem); 
    }; 
}; 

function itemSelected(argItem) { 
    //console.log(argItem.name); 
    alert(argItem.name); 
}; 

Спасибо заранее.

+0

что является html5 тэг? – Gogol

+0

Я не понимаю проблему с тегом. – TheEvolvingMe

+0

Я не вижу HTML5 ни в скрипте, ни в самом вопросе. Это связано с javascript, а не с HTML5. – Gogol

ответ

0

Я бы рекомендовал создать HTML, используя jQuery() и использовать .data(key, value) хранить произвольное значение с элементом.

Дополнительно изучает Event Delegation с использованием метода делегированных событий с использованием .on() при генерации элементов динамически.

Общий синтаксис

$(staticParentContainer).on('event','selector',callback_function) 

Сниппет для решения

$(function() { 
 
    var data = JSON.parse('{"error":false,"items":[{"id":1,"name":"John"},{"id":2,"name":"Jordan"}]}'); 
 

 
    jQuery.each(data.items, function(counter, item) { 
 
    //console.log(item); 
 
    $('<a />', { 
 
     href: '#', 
 
     text: item.name, 
 
     'class': 'myClass' 
 
     }) 
 
     .data('item', item) 
 
     .add('<br />') 
 
     .appendTo('#portfolio'); 
 
    }); 
 

 
    $('#portfolio').on('click', 'a.myClass', function() { 
 
    console.log($(this).data('item')); 
 
    }) 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="showcase" class="container"> 
 
    <ul id="portfolio" class="grid"> 
 

 
    </ul> 
 
</div>

+0

Я прошел через Event Delegation, как вам было предложено, и, похоже, понял некоторые из них. Однако я не понимаю, как вы добавляете тег. Я думал, что .data ('item', item) добавит атрибут элемента данных в тег , но я не найду его в скомпилированном html. Итак, как это работает? Также как добавить несколько тегов для каждой записи цикла? Например, изображение вместе с тегом. – TheEvolvingMe

+0

@TheEvolvingMe, '.data()' использовать кеш для хранения произвольных данных с элементом. В приведенном выше примере я использовал '.add()', чтобы добавить 'br', вы можете добавить тег изображения, например' $ ('', { href: '#', text: item.name, 'class ': 'MyClass' }) .data (' пункт 'пункт) .add ('
') .add ($ (' », {ЦСИ: 'pathToImage'}))' –
Satpal

+0

большое спасибо. Получил его, чтобы работать с html-макетом, который мне нужен. – TheEvolvingMe

1

Вы можете захотеть сделать что-то вроде этого (вы можете изменить функции курсора к нормальным, если это это проблема):

const data = JSON.parse('{"error":false,"items":[{"id":1,"name":"John"},{"id":2,"name":"Jordan"}]}'); 
const array = data.items; 
const length = array.length; 

let string = ''; 
data.items.map(item => { 
    string += '<a href="#">' + item.name + '</a></br>'; 
}); 

const portfolio = document.getElementById('portfolio'); 
portfolio.innerHTML += string; 

portfolio.addEventListener('click', function(event) { 
    if(event.target.tagName !== 'A') return; 

    let i = -1; 
    while(++i < length) { 
     if(array[i].name === event.target.textContent) { 
      return alert(JSON.stringify(array[i].name)); // return ends the function and thus the loop too. 
     } 
    } 
}); 

Plain Javascript. Нет jQuery дерьма.

+0

Это решение кажется довольно прямым. Однако в прослушивателе событий мы снова перебираем все элементы, чтобы найти указанный элемент. Если у нас есть 100 предметов, было бы у вас хитом производительности? – TheEvolvingMe

+0

С 100 пунктами нет, но вы правы. Это очень легко решить, выполняя цикл через vanilla **, в то время как ** цикл, например, и делает ** break ** после нахождения нужного элемента. Я обновляю свой ответ за секунду, чтобы показать это. – Azamantes

+0

Мне это нравится, Хороший ответ :) – Satpal

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