【问题标题】:javascript error: invalid label? what does this mean?javascript错误:标签无效?这是什么意思?
【发布时间】:2012-07-20 22:18:11
【问题描述】:

不用担心!看起来文字比实际多 ;-) 所以请继续阅读!

主要问题是:

  • 错误:invalid label是什么意思?
  • 我的脚本中的错误在哪里?

现在开始令人讨厌的东西 ;-):

我有一个脚本,用于从服务器(服务器提供该数组的 JSON 版本)加载当前语言的语言数组项目(通过 js 中的 lang_keys 定义的项目 - 见上文)。

使用 JS translate("<synonym>"); 函数,您可以获得当前语言的所需文本。 更新:jquery 1.5 未缩小(旧:jquery.js(v1.4.1 - 缩小))已加载并且 lang.js 也是。

所以我得到一个错误,我只是找不到

我必须补充一点:translate() 函数可以正常工作,并且 JS 不会中断。所有功能都按需要工作。 我没有任何其他错误,所有 JS 工作正常......但我不想在未来感到惊讶 - 所以我需要摆脱那个错误。

chrome 中的控制台输出(在 ajax 请求 [/query/js_lang/json] 之后列出):

Uncaught SyntaxError: Unexpected token :    jQuery.jQuery.extend.globalEvaljquery.js:602
jQuery.ajaxSetup.converters.text            scriptjquery.js:6992
ajaxConvert                                 jquery.js:6884
done                                        jquery.js:6454
jQuery.ajaxTransport.send.callback          jquery.js:7252
jQuery.ajaxTransport.send                   jquery.js:7261
jQuery.extend.ajax                          jquery.js:6646
(anonymous function)                        lang.js:116

firefox 中的控制台输出(在 ajax 请求 [/query/js_lang/json] 之后列出):

invalid label
{"js_accept_terms":"Du musst unseren A...:"Kontaktname","js_agent_email":"Konta

谁能告诉我错误的确切含义:invalid label 是什么意思?

我的脚本 (lang.js) 如下所示:

var month_names = new Array();
var day_names = new Array();

var lang_keys = new Array(   
    "js_accept_terms",
    ...
    "nope"
);

var translations = new Array();


function translate(key, replace){
    var translated = translations[key];

    if(replace != undefined){
        for(var i=0; i<replace.length; i++){
            translated = translated.replace(/\%1/, replace); 
        }
    }

    return translated;
}

$.ajax({ //this is line 116
   url: "/query/js_lang/json",
   type: "post",
   data: {keys: JSON.stringify(lang_keys)},
   timeout: 7000,
   success: function(data){
       var trans = jQuery.parseJSON(data);
       for(var key in trans){
           translations[key.replace(/^js\_/, "")] = trans[key];
       }
       month_names = new Array(translate("jan"), translate("feb"), translate("mar"), translate("apr"), translate("may"), translate("jun"), translate("jul"), translate("aug"), translate("sep"), translate("oct"), translate("nov"), translate("dec"));
       day_names   = new Array(translate("sun"), translate("mon"), translate("tue"), translate("wed"), translate("thu"), translate("fri"), translate("sat"));
   },
   error: function(){
       out_message("Error. No Language loaded!", "Error");
   },
   async: false
});

out_message() 显示一个 css 样式的 div。我在网站的其他部分使用该功能,它可以正常工作。

我删除了 lang_keys 中的项目,其中返回值包含特殊字符,如“:”、变音符号、斜线等……说:我只用字母数字值对其进行了测试,得到了同样的错误。

对不起我的英语 ;-) 并感谢您的帮助

【问题讨论】:

  • {"js_accept_terms":"Du musst unseren A...:"Kontaktname", 是无效的 json。请用斜杠转义引号
  • no .. 在这种情况下,我会收到错误消息,即我的 json 无效。 json 被正确解析,因为 translate() 函数有效
  • 不要使用new Array()[] 的数组字面量语法更好。
  • @missingno:感谢您的评论。请问为什么这样更好?

标签: javascript multiple-browsers


【解决方案1】:

我认为问题在于返回的 JSON:

{"js_accept_terms":"Du musst unseren A...:"Kontaktname","js_agent_email":"Konta

这应该看起来像这样:

{"js_accept_terms":"Du musst unseren A...:\"Kontaktname","js_agent_email":"Konta

服务器端可能有问题。您的 JSON 编码器不会转义双引号。

【讨论】:

  • 不,这就是萤火虫显示 json 的方式。它被转义和 unicode 编码。
【解决方案2】:

好吧,经过更多研究和 StackOverflow 线程中的一些提示,我现在想通了:

问题是,jQuery 出于某种原因将 ajax 接收到的数据解释为脚本 (javascript) - 必须与 eval() 函数有关,该函数将第一个 json 对象解释为脚本,因为它看起来像 / 开始像对象实例。

只有在 在网站完全加载之前完成 ajax 调用时才会发生这种情况(在我的情况下)。好吧,使用 ajax 调用内部的一些 $(function() { ... }); 代码到目前为止没有问题。

诀窍是在 php 脚本中的 json 字符串周围添加括号

$return_value = "(" . json_encode($translation) . ")";

并在 ajax-success 回调中接收后将其删除

$.ajax({    
    ...,
    success: function(data){
           data = data.substring(1,data.length-1); // for label error reason. getting json in breaktes,, which must be removed again
           var trans = jQuery.parseJSON(data);
          ...

关于标签仅供参考:here some information 关于那个

【讨论】:

  • 为了更好的可读性 - 有一些范式建议以使用较少 cmets 的方式编写代码外壳 - 您可以通过正则表达式删除括号...
猜你喜欢
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多