【问题标题】:conditionally load javascript resource有条件地加载 javascript 资源
【发布时间】:2014-11-03 00:24:00
【问题描述】:

我正在创建一个网站,其中一些页面至少包含一个媒体播放器,并且由于页面大小限制,我想仅在具有媒体的页面中加载媒体播放器 javascript 文件。我将媒体信息存储在页面头部的 javascript 对象中,其他脚本文件在正文末尾加载。

我发现this solution(使用$.getScript)非常好,但我想要一个不依赖任何框架的解决方案。我在jQuery 网站上看到了一个有趣的实现,我把它改成了这样:

<script>typeof(player) != 'object' || document.write(unescape('%3Cscript src="/assets/js/player/mediaplayer/jwplayer.js"%3E%3C/script%3E'));</script>

它就像一个魅力,但由于我不是 javascript 专业人士,我想知道它是如何工作的?

  • 如果我们没有对象类型的变量,是否不需要检查第二个条件?
  • 其他浏览器如何处理此代码?
  • 它们(甚至是较旧的 IE)是否都跳过了第二个条件,或者它们可能会检查所有条件?
  • 有没有更好的跨浏览器行为解决方案?

【问题讨论】:

  • 没有办法在服务器上做到这一点?看起来会容易得多。
  • @mccannf 用php检查js对象?解析 html 输出以加载 js 文件?你确定它更快吗?
  • 如果 html 最初是由 php 生成的,则不需要解析。只要它包含媒体对象,它就可以只包含所需的&lt;script&gt; 标签。..
  • 正如@MarkReed 所说,使用 PHP 根据页面中提供的内容有条件地包含脚本。
  • @MarkReed 我正在使用 Joomla,并且正在系统插件中生成播放器对象,我正在模板的页面底部生成播放器脚本代码。

标签: javascript performance cross-browser


【解决方案1】:

使用更标准的加载方法:

jQuery

使用getScript

if (typeof player != "object") {
    $.getScript("/assets/js/player/mediaplayer/jwplayer.js");
};

原始 JavaScript

function loadScript(path) {
    var script = document.createElement("script");
    script.src = path;
    script.type = "text/javascript";
    // changed "target" to "head"
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(script);
};

然后在你的代码中:

if (typeof player != 'object') {
    loadScript("/assets/js/player/mediaplayer/jwplayer.js");
};

【讨论】:

  • this solution 在我的问题中指的是 getScript ,正如我所描述的,我可能想在加载 jQuery 之前加载 js 文件并且我想要一个不使用任何框架的解决方案。无论如何,您的原始 js 解决方案似乎很有趣,为此 +1。
  • @commadelimited 有人更新了帖子,原因不明。
  • 我是更新帖子的人。我意识到我应该这样做而不是发表评论。
【解决方案2】:

你指的是短路。

您看到的代码使用||,即“或”运算符。因此,对于“或”运算符,只需其中一个操作数为真。这意味着只要其中一个操作数满足条件,其余的就不会被评估。例如:

if (returnTrue() || returnFalse()) {

(函数不言自明)returnFalse() 方法甚至不会因为短路而被调用。 returnTrue() 条件满足“或”运算符,因为 一个 操作数(第一个)的计算结果为真。

“与”运算符正好相反,所有操作数的计算结果都必须为 true 才能实现。

例如:

if (returnTrue() && returnFalse()) {

returnFalse() 被调用,因为if 语句需要知道是否所有操作数的计算结果都为true。由于第一个为真,它继续评估操作数。另一个例子:

if (returnTrue() && returnFalse() && returnTrue()) {

只有前两个调用会执行,但returnFalse() 会破坏比较,并且在到达最后一个returnTrue() 之前会短路

所有这些“规则”都适用于if 语句之外,这就是您的代码有效的原因。因此,对于您的代码,它的意思是“如果 player 是一个对象,请继续评估操作数。”您的代码与以下基本相同:

if (typeof(player) == 'object') {
    document.write("stuff");
}

我相信你知道。

参考:

【讨论】:

  • 我说我想要一个跨浏览器解决方案的原因是因为我找到了this page 关于动态脚本加载 但是在文章中间有一个关于IE的例子它说 ...this.readyState == 'loaded' || this.readyState == 'complete',但这有触发两次的风险,这让我担心 Internet Explorer 中 短路条件 的行为,特别是在较慢的旧版本中足够,加载更多外部资源可能会使其更慢。
猜你喜欢
  • 2013-03-09
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 1970-01-01
  • 2019-04-21
相关资源
最近更新 更多