javascript结合了公共和私有窗口.onload
javascript combining public and private window.onload
我目前正在构建网站时学习javascript名称空间,我有以下要求:我想让我的所有代码都是私有的,这样页面上的其他公共脚本(可能是广告,现阶段我不太确定)就不能覆盖或更改我的javascript。我预见到的问题是公共脚本可能使用CCD_ 1,并且我不希望它们覆盖我的CCD_。不过我还是想让他们运行window.onload
。
到目前为止,我有以下布局:
//public code not written by me - i'm thinking this will be executed first
window.onload = function() {
document.getElementById('pub').onclick = function() {
alert('ran a public event');
};
};
//private code written by me
(function() {
var public_onload = window.onload; //save the public for later use
window.onload = function() {
document.getElementById('priv').onclick = function() {
a = a + 1
alert('ran a private event. a is ' + a);
};
};
if(public_onload) public_onload();
var a = 1;
})();
我对此有不少疑问。。。
首先,这是编写javascript代码的好结构,还是有更好的结构?(我计划把我所有的代码都放在匿名函数中)。我的私有代码真的是私有的吗?或者有没有一种方法可以让公共javascript访问它?我猜答案是"是的-使用棘手的eval技术。不要嵌入你不信任的代码",但我想知道如果是这样的话该怎么做。
其次,当我点击公共链接时,事件不会被触发。为什么会这样?
最后,如果我注释掉if(public_onload) public_onload();
行,那么当我单击私有按钮时,a
将正确返回。但如果我把这一行留在里面,那么a
的值是nan。为什么会这样?
您可以附加事件侦听器,以避免它们以如下方式被覆盖:
<ol id="res"></ol>
<script type="text/javascript">
var res = document.getElementById('res');
function log(line) {
var li = document.createElement('li');
li.innerHTML = line;
res.appendChild(li);
}
// global code:
window.onload = function() {
log('inside the global window.onload handler');
};
// private code:
(function(window) {
function addEvent(el, ev, fn) {
if (el.addEventListener) {
el.addEventListener(ev, fn, false);
} else if (el.attachEvent) {
el.attachEvent('on' + ev, fn);
} else {
el['on' + ev] = fn;
}
}
addEvent(window, 'load', function() {
log('inside the second window.onload handler in "private section"');
});
})(window);
</script>
演示
您询问的代码组织示例:
HTML:
<ol id="res"></ol>
JavaScript:
/* app.js */
// in global scope:
var MyApp = (function(app) {
var res = document.getElementById('res');
app.log = function(line) {
var li = document.createElement('li');
li.innerHTML = line;
res.appendChild(li);
};
app.doWork = function() {
app.log('doing a work');
};
return app;
})(MyApp || {});
/* my-app-module.js */
// again in global scope:
var MyApp = (function(app) {
app.myModule = app.myModule || {};
app.myModule.doWork = function () {
app.log('my module is doing a work');
};
return app;
})(MyApp || {});
/* somewhere after previous definitions: */
(function() {
MyApp.doWork();
MyApp.myModule.doWork();
})();
演示
MyApp可从外部访问
外部无法访问任何东西
相关文章:
- javascript结合了公共和私有窗口.onload
- IE 错误窗口.onload 不会始终如一地触发
- 窗口.onload Uncaught TypeError: undefined不是函数
- 重写窗口= onload
- 多个javascript窗口.onload解决方案
- 窗口.onload在Firefox上不起作用
- 窗口onload调用magnificpopup
- jJavascript窗口.Onload事件的正确用法
- 打印稿窗口.Onload不被调用后,增加了相位游戏的要求
- 如何启动窗口.onload“onload"
- emscripten窗口.onload等价的
- 窗口.onload函数在Mozilla Firefox上不起作用
- 窗口.Onload won't call和won't创建一个'
'标签 - 如何使用窗口.Onload函数分配一个验证回调函数
- 添加到窗口.onload事件
- 仅使用Javascript的多个窗口onload函数
- 窗口.Onload不能自动提交一个for
- 窗口.Onload方法,如何调用多个函数
- 窗口.onload范围
- JavaScript/HTML:如何使用窗口.onload=x连同body onload= "setTimeo