我对内联与包含的Javascript有问题

时间:2020-03-05 18:54:48  来源:igfitidea点击:

我对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请求的缓存问题的方法。