Я пытаюсь получить доступ к элементам в меню аккордеона. Я заполняю свое меню аккордеона данными JSON, которое загружается с помощью jQuery. Я вижу, что полное меню создается при загрузке страницы. Проблема в том, что я не могу получить доступ к второму уровню в меню.
JSON файл ("cwdata.json"):
{
"Country": [{
"CountryName": "COUNTRY NAME GOES HERE",
"Region": [{
"RegionName": "REGION NAME GOES HERE",
"SubRegion": [{
"SubRegionName": "SUBREGION NAME GOES HERE"
}]
}]
}]
}
jQuery используется для заполнения меню аккордеона из файла JSON:
$.getJSON('../JSON/cwdata.json', function (cwData) {
$.each(cwData.Country, function (i, country) { // loop through all the countries
var countries = '<li class="country_name"><a href="#">' + country.CountryName + '</a></li>'; // the name of the country
var country_region = '<ul class="country_region">'; // create a list of all the regions in the country
var region_subregion = "";
$.each(country.Region, function (i, region) { // loop through all the regions
country_region += '<li class="region_name"><a href="#">' + region.RegionName + '</a></li>'; // the name of the region
region_subregion = '<ul class="region_subregion">'; // create a list of all the subregions in the region
$.each(region.SubRegion, function (i, subregion) { // loop through all the regions
region_subregion += '<li class="subregion_name"><a href="#">' + subregion.SubRegionName + '</a></li>'; // the name of the subregion
});
region_subregion += '</u>'; //close the list tags
});
country_region += '</ul>'; //close the list tags
$(countries).appendTo('#Country').append(country_region); // append the region to the country and append the country to the accorion menu
$(region_subregion).appendTo("li.region_name"); // append the subregion to the region
});
}); // getJSON
Первый пункт в меню ("Главная") работает, когда я нажимаю на него. Но любой элемент в разделе "Главная" не имеет никакой реакции или обратной связи, когда я нажимаю на него.
Это меню HTML после загрузки страницы:
Я могу использовать этот код, чтобы проверить, что этот элемент, когда я нажимаю на него:
$("a").click(function (event) {
alert("Value: " + event.target);
});
Если я "Value: HTMLSpanElement"
на "Главная", он вернется: "Value: HTMLSpanElement"
. Но когда я нажимаю "ИМЯ СТРАНЫ ИДЕТ ЗДЕСЬ", ничего не происходит. Я не мог заставить это работать на скрипке, но вот что я могу предоставить:
изменил ваш код на работу, проходя через локальные данные json и проверив, что клики действительно работают.
Адаптируйте свою функцию для запуска только тогда, когда на странице загружен документ
Следуйте FIDDLE: ЩЕЛКНИТЕ ЗДЕСЬ (Обновлено)
ОБНОВЛЕНИЕ. Чтобы иметь возможность использовать действительный внешний JSON файл URL-адреса, мне пришлось изменить данные из JSON на JSONP-подход, и файл данных изменился на это:
Populate({
"Country": [{
"CountryName": "COUNTRY NAME GOES HERE",
"Url" : "http://country",
"Region": [{
"RegionName": "REGION NAME GOES HERE",
"Url" : "http://region",
"SubRegion": [{
"SubRegionName": "SUBREGION NAME GOES HERE",
"Url" : "http://subregion"
}]
}]
}]
});
Также обновлен ротин, чтобы использовать свойства URL из JSON для применения в элементах привязки
$(document).ready(function() {
$.ajax({ url:'http://rkti.com/stack/data.js', dataType: 'jsonp'});
});
Размещенные основную логику в имени Populate
функции, которую называют в JSONP OnSuccess нагрузки.
function Populate(cwData) {
$.each(cwData.Country, function (i, country) {
var countries = '<li class="country_name"><a href="' + country.Url + '">' + country.CountryName + '</a></li>';
var country_region = '<ul class="country_region">';
var region_subregion = "";
$.each(country.Region, function (i, region) {
country_region += '<li class="region_name"><a href="' + region.Url + '">' + region.RegionName + '</a></li>';
region_subregion = '<ul class="region_subregion">';
$.each(region.SubRegion, function (i, subregion) {
region_subregion += '<li class="subregion_name"><a href="' + subregion.Url + '">' + subregion.SubRegionName + '</a></li>';
});
region_subregion += '</u>';
});
country_region += '</ul>';
$(countries).appendTo('#Country').append(country_region);
$(region_subregion).appendTo("li.region_name");
});
$('a').on('click',function(e){
alert($(this).text());
e.preventDefault(); //Avoids default behavior of A# (going to top/change page)
e.stopPropagation(); //Avoits any recursive click
});
}
Это связано с тем, что вы вызываете функцию события щелчка, прежде чем getJSON завершится, вероятно. Используйте следующую структуру;
var $result = $.getJSON('../JSON/cwdata.json', function(cwData){
......
});
$result.done(function(){
$("a").click(function (event) {
alert("Value: " + event.target);
});
});
Подробнее о .done
см. Здесь и название поиска. Объект jqXHR
Поскольку ваш список динамически генерируется, вам нужно использовать on(), click() работает только на элементах, которые уже находятся на странице, например, на вашей домашней ссылке:
$("a").on("click", function (e) {
e.preventDefault(); //Prevent default browser behavior
alert("Value: " + $(this).text()); //Wrap "this" with jQuery to access the clicked element
});
Обычно это вызвано обработчиками несвязанных событий. Как указано выше, вы можете присоединить обработчики событий после того, как узлы будут вставлены в дерево DOM. Но это может привести к созданию многих функций обработчика событий. Чтобы предотвратить это, вы можете использовать делегирование событий:
$("#options").on('click', 'a', function (event) {
$el = $(this);
alert($el.text());
event.preventDefault();
event.stopPropagation();
});
Это предупреждает все тексты ссылок.
И да, ваш jsFiddle сломан, вы забыли включить поддержку jQuery.
Ваша скрипка вообще не работает. Я думаю, что вы получаете ошибку jQuery: Uncaught ReferenceError: $ is not defined
Убедитесь, что ваши ссылки jQuery вызывается перед скриптом.
http://localhost:10659/#
. НО, когда я нажимаю на элемент «ИМЯ СТРАНЫ ИДЕТ ЗДЕСЬ» (когда JSON находится внутри файла JavaScript), URL-адрес не меняется вообще.