0

在发现 Javascript 命名空间后,我尝试实现它们,但在尝试将命名空间方法附加到元素的 onclick 时遇到了问题。

我用这个方法来包装我的函数/方法/类(一个简化的概念,不是我的实际代码):

;(function(window, undefined) {

    //my namespace
    var NS = {};

    NS.test = {
        f : function(param) {
            alert(param);
        }
    }

    NS.test.('test 2');

})(window);

在里面,一切正常,并提示“测试 2”。

但是,当我尝试将该功能附加到单击事件时,通过执行以下操作:

<a href-"#" onclick="NS.test.f('test');">Click me!</a>

它不起作用,就像我在})(window);零件之后调用该函数时它不起作用一样。

我尝试调用它,window.NS.test.f('test');但没有任何效果。

如何让 onclick 事件调用我的函数?

我可以在我的包装器中附加一个事件侦听器,就像我对其他 html 元素所做的那样毫无困难,但在这种情况下会出现问题,因为我使用 javascript 生成链接,我发现onclick="doSomething"为所有人添加更容易和更简单我的链接,而不是创建它们,然后缓存它们并添加事件侦听器。

叫我懒惰,但在这种特殊情况下,我更喜欢这样做

someDiv.innerHTML = my_Generated_Html_Code_With_OnClick;

代替

//demo code, ignore the flaws and the fact it won't work on IE
someDiv.innerHTML = my_generated_Html_code;
myLink = document.getElementById(id);
myLink.addEventListener('mousedown', NS.test.f('test'));

我不使用任何框架,也不希望使用,因为我试图首先更好地理解所谓的 vanilla javascript。

我在这里设置了一个 jsfiddle 。

PS我必须承认我没有完全理解命名空间,所以如果我在这里做错了什么或者以我不应该的方式应用这个概念,我将不胜感激任何提示或更正

4

1 回答 1

4

这是因为NS在内部声明,因此只存在于函数内部:

function(window, undefined) {
    var NS = {};

    // NS exists here ...
}

// ... but not here

如果您想让它对页面的其余部分可用,那么您可以执行以下操作:

function(window, undefined) {

    var NS = window.NS = {};

    // NS and window.NS exist here ...
}

// ... and window.NS exists here.
于 2012-07-05T09:11:08.313 回答