1

TL;DR - クリック ハンドラーが更新時にのみ機能する理由を知っている人はいますか?

私がそのような機能を持っている場合:

function selectState() {
    $('#state-select').change(function(event) {
        var state = $(this).val(); 
        $("#vmap").find(("#jqvmap1_") + (state.toLowerCase(''))).click(); 
    });
 }

そして、その関数を次のように実行します:

function setClickHandlers() {
    $(document).on('click','a#reset_tracker',function(event) {
        event.preventDefault();
        $.get('decisiontree/reset_tracker/', function(data) {
            window.location.reload();
        });
    });
    if ($('#vmap').length !== 0) {
        setTimeout(function(){
            $('#vmap').bind('regionClick.jqvmap', function(event, code, region) {
                $('#state-select').val(code.toUpperCase());
            });
            selectState(); //once the map loads, we should be able to select things, right
            }, 500);     
    }
}

次に、次のように呼び出されます。

function setupSlide() {
    setClickHandlers();
    if ((typeof $.fn.vectorMap !== "undefined" && $.fn.vectorMap !== null) &&       
$('#vmap').length !== 0) {
         $('#vmap').vectorMap({
             map: 'usa_en',
             backgroundColor: null,
             color: '#6a1912',
             hoverColor: '#fdb33f',
             selectedColor: '#fdb33f',
             enableZoom: true,
             showTooltip: true,
             onRegionClick: function(event, code, region) {
                 event.preventDefault();
                 $('#state-select').val(code.toUpperCase());
             }
         });
     }
 }

これは次のように呼び出されます:

 $(document).ready(function() {

    setupSlide(); 

    $(document).on('click','.prev', function(event) {
        event.preventDefault();
        loadSlide(prev_slide_url,{});
    });

    $(document).on('click','.next', function(event) {
        event.preventDefault();
        var answer;
        if ($(this).hasClass('button') || $(this).hasClass('button-small')) {
            answer = $(this).val();
        } else if ($(this).hasClass('arrow')) {
            answer = $('input[type=checkbox].answer:checked').val();
            if (!answer && $('input[type=checkbox]').length > 0) {
                $("p.inactive").addClass("error");
                return false;
            }
            if ($("#vmap").length > 0) {
                 //for the map, the value is in the select
                 answer = $('#state-select').val();
                 if ($("#state-select").val().length === 0) {
                     $("p.inactive").addClass("error");
                     return false;
                 }

             }
        } else if ($(this).hasClass('navbutton')) {
            answer = $(this).data('val');
        }

    loadSlide(next_slide_url,{answer: answer});
    });
});

SelectState のクリック メソッドは、次または前のボタン (document.ready で定義された機能を持つ) ではなく、その関数を含むページ (つまり、#vmap があるページ) が更新されたときにのみ呼び出されるのはなぜですか?コードのブロック) がクリックされますか? この種のコンテキストで、クリック ハンドラーに何か特別なことはありますか? 何が間違っているのか本当にわかりません。

追加することの 1 つは、#jqvmap1_ が SVG マップ、つまり米国のマップのパス要素を参照することです。でもrefreshで動くのでパス要素だから関係ないと思います。

この問題についてさらに説明が必要な場合はお知らせください。乱雑なコードをお詫びします。

4

0 に答える 0