Chrome未捕获的语法错误:意外的非法标记。

139

当Chrome尝试加载页面上的脚本文件时,出现了主题错误。它说是在javascript文件的最后一行。我似乎找不到任何问题。在Firefox中没有错误,并且脚本按预期工作。只是使用表单验证。

// JavaScript Document
$(function() {
  $('#wm-form').submit(function() {
    var errors = false;
    var errorMsg = "";
    $('.required').each(function() {
      if(!validField($(this))) {
        errorMsg += $(this).attr('name').capitalize() + " cannot be blank\n";
        errors = true;
      }
    });
    var emailAddress = $('#email');
    if(isValid(emailAddress) && !(/^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$/.test(emailAddress.val()))) {
      errorMsg += "Not a valid email address. Please enter in a correctly formatted email address";
      errors = true;
    }
    if(errors) {
      alert(errorMsg);
      return false;
    }
  });

  $('.form-focus').click(function() {
    $(document).scrollTop(0);
    $('#first_name').focus();
    return false;
  });
});

function validField(element) {
  if(!isValid(element.val()) || (element.attr('placeholder') && element.attr('placeholder') == element.val()) || 
    (element.attr('type') == 'radio' && !checkedRadio(element))) {
    return false;
  }
  else {
    return true;
  }
}

function isValid(ele) {
  if(ele == null || ele == '') {
    return false;
  }
  else {
    return true;
  }
}

String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
};

function checkedRadio (element) {
  var valid = false;
  $('input[name="'+ element.attr("name") +'"]:checked').each(function() {
    valid = true;
  });

  return valid;
}​

当我使用包含额外echo测试的php5类时,Ajax出现相同问题,JSON返回的数据变得无效。 - khaled_webdev
我发现如果返回的JSON文件是单行的,问题就得到了解决。希望这有所帮助。 - my account_ram
1
如果您在WordPress中遇到此问题,请从functions.php中调用脚本。我有一个特定的模板,我直接从模板中调用JS。在wp_head或wp_footer中切换到条件加载解决了这个问题。 - Alpesh Shah
只需在Notepad++中打开有问题的文件,删除最后一个字符(空格),然后将文件另存为UTF-8无BOM格式,问题就解决了。 - Marcos Buarque
这里没有涉及到可能的“智能”字符替换,例如Mac的弯引号“”‘’。关闭文本替换或搜索/替换这些字符可以解决此问题。 - OxC0FFEE
4个回答

262

这段代码末尾有一种假字符。尝试删除最后一行并重新添加。

目前我还不能确定具体是什么字符...

编辑 — 我认为它可能是零宽空格,Unicode 200B。看起来很奇怪,当我将包括完整的最后一行的函数复制/粘贴到Chrome控制台中时,就会出现错误。

jsfiddle这样的网站是产生此类字符的罪魁祸首。我并不是说它们有什么问题—这只是某些副作用,也许是使用内容可编辑输入小部件的结果。

如果你怀疑自己遇到了这样的问题,并且使用的是MacOS或Linux / Unix,命令行工具od可以显示源代码文件中字符的数字值(虽然显示方式相对较丑陋)。一些IDE和编辑器也可以显示“奇怪”的字符。请注意,此类字符并不总是问题。在大多数合理的编程语言中,例如,在字符串常量中嵌入Unicode字符是完全可以的。问题发生在语言解析器在预期之外遇到这些字符时。


2
哇,感谢您发布了这个解决方案。起初我不相信我的代码因为复制/粘贴而无法工作,但我想试一试,结果问题得到了解决。 - Metropolis
81
+1 谢谢你,Pointy。我是通过在 jsFiddle 上复制粘贴得到那个字符的。 - iambriansreed
4
我经常遇到这种情况,当我在jsfiddle上创建脚本,然后将它复制粘贴到文本编辑器并尝试在浏览器中运行时。这是一个隐藏字符,我相信在Mac上会显示为一个类似于子弹点的圆点。 - jaredwilli
2
遇到了与Unicode字符LINE SEPARATOR值2028相同的问题。我使用了http://rishida.net/tools/conversion/上的在线工具来查找可能隐藏在我的字符串中的Unicode字符。 - Benjamin Piette
2
复制粘贴PDF文件时出现错误。我的问题是使用引号“ ”而不是 " "。 - Deke
显示剩余9条评论

14

我在从jsfiddle复制代码后,在Chrome上遇到相同的错误。

如果您从jsfiddle的面板中选择所有代码并将其粘贴到免费文本编辑器Notepad++中,您应该能够在代码的末尾看到问题字符作为问号“?”。删除此问号,然后从Notepad ++复制并粘贴代码即可解决问题。


11

当多行字符串包含换行符(\n)时,我遇到了相同的错误。将所有行合并为一行(因此删除所有换行符),然后发送到浏览器通常可以解决问题。但编码非常不方便。

通常在Chrome中无法理解为什么会出现这种情况,直到我看到一份声明,说明Chrome中的当前版本JavaScript引擎不支持用单引号括起来并且具有换行符(\n)的多行字符串。为使其正常工作,多行字符串需要用双引号括起来。将我的代码更改为这个,解决了这个问题。

我将尝试找到一个证明这一点的标准或Chrome文档的参考资料。在那之前,尝试这个解决方案,看看它是否也适用于您。


反引号分隔的字符串怎么办? - Adam Bittlingmayer
反引号,即模板字面量,在ECMAScript 6中是最近才引入的。在撰写本文时(2012年),还没有反引号。但现在,如果浏览器支持,它们应该可以工作。这意味着反引号不是跨浏览器兼容的,仍然存在风险。仍有许多用户使用旧的桌面和移动浏览器。我建议继续使用双引号。 - esengineer

2
我在Chrome中遇到了相同的错误。 Chrome控制台告诉我错误在HTML文件的第一行。 实际上是在.js文件中。所以要注意setValidNou(1060, $(this).val(), 0')类型的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接