2016-05-24 22 views
-1

私はhtml5で始まりますが、ここで何か間違っているのかどうかはわかりません。ループ実行中に関数を渡す

私が達成しようとしているのは、アイテムのポートフォリオを作成し、それが選択されたときに、選択したアイテムを処理する関数に渡します。

私は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); 
}; 

事前のおかげで、ここで簡単なjsfiddleを入れています。

+0

どのようなhtml5タグですか? – Gogol

+0

私はタグの問題を理解していません。 – TheEvolvingMe

+0

私はHTML5もフィドルや質問自体には表示されません。 HTML5ではなくjavascriptに関連しています。 – Gogol

答えて

0

jQuery()を使用してHTMLを作成し、要素に任意の値を格納するのに.data(key, value)を使用することをお勧めします。

さらに、.on() delegated-eventsアプローチを使用して、要素を動的に生成すると、Event Delegationを学習します。あなたはこのような何かをしたい場合がありますあなたのソリューション

$(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

私はあなたから提案されたようにイベント委任を通過し、その一部を理解しているようです。しかし、私はあなたがタグを追加する方法を理解していません。 .data( 'item'、item)はタグにデータアイテム属性を追加すると思ったが、コンパイルされたhtmlでは見つからなかった。 それでは、どのように問題なく動作しますか? ループエントリごとに複数のタグを追加する方法もありますか?たとえば、タグとともに画像。 – TheEvolvingMe

+0

@ TheEvolvingMe、 '.data()'は、要素を持つ任意のデータを格納するキャッシュを使用します。上記の例で '.add()'を使って 'br 'を追加したのと同様に' $(' '、{ href:'# '、 text:item.name、 ' class ': 'MyClassの' }) .dataの(' アイテム 'アイテム) .add('
').add($(' 」、{SRC: 'pathToImage'})) ' –
Satpal

+0

どうもありがとうございました。私は持っていた必要があるhtmlレイアウトで動作するようになった。 – TheEvolvingMe

1

ため

一般的な構文

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

スニペット(あなたがいる場合、通常のものに矢印の機能を変更することができますそれは問題です):

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. 
     } 
    } 
}); 

プレーンJavascript。 jQueryのごみはありません。

+0

この解決法はかなり簡単です。ただし、イベントリスナーでは、指定したアイテムを見つけるためにすべてのアイテムを再度ループしています。アイテムが100個ある場合は、パフォーマンスが低下しますか? – TheEvolvingMe

+0

100個のアイテムはありませんが、あなたは正しいです。これは非常に簡単に解決されます。たとえば、** loopの間にvanilla **を使用してループを実行し、目的の要素を見つけた後に** break **を実行します。私はそれを示すために私の答えを一秒で更新します。 – Azamantes

+0

私はこれが好き、良い答え:) – Satpal

関連する問題