Доступ к элементам внутри HTML с помощью jQuery

0

Я пытаюсь получить доступ к элементам в меню аккордеона. Я заполняю свое меню аккордеона данными 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 после загрузки страницы:

Изображение 174551

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

$("a").click(function (event) {
    alert("Value: " + event.target);
});

Если я "Value: HTMLSpanElement" на "Главная", он вернется: "Value: HTMLSpanElement". Но когда я нажимаю "ИМЯ СТРАНЫ ИДЕТ ЗДЕСЬ", ничего не происходит. Я не мог заставить это работать на скрипке, но вот что я могу предоставить:

http://fiddle.jshell.net/3d6Nz/2/

Теги:
function
accordion

5 ответов

0

изменил ваш код на работу, проходя через локальные данные 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
    });   
}
  • 0
    Спасибо за ваши усилия на (работающей) скрипке. Теперь я вижу, что проблема на самом деле заключается в том, где я загружаю свой JSON из файла. Когда я помещаю JSON в мой JavaScript, он работает как надо. Но когда я загружаю его из файла, он дает мне эффект «без ответа».
  • 0
    Когда я нажимаю на элемент «ИМЯ СТРАНЫ ИДЕТ ЗДЕСЬ» (когда JSON извлекается из файла), URL-адрес изменяется на http://localhost:10659/# . НО, когда я нажимаю на элемент «ИМЯ СТРАНЫ ИДЕТ ЗДЕСЬ» (когда JSON находится внутри файла JavaScript), URL-адрес не меняется вообще.
Показать ещё 2 комментария
0

Это связано с тем, что вы вызываете функцию события щелчка, прежде чем getJSON завершится, вероятно. Используйте следующую структуру;

var $result = $.getJSON('../JSON/cwdata.json', function(cwData){
    ......
});

$result.done(function(){
    $("a").click(function (event) {
      alert("Value: " + event.target);
    });
});

Подробнее о .done см. Здесь и название поиска. Объект jqXHR

0

Поскольку ваш список динамически генерируется, вам нужно использовать 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
});
0

Обычно это вызвано обработчиками несвязанных событий. Как указано выше, вы можете присоединить обработчики событий после того, как узлы будут вставлены в дерево DOM. Но это может привести к созданию многих функций обработчика событий. Чтобы предотвратить это, вы можете использовать делегирование событий:

$("#options").on('click', 'a', function (event) {
    $el = $(this);
    alert($el.text());  
    event.preventDefault();
    event.stopPropagation();       
});

Это предупреждает все тексты ссылок.

И да, ваш jsFiddle сломан, вы забыли включить поддержку jQuery.

0

Ваша скрипка вообще не работает. Я думаю, что вы получаете ошибку jQuery: Uncaught ReferenceError: $ is not defined

Убедитесь, что ваши ссылки jQuery вызывается перед скриптом.

  • 0
    в jsfiddle вы должны сначала выбрать библиотеку jquery на левой панели.
  • 0
    «Я не мог заставить это работать на скрипке»

Ещё вопросы

Сообщество Overcoder
Наверх
Меню