2016-08-23 70 views
0
var myTimelineVis = { 
    loadData: function(visItems, visContainer, visOptions, visTimelines) { 
     $.getJSON('myURL/' + $(this).val(), function(data) { 
      visItems.clear(); 
      $.each(data, function(i, imp_sched_events) { 
       $.each(imp_sched_events.items.timeline_dataset, function(i, item) { 
        visItems.add(item); 
        if ($(visContainer).is(':empty')) { 
         visTimeline = new vis.Timeline(visContainer, visItems, visOptions); 
        } else { 
         visItems.update(item); 
        } 
        visTimeline.fit(); 
        $('.vis-item-content').foundation(); 
       }); 
      }); 
     }); 
    }, 
    setData: function(selectClass) { 
     var visItems = new vis.DataSet(), 
      visContainer = document.getElementById('visualization'), 
      visOptions = {}, 
      visTimeline = ''; 
     $(selectClass).on('change', function(visItems, visContainer, visOptions, visTimelines) { 
      this.loadData(visItems, visContainer, visOptions, visTimelines); 
     }); 
    } 
} 

$(document).ready(function() { 
     myTimelineVis.setData('select.implementation_schedule'); 
}); 

我試圖在頁面加載時創建vis時間軸,然後在選擇更改(我有兩個選擇)時將數據加載到它上面。在頁面加載時,我可以在Chrome控制檯中看到更改事件綁定到兩個選擇,但實際選擇更改沒有任何反應,甚至沒有發生錯誤。它只是表現爲他們不存在。jQuery .on更改事件綁定但未觸發

這是一個範圍問題?

+1

那麼他們存在,當你綁定事件? 'console.log($(selectClass).length)' – epascarello

+1

注意,只有一個參數(Event對象)被傳遞給事件處理函數'.on('change',function(visItems,visContainer,visOptions, visTimelines){...}''''''''''''''''''''''''''''''''''''''''''檢查[on](http://api.jquery.com/on/)查看,如何傳遞參數 – Teemu

+0

您是否正在嘗試$(selectClass).change();' – Shanimal

回答

1

對於jQuery,偵聽器不會被添加到Ajax調用中,而是添加到$(document).ready()中。它的工作方式與香草JavaScript不同。

如果select是動態更改的,則需要使用以下語法和硬編碼選擇器。選擇器可以像「#myForm select」一樣寬泛。沒有必要使用變量。

$(document).on('change', '.selectClass', function(visItems, visContainer, visOptions,  visTimelines) { 
      this.loadData(visItems, visContainer, visOptions, visTimelines); 
     }); 
}); 
+0

我最終重構了代碼,但是這個答案使我走上了正確的軌道,謝謝! – tomster2300

+0

不客氣! – user1861582