0

我正在为我的 javascript 代码使用命名空间,并且我认为我已经为 select 元素使用了onchange属性。当我尝试使用(或不使用)我的命名空间调用函数时,错误控制台报告未找到该函数。

var MYNS = {}; //namespace
MYNS.modifySearchPage = function () {
    ....
    var eSelect = document.createElement("select")
    .....
    eSelect.setAttribute('onchange', 'MYNS.handleChange(this)');
    .....
    //set up the options (value, textcontent, eSelect.appendChild(theOption)
    ...
    // add the eSelect to the DOM
}
MYNS.handleChange = function (select) {
    //parse the select options
}

当我从下拉列表中选择一个项目时,我在控制台中得到的结果是: Uncaught ReferenceError: MYNS is not defined

我试图将命名空间添加到窗口,但这似乎没有帮助(而且我不相信这样做是安全的)。

我尝试将 onclick 处理程序添加到select元素,但显然这是一个坏主意,因为select不处理 onclicks。

从调用和函数定义中剥离 MYNS 也无济于事。

有任何想法吗?

谢谢, mwolfe

4

2 回答 2

4

不要使用属性来附加处理程序 - 使用属性:

eSelect.onchange = function() {
    MYNS.handleChange(this);
};

更一般地,您还可以使用标准和更推荐addEventListener

function changeHandler() {
    MYNS.handleChange(this);
}

if (eSelect.addEventListener) {
    eSelect.addEventListener('change', changeHandler, false);
} else if (eSelect.attachEvent)  {
    eSelect.attachEvent('onchange', changeHandler);  // fallback for IE
}

还值得注意的是,您可以致电

eSelect.addEventListener('change', MYNS.handleChange, false);

不过,您将需要修改您的回调 - 传递的参数将是一个事件对象,并且this函数内部将引用触发事件的元素。

于 2013-03-14T01:57:30.877 回答
1

你只是编码一个不同的单词的错误大小写MyNS.handleChange,它应该是MYNS.handleChange。在 JavaScript 中,变量区分大小写。

于 2013-03-14T01:58:03.017 回答