我被告知要避免公共变量和冲突,最好将整个插件放在匿名函数中。我试图这样做,但功能不再起作用。
这是一个简单的例子:
(function($) {
function changeIt() {
$("button").text("off");
}
}(jQuery));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="changeIt()">On</button>
该函数由HTML元素运行,但由于它在另一个函数内部,因此该元素无法找到它。
1-如何使其正常工作?
2-确保公共变量被覆盖并假设为私有变量是一种好方法吗?
由于
答案 0 :(得分:0)
这与范围有关。 changeIt函数仅存在于函数($)中。如果你想将它添加到公共范围,最好创建一个对象原型函数。
答案 1 :(得分:0)
(function($) {}(jQuery));
- &gt;这将创建一个私有范围,基本上您的函数不会在window
内定义,但在此私有范围内。
<button onclick="changeIt()">On</button>
- &gt;这将尝试从changeIt
执行window
,undefined
。
答案 2 :(得分:0)
因为该函数不再存在于全局对象中,因此html元素中的onclick
事件处理程序无法按名称找到它。
将您的HTML更改为
<button id="mybutton">On</button>
和您的代码
(function($) {
$("#mybutton").click(function(){
$("#mybutton").text("off");
});
}(jQuery));
它将起作用,因为不需要按名称查找处理程序
答案 3 :(得分:0)
您有两种选择:
停止使用内联事件
(function($) {
function changeIt() {
$("button").text("off");
}
$("button").click(changeIt);
}(jQuery));
或全球定义
//(function($) {
function changeIt() {
$("button").text("off");
}
//}(jQuery));
答案 4 :(得分:0)
由于在全局范围内找不到changeIt
(在浏览器的情况下为window
),因此单击时不会触发该功能。实际上,您的控制台应该显示如下异常:“Uncaught ReferenceError:changeIt not defined”。
要解决这个问题并保留你的函数结构,请在“onload”处理程序中设置处理程序:
(function($) {
$('#myBtn').on('click', function () {
$("button").text("off");
});
}(jQuery));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="myBtn">On</button>