从onchange属性调用javascript类函数
calling javascript class function from onchange attribute
我有一个简单的类,它有几个方法(目前)。我可以实例化它并调用init函数,但不能从onchange
属性调用另一个方法。
这是
var ScheduleViewer = (function() {
var options = {
container: 'trip_stops',
schedule: {}
};
function ScheduleViewer (){};
ScheduleViewer.prototype.init = function(params) {
$.extend(options, params);
// setTimeout(function() {
// ScheduleViewer.addListener(options);
// }, 3000);
this.addListener(options);
}
ScheduleViewer.prototype.getSchedule = function(trip_id) {
var _id = trip_id;
console.log(_id);
}
ScheduleViewer.prototype.addListener = function(options) {
console.log("adding listener");
var _id = options.select_id;
console.log($('#train_select').length);// zero assuming timing issue
$('#'+_id).on('change', function() {
alert("changed");
})
}
return ScheduleViewer;
})();
呼叫
<div id="trip_stops" class="trip_options">
<% if (trips.length > 0) { %>
<%
var params = {
schedule: schedule
};
var scheduler = new ScheduleViewer();
scheduler.init(params);
%>
<select id="train_select">
<option value="0" selected disabled>Select a train</option>
<% $.each(trips, function(index, val) { %>
<option value="<%= val.trip_id %>">
<%= val.train_num %> Train
</option>
<% }); %>
</select>
<% } else { %>
No trips scheduled.
<% } %>
</div>
请注意,我使用jqote进行模板化。
我从init调用中获取日志,但随后在onchange
和Uncaught ReferenceError: scheduler is not defined
中失败。我不确定我做错了什么。有指针吗?
感谢
编辑:我尝试添加一个在初始化时被调用的侦听器。我认为,由于时间问题,听众不会受到束缚。现在,这就是我缺乏经验的原因。我尝试了setTimeout
,但函数调用没有按原样进行。
我不知道为什么这可能不起作用,但无论如何都不应该真正使用内联样式/函数。
为什么不尝试在脚本中获取元素,并对其应用onchange
函数呢?
var scheduler = new ScheduleViewer();
select = document.getElementById('train_select');
scheduler.init(params);
select.onchange = function() {
scheduler.getSchedule(this.value)
};
尝试用javascript绑定事件并删除内联事件。
var scheduler = new ScheduleViewer();
scheduler.init(params);
$(document).on('change', '#select', function() {
scheduler.getSchedule(this.value)
});
我以前从未使用过jQote,但这可能是因为jQote处理变量声明的方式吗?尝试在模板代码之外安装scheduler
对象。
<script>
var scheduler = new ScheduleViewer(),
params = { schedule: schedule };
scheduler.init(params);
</script>
<!-- template code... -->
此外,请注意,按照您编写代码的方式,所有ScheduleViewer实例都将共享同一个options
对象我不确定您将如何处理这个options
对象,但我想这不是所需的行为。
最后,正如其他人已经指出的那样,在内联中添加事件侦听器是一种糟糕的做法,您应该使用JavaScript以编程方式注册偶数处理程序。使用本机addEventListener
函数或使用您喜爱的库的辅助函数。
我不熟悉jqote,但它看起来像是一个范围界定问题。如果必须使用内联onchange,请将对象引用放在窗口对象中,然后从那里访问它。
window['scheduler'] = new ScheduleViewer();
window['scheduler'].init(params);
和
<select id="train_select" onchange="window['scheduler'].getSchedule(this.value)">
因此,为了解决这个问题,我最终将类添加到了窗口对象中。我遇到了侦听器的问题,因为加载模板的代码不够快,绑定也没有发生。
该类看起来像:
window.ScheduleViewer = (function() {
var options = {
container: 'trip_stops',
schedule: {}
};
this.init = function(params) {
$.extend(options, params);
}
this.getSchedule = function(trip_id) {
var _id = trip_id;
//Do some cool stuff with GTFS data
}
//More functions
return this;
})();
模板化的html:
<div id="trip_stops" class="trip_options">
<% if (trips.length > 0) { %>
<%
var params = {
schedule: schedule
};
ScheduleViewer.init(params);
%>
<select id="train_select" onchange="ScheduleViewer.getSchedule(this.value)">
<option value="0" selected disabled>Select a train</option>
<% $.each(trips, function(index, val) { %>
<option value="<%= val.trip_id %>">
<%= val.train_num %> Train
</option>
<% }); %>
</select>
<% } else { %>
No trips scheduled.
<% } %>
</div>
感谢您的回复。
- 从类方法中的 ajax post 函数回调函数更改 javascript 类属性
- 从Javascript类对象返回函数
- 如何将来自多个 JavaScript 类的函数组合到一个对象中
- JavaScript:对类/函数和对象使用相同的名称
- 单击JavaScript添加和删除类函数
- Javascript 使用函数访问其他类
- Javascript:类构造函数基础 - 在单独的方法中定义属性
- 如何将此元素传递给 JavaScript onclick 函数并向该单击的元素添加一个类
- 在forEach中调用类函数:Javascript如何处理“this”关键字
- 在javascript类中调用函数
- 共享函数的 Javascript 类
- 如何从闭包调用javascript类函数
- Javascript类调用函数中的函数
- 创建一个 JavaScript 构造函数,该函数对数组进行子类化
- 从onchange属性调用javascript类函数
- Javascript类-函数优化(函数中的函数)
- 在主脚本中创建一个JavaScript类函数调用函数
- JavaScript类函数此操作符
- 在JavaScript类函数中使用setTimeout()
- 正在导出Javascript类函数