2015-05-25 14 views
5

Próbuję dodać obudowy przełączników za pomocą json. Jak mogę wypełnić dane?Zapełnianie danych obudowy przełącznika za pomocą json

Jest to oczekiwany wynik:

$(".custom-menu li").click(function(){ 
    switch($(this).attr("data-action")) { 
    // A case for each action. 
     case "Science": $('.abc:eq(0)').trigger('click',['Zoology']); break; 
     case "Science": $('.abc:eq(1)').trigger('click',['Botany']); break; 
     case "Maths": $('.abc:eq(2)').trigger('click',['Geometry']); break; 
    } 
}); 

to strukturę:

$(".custom-menu li").click(function(){ 
    switch($(this).attr("data-action")) { 
     //looking to populate data here 
    } 
}); 

JQ

var val; 
$.ajax({url: 'subjects.json'}).done(function(d) { 
    val = d; 
    $.each(val, function(i, su) { 
     $('case "'+su[0]+'": $('.content:eq(0)').trigger('click',['+su[1]+']); break;') 
     .appendTo('data-action'); //How to refer $(this).attr("data-action") 
    }); 
}); 

json:

[ [ "Science", "Zoology"], 
[ "Science", "Botany"], 
[ "Maths", "Geometry"] ] 
+0

Co robić chcesz zrobić w '$ (" niestandardowe menu li ") .Kliknięcie ....' z akcją i tematem, a także czym jest '$ ('. abc')' click handler do – Satpal

+0

@Satpal, dzięki. wyzwolić '$ (". abc ') 'kliknij przez' $ (". menu użytkownika li") 'kliknij. Również, aby wywołać kliknięcie przekazuję wartość json do '$ ('. Abc')' kliknięcie. – Becky

+0

@amdixon dzięki. Nie ma dla mnie większego sensu. Chcesz przekazać każdą skrzynkę do instrukcji switch przez json? Jako "case" Science ": $ (". Abc: eq (0) "). Trigger (" kliknięcie ", [" Zoologia "]); przerwa; – Becky

Odpowiedz

0

Nie jesteś pewien, czy chcesz użyć obudowy przełącznika. można użyć pętli for i jeśli

var jsonString = '[ [ "Science", "Zoology"],[ "Science", "Botany"],[ "Maths", "Geometry"] ]'; 
var keyValuePairs = JSON.parse(jsonString) 
for(var i = 0, l = keyValuePairs.length; i < l; i++) 
{ 
    if($(this).attr("data-action") == keyValuePairs[i][0]) 
     $('.abc:eq(' + i + ')').trigger('click',[keyValuePairs[i][1]); 
} 

Uwaga: pamiętać o this nie oceni, chyba że jest wewnątrz funkcji określonym powyżej

EDIT: wersja obudowy przełącznika za pomocą eval. Należy pamiętać używając eval jest mile widziana

var codeToEval = ""; 
var codeHead = '$(".custom-menu li").click(function(){\ 
    switch($(this).attr("data-action")) {\ 
    // A case for each action.' 
var part1 = 'case "', part2 = '": $(".abc:eq("'; 
var part3 = '").trigger("click",["', part4 = '"]); break;'; 
var codeFoot = '});' 
codeToEval = codeHead; 
for(var i = 0, l = keyValuePairs.length; i < l; i++) 
{ 
    codeToEval += part1 + keyValuePairs[i][0] + part2 + i + 
      part3 + keyValuePairs[i][1] + part4; 
} 
codeToEval += codeFoot; 
eval(codeToEval); 

To by uruchomić kod w zasięgu globalnym ale zbudować ciąg w formacie kodu ty opisujący

+0

dzięki. Co to oznacza 'if ($ (this) .attr (" data-action ") == keyValuePairs [i] [0])"? – Becky

+0

@Becky Podany json jest tablicą zawierającą tablice. więc w pierwszej pętli "i" będzie 0, więc pierwsza macierz w większej macierzy, tj. ["Nauka", "Zoologia"]. Drugie "[0]" będzie pierwszą wartością w mniejszej macierzy w pierwszym przypadku będzie "Science" – Sarfaraaz

+0

dzięki. Ponieważ mój json jest zapisywany zewnętrznie, mogę to zrobić jako '$ .each (val, function (i, su) {$ ('. Abc: eq (' + su [0] + ')'). Trigger ('click' , ['+ su [0]] +');}); '? Ale jak połączyć go z '$ (" .menu-menu li "). Click (function() {'? – Becky

0

Po pierwsze, przełącznik nie będzie działać jako zademonstrowałeś, więc użyłem obu elementów tablicy, aby to stworzyć.

TERAZ: To jest bardzo brzydkie, a nie moje zalecenie, ale aby to zrobić, musisz dodać skrypt do DOM po jego utworzeniu.

Najpierw pracuję przez JSON, aby utworzyć "menu" i skrypt (ponieważ nie miałem twojego HTMLa dla menu/listy).

Oto skrzypce pokazać to działa: enter link description here

Kod:

// create json object 
var myjson = [ 
    ["Science", "Zoology"], 
    ["Science", "Botany"], 
    ["Maths", "Geometry"] 
]; 
var myscriptStart = '$(".custom-menu li").on("click",function(){switch($(this).data("action")+$(this).data("subject")) {'; 
var myscriptEnd = '}});'; 
var myscriptMiddle = ''; 
// create the menu and list of click targets 
$(myjson).each(function (index) { 
    var key = this[0]; 
    var val = this[1]; 
    $('#menu').append('<li data-action="' + key + '"+ data-subject="' + val + '" data-target=".abc:eq(' + index + ')" >' + key + '</li>'); 
    $('#mytargets').append('<div class="abc">' + key + val + '</div>'); 
    myscriptMiddle += 'case "' + key + val + '": $(".abc:eq(' + index + ')").trigger("hack",["' + val + '"]); break;'; 
}).promise().done(function() { 
    var myfullscript = myscriptStart + myscriptMiddle + myscriptEnd; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.text = myfullscript; // use this for inline script 
    document.body.appendChild(script); 
});; 
// menu click handler 
$(".custom-menu li").on('rack', function() { 
    var action = $(this).data("action"); 
    var actionTarget = $(this).data("target"); 
    var actionSubject = $(this).data("subject"); 
    $(actionTarget).trigger('click', actionSubject); 
}); 

$('.abc').on('hack', function (e, a) { 
    alert(a);//what you passed in the hack event creation 
    $('#result').text($(this).text() + this.classList + $(this).index('.abc')); 
}); 
0

jest to właściwa metoda, aby obsłużyć te rzeczy typu: skrzypce przykład: http://jsfiddle.net/MarkSchultheiss/4bkxqvo9/

// create json object 
var myjson = [ 
    ["Science", "Zoology"], 
    ["Science", "Botany"], 
    ["Maths", "Geometry"] 
]; 
// create the menu and list of click targets 
$(myjson).each(function (index) { 
    var key = this[0]; 
    var val = this[1]; 
    $('#menu').append('<li data-action="' + key + '"+ data-subject="' + val + '" data-target=".abc:eq(' + index + ')" >' + key + '</li>'); 
    $('#mytargets').append('<div class="abc">' + key + val + '</div>'); 
}); 
// menu click handler 
$(".custom-menu li").on('click', function() { 
    var action = $(this).data("action"); 
    var actionTarget = $(this).data("target"); 
    var actionSubject = $(this).data("subject"); 
    $(actionTarget).trigger('click', actionSubject); 
}); 
$('.abc').on('click', function() { 
    $('#result').text($(this).text() + this.classList + $(this).index('.abc')); 
}); 
Powiązane problemy