我正在创建一个网站,其中一些网页至少包含一个媒体播放器,由于页面大小的限制,我只想在有媒体的网页中加载媒体播放器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的专业人士,我想知道这是如何工作的?
答案 0 :(得分:2)
使用更标准的方法加载:
<强>的jQuery 强>
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");
};
答案 1 :(得分:1)
你所指的是短路。
您看到的代码使用||
,即“或”运算符。因此对于“或”运算符,只有一个操作数需要为真。这意味着只要其中一个操作数满足条件,其余操作数就不会被评估。例如:
if (returnTrue() || returnFalse()) {
(其中函数说明了自己)由于短路,甚至不会调用returnFalse()
方法。 returnTrue()
条件满足“或”运算符,因为一个操作数(第一个)的计算结果为true。
“和”运算符相反,所有操作数必须计算为true
才能完成。
例如:
if (returnTrue() && returnFalse()) {
returnFalse()
将被调用,因为if
语句需要知道所有操作数是否都评估为true
。由于第一个 为真,它会继续评估操作数。另一个例子:
if (returnTrue() && returnFalse() && returnTrue()) {
只会执行前两个调用,但returnFalse()
会破坏比较,并且在它到达最后一个returnTrue()
之前会短路
所有这些“规则”都适用于if
语句之外,这就是您的代码有效的原因。因此,对于您的代码,它说“if player
是一个对象,继续评估操作数。”您的代码与以下内容基本相同:
if (typeof(player) == 'object') {
document.write("stuff");
}
我相信你知道。
参考: