我对内联和包含的 Javascript 有疑问
Posted
技术标签:
【中文标题】我对内联和包含的 Javascript 有疑问【英文标题】:I have an issue with inline vs included Javascript 【发布时间】:2010-09-09 05:47:49 【问题描述】:我对 javascript 比较陌生,正在尝试了解如何正确使用它。
如果我将 JavaScript 代码包装在匿名函数中以避免生成变量 public
,则 JavaScript 中的函数在包含 JavaScript 的 html 中不可用。
在最初加载页面时,JavaScript 会加载并执行,但在随后重新加载页面时,JavaScript 代码不会再次执行执行过程。具体来说,有一个使用 httprequest
的 ajax 调用从 php 文件中获取它,并将返回的数据传递给回调函数,如果我可以调用执行 @ 的函数,该函数在 onsuccess 中处理数据987654323@ 来自 html 中的一个
<script type="text/javascript" ></script>
每个页面加载的块我都准备好了 - 因为我必须将整个 JavaScript 代码注入该块以使其在页面加载时工作,希望有人可以教育我。
【问题讨论】:
【参考方案1】:如果您不使用 javascript 框架,我强烈建议您使用它。我使用 MooTools,但还有许多其他非常可靠的工具(Prototype、YUI、jQuery 等)。其中包括将功能附加到 DomReady 事件的方法。问题:
window.onload = function()...;
您只能将一个函数附加到该事件(后续分配将覆盖该函数)。
框架为此提供了更合适的方法。例如,在 MooTools 中:
window.addEvent('domready', function()...);
最后,还有其他方法可以避免污染全局命名空间。只需为您自己的代码命名空间 (mySite.foo = function...) 将帮助您避免任何潜在的冲突。
还有一件事。从您的评论中,我不能 100% 确定您遇到的问题是特定于页面加载事件的。您是说在ajax返回时也需要执行代码吗?如果是这种情况,请编辑您的问题。
【讨论】:
【参考方案2】:我建议只做 window.onload:
<script type="text/javascript">
(function()
var private = "private var";
window.onload = function()
console.log(private);
)();
</script>
【讨论】:
【参考方案3】:在最初加载页面时,js 会加载并执行,但在随后重新加载页面时,js 代码不会再次执行执行过程
我不确定我是否完全理解您的问题,因为 JS 应该每次都执行,无论它是包含脚本还是内联脚本。但我想知道您的问题是否与浏览器缓存有关。缓存问题可能有两个不同的点:
正在缓存您的 javascript 包含,并且您正尝试从该包含中提供动态生成或最近编辑的 javascript。
正在缓存您的 ajax 请求。
您应该能够避免在服务器上通过setting response headers 进行缓存。 此外,this page 描述了另一种解决 ajax 请求缓存问题的方法。
【讨论】:
【参考方案4】:最好不要将所有内容都包装在匿名函数中,只希望它被执行。您可以命名该函数,并将其名称放在 body 标记的 onload 处理程序中。这应该确保它在每次加载页面时运行。
【讨论】:
【参考方案5】:取决于你想做什么,但为了避免污染全局命名空间,你可以将你的代码附加到你关心的元素上。
例如
<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 有疑问的主要内容,如果未能解决你的问题,请参考以下文章