我有一个页面,用户可以选择预订音乐会门票。首先,他们点击一位艺术家,将其发布到预订过程中(并将#34;艺术家"传递给起始功能)。
该程序然后加载艺术家的场地。当用户更改场地(并且值不是空白)时,它会尝试通过调用另一个功能来加载另一个选择下拉菜单中的可用日期。
原始代码如下:
<select onchange="loadDates(artist)">...</select>
但是由于某种原因,这并没有将参数从启动函数传递给下一个函数。
所以我也改了它:
<select onchange="loadDates.call(this, artist)">..</select>
然而,下一个功能仍然给我错误&#34;艺术家没有被定义&#34;当我试图运行它。任何人都可以看到我在这里做错了什么,因为我在网上看到这完美无缺。如果需要,我可以提供更多信息。感谢
答案 0 :(得分:3)
onXyz
属性中的代码在全局范围内运行,因此您的两个示例都要求有一个名为artist
的全局变量。如果没有,那么您将获得ReferenceError
,因为您正在尝试获取未定义的符号的值。
如果您打算传递字符串,请在其周围加上引号。如果你打算传递别的东西,你需要说出那是什么。但根本问题是artist
不是全局范围内的定义符号,而是您尝试使用它的地方。
如果你在某个非全局位置定义artist
(好!全局变量是件坏事),那么你需要通过现代技术来连接你的事件处理程序而不是使用onXyz
属性。
如果您不使用DOM库(如jQuery或类似的),最简单的方法是分配给select box元素的onXyz
属性:
(function() { // Something to keep the stuff inside from being globals
var artist = "Joe Cocker";
var selectBox = document.querySelector("selector for the select box");
selectBox.onchange = function() {
loadDates(artist); // `artist` is in scope now
};
})();
一般情况下,我避免使用onXyz
属性,因为它们每个元素只允许一个处理程序,更喜欢DOM方法addEventListener
(以及它特定于Microsoft的前身attachEvent
})。为简单起见,我没有在上面使用它们。如果您不使用DOM库,则可能需要this hookEvent
function given in another answer使用addEventListener
(如果有),或attachEvent
(如果不存在),并为{{attachEvent
提供一些缺失位。 1}}浏览器。