2013-03-14 40 views
0

我为我的javascript代码使用命名空间,并且我认为我碰到了一个砖墙,其中有一个选择元素的属性属性。当我尝试使用(或不使用)命名空间调用函数时,错误控制台报告找不到该函数。Javascript命名空间+ 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处理程序到选择元素,但显然这是一个坏主意,因为选择不处理onclicks。

从调用和函数定义中剥离MYNS也没有帮助。

任何想法?

感谢, mwolfe

+3

'MyNS.handleChange'应该是'MYNS.handleChange'? – couzzi 2013-03-14 01:55:37

+2

''MYN.handleChange(this)''通过'eval()'运行,这是不必要的;只是传递函数的引用,或者使用事件监听器,例如'eSelect.addEventListener('change',handleChange);'看看[我对类似问题的回答](http://stackoverflow.com/a/15273623/451969),它演示了'addEventListener()'。请注意,IE8 2013-03-14 01:56:27

+1

谢谢@ coouzzi/Dereck,拼写错误。 – 2013-03-14 02:15:28

回答

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将引用触发事件的元素。

+0

否... ['addEventListener()'](https://developer.mozilla.org/en-US/docs/DOM/element.addEventListener)? ':(' – 2013-03-14 01:59:46

+0

@JaredFarrish新增了它,我最初避免了它,因为总是有IE警告...... – Dennis 2013-03-14 02:07:34

+0

啊......好多了......'')'(*让我们不要再提到“dispatchEvent” ()'。*) – 2013-03-14 02:08:54

1

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