我正在尝试使用其他人的JavaScript文件解决问题,并且他们声明了如下函数。
function window.confirm(str) {
..... code here .....
}
这适用于IE,但在谷歌浏览器中,它会在window.confirm
中的句点上引发未被删除的语法错误。我尝试像下面一样尝试捕获它,但是这不起作用,语法错误相同。然后它不允许我使用该JavaScript文件中定义的任何函数。
try {
var window.confirm = function(str) {
..... code here .....
};
}
catch(e) {}
我还试图将声明更改为变量,如下所示,但这也不起作用。同样的错误。
var window.confirm = function(str) {
..... code here .....
};
有没有办法在Chrome中捕获这个?
答案 0 :(得分:3)
两点:
try/catch
用于检测执行错误,而不是编译错误。不要部署语法错误的代码。
function window.confirm(){
是您必须避免的MS惯用语。您可以使用window.confirm = function() {
,或者,如果您位于全球范围内,则只需使用var confirm = function() {
。
答案 1 :(得分:3)
function window.confirm(str)
和var window.confirm ...
无效。相反,试试:
window.confirm = function(str){
..... code here .....
}
答案 2 :(得分:2)
如果你绝对需要尝试捕捉" Uncaught SyntaxError"错误,那么你将不得不依赖JavaScript隐藏在地板下的误解的继父eval()
功能。
在下面的示例代码中,obj
仅在传入字符串求值为有效对象时才会更新;否则obj
将默认为{}
。让我们假设$someTextField
拉入在CMS textarea字段中输入的设置,内容编辑器在字段中输入了这个格式错误的字符串:
{
"foo": "bar
}
示例代码:
var oSettings = {};
// Returns "Uncaught SyntaxError: Unexpected token ILLEGAL(…)"
try {
oSettings = <?php echo $someTextField ?>;
} catch(e) {}
// This works
try {
eval('oSettings = <?php echo $someTextField ?>');
} catch(e) {}
请记住,如果要评估的字符串来自某个外部源(例如CMS),并且您无法控制它,如本例所示,那么您需要做三件事:
检测并阻止执行可能会破坏您应用的地狱的JavaScript代码。
转义传入字符串中的引号以避免与JavaScript引号冲突。由于我们在此示例中使用PHP,因此最好执行以下操作:
eval('oSettings = <?php echo addslashes($someTextField) ?>');
删除换行符,因为评估的字符串需要在一行上。做这样的事情会更好:
eval('oSettings = <?php echo addslashes(str_replace(array("\r\n", "\n", "\r"), "", $someTextField)) ?>');
答案 3 :(得分:1)
您必须修复语法错误。 Try / catch不会捕获语法错误,因为语法错误是编译时错误,而try / catch只能捕获运行时错误。