我对内联和包含的 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 有疑问的主要内容,如果未能解决你的问题,请参考以下文章

4.支付平台架构:业务规划设计与实现 --- 中国银联和中国网联

子资源完整性对内联 JavaScript 有用吗?

级联和嵌套的判断语句和多路分支

直联和间联的区别——直连和间连的区别

JavaScript基础语法

JavaScript 事件对内存和性能的影响