是否有可能阻止浏览器解析文件中存在的所有javascript代码(例如,咳嗽)ie8?如果从理论上讲这是可能的,我很好奇,因为实际上我的具体情况有变通方法。
这就是我的意思:
(HTML)
<!--[if lt IE 9]>
<script type="text/javascript">
window.browser = 'bad';
</script>
<![endif]-->
(myfile.js,使用此代码,字面上不会在ie8中运行)
if(window.browser != 'bad')
{
ColorSpace.singletons = {
get gray() { //get is not correctly parse in <ie8
return shadow(this, 'gray', new DeviceGrayCS());
},
get rgb() {
return shadow(this, 'rgb', new DeviceRgbCS());
},
get cmyk() {
return shadow(this, 'cmyk', new DeviceCmykCS());
}
};
}
谢谢!
(先发制人编辑) 对于那些可能会想“等待!javascript被解释...”的人,我的回答是:首先,浏览器会进行一些初始解析,例如将其拆分为令牌,并且在此情况下令牌“get”将在代码有机会之前中断被解释,因为它是无序的
答案 0 :(得分:0)
第一步;将您的脚本分成.js
个文件,比如my_awesome_code.js
(只是注意到您已经完成了此操作)
如果您不能认为 JavaScript 解释器会接受语法,那么保护自己的最佳方法仍然是功能检测,但这次使用最小的测试用例和try..catch
例如,要测试let
var can_use_let = false;
try {
eval('(function () {let i = 0;})');
can_use_let = true;
} catch (e) {
if (console && console.warn)
console.warn(e);
}
console.log("You " + ['can not', 'can'][+can_use_let] + " use __let__!");
此时您知道是否可以动态包含使用这些功能的<script src="my_awesome_code.js"></script>
答案 1 :(得分:0)
正如评论中所讨论的,您可以简单地将代码粘贴到浏览器不会将其视为代码的地方,稍后(ab)使用eval()
。例如,使用字符串文字:
if(window.browser != 'bad')
{
eval("ColorSpace.singletons = {\
get gray() { //get is not correctly parse in <ie8\
return shadow(this, 'gray', new DeviceGrayCS());\
},\
get rgb() {\
return shadow(this, 'rgb', new DeviceRgbCS());\
},\
get cmyk() {\
return shadow(this, 'cmyk', new DeviceCmykCS());\
}\
};");
}
为了避免换行符和引号的笨拙反斜杠,还可以使用<script>
标记,其中type
属性设置为非javascript(或最好是无效的MIME)类型,或者实际上是您知道浏览器无法呈现的有效/无效HTML标记(实际上,甚至是
<div style="display:none;">code here</div>`
会这样做。稍后可以使用.innerText
将此代码检索为字符串。如果你想从另一个文件远程获取它,你必须更加微妙并且动态地包含它,正如Paul的回答所示,或者有一个<script>
标签来更改source属性,如下所示< / p>
<script id=customScript></script>
// ... and much, much later:
window.browser != 'bad' &&
document.getElementById('customScript').src="path/to/my/script.js";
这是一个简短的小提示:http://jsfiddle.net/4mBBL/
eval
有几个主要缺点:调试它是一场噩梦,可读性更加如此,并且每次eval()
调用时代码的整体有用性都会大幅降低,因此请尽可能避免使用它。尽管如此,我们还是看到它在所有的互联网上使用了它们,而且它们都在使用了它们。