我对内联与包含的Javascript有问题
我对JavaScript相对较新,正在尝试了解如何正确使用它。
如果我将JavaScript代码包装在匿名函数中,以避免将变量设为"公开",则包含JavaScript的html中的JavaScript内的函数将不可用。
最初加载页面时,JavaScript会加载并执行JavaScript,但是随后重新加载页面时,JavaScript代码不会再次执行。具体来说,如果我可以从html内调用执行httprequest
的函数,则可以使用httprequest
进行ajax调用,以将其从PHP文件中获取,并将返回的数据传递给onsuccess处理数据的回调函数。一种
<script type="text/javascript" ></script>
每次页面加载时都必须设置块,因为我必须将全部JavaScript代码注入该块中才能使其在页面加载时起作用,希望有人可以教育我。
解决方案
回答
最好不要将所有内容包装在匿名函数中,而只是希望它可以被执行。我们可以命名该函数,然后将其名称放入body标签的onload处理程序中。这应该确保它在每次加载页面时都运行。
回答
我建议只做window.onload:
<script type="text/javascript"> (function() { var private = "private var"; window.onload = function() { console.log(private); } })(); </script>
回答
取决于我们要执行的操作,但是为了避免污染全局名称空间,可以将代码添加到我们关心的元素上。
例如
<div id="special">Hello World!</div> <script> (function(){ var foo = document.getElementById('special'); foo.mySpecialMethod = function(otherID, newData){ var bar = document.getElementById(otherID); bar.innerHTML = newData; }; //do some ajax... set callback to call "special" method above... doAJAX(url, 'get', foo.mySpecialMethod); })(); </script>
我不确定这是否可以解决问题,但这是解决问题的一种方法。
回答
如果我们不使用JavaScript框架,则强烈建议我们使用。我使用的是MooTools,但还有很多其他非常可靠的工具(原型,YUI,jQuery等)。这些方法包括将功能添加到DomReady事件的方法。问题在于:
window.onload = function(){...};
就是我们只能在该事件上添加一个功能(后续分配将覆盖此功能)。
框架为此提供了更合适的方法。例如,在MooTools中:
window.addEvent('domready', function(){...});
最后,还有其他方法可以避免污染全局名称空间。只需对自己的代码命名(mySite.foo = function ...)即可避免任何潜在的冲突。
还有一件事。根据评论,我不是100%肯定我们遇到的问题是页面加载事件所特有的。我们是说ajax返回时也需要执行代码吗?如果是这种情况,请编辑问题。
回答
On initially loading the page the js loads and is executed but on subsequent reloads of the page the js code does not go through the execution process again
我不确定我是否完全理解问题,因为JS应该每次都执行,而不管它是包含脚本还是内联脚本。但是我想知道问题是否与浏览器缓存有关。缓存问题可能有两点:
- javascript包含正在被缓存,并且我们正尝试从该包含中提供动态生成的或者最近编辑过的javascript。
- ajax请求正在被缓存。
我们应该能够通过在服务器上设置响应头来避免缓存。
另外,此页面还描述了另一种解决来自ajax请求的缓存问题的方法。