未捕获的异常:语法错误,未识别的表达式:#。

8
我在jQuery的.click()事件中遇到了错误。我在Firebug中看到了这个错误。我使用的是最新版本,1.3.2(min)。
在我的网站中,点击会触发一个$.ajax()请求以获取表单。我向谷歌搜索了此错误,但只能找到 "%" 或 "[@]" 作为未识别的表达式,没有关于 "#" 的任何信息。
以下是我的一部分代码:
    $("form#buyForm #submitForm").live("click", function(e) {
        var errors = 0;

        var inputLastName_value = $("form#buyForm input#userLastName").val();
        if (inputLastName_value == "") {
         errors = 1;
         formErrorHandling("#userLastName");
         return false;
        }
        return false;
    });

我这样检查所有输入是否存在错误,然后调用formErrorHandling()函数,做一些显示/隐藏之类的事情,不重要的东西。

我看到可能是我的选择器出了问题,但它们似乎都没问题。

还有其他人遇到过同样的问题吗?

谢谢。


你在选择器中嵌套#ids有什么原因吗?元素id应该在页面上是唯一的,所以将它们嵌套或用forminput指定似乎有点奇怪。 - Doug Neiner
2
我的意思是,为什么要使用 form#buyForm #submitForm,而不直接使用 #submitForm 等。 - Doug Neiner
1
dcneiner,是的,id应该是唯一的,并且确实是唯一的。我在选择器之前使用标签名称的原因,至少根据我所读到的,是为了提高速度。因此,jQuery使用getElementByTagName并确切地知道要搜索什么,而不是查看我的页面上的所有id。 - Adrian
我并不在所有代码中都使用它,如你所见,但主要用于表单、输入等等,而非 div、p 等。这只是我曾经的做法。 - Adrian
这是一段旧的对话,但当我想要在一个页面上工作而在另一个页面上不工作时,我会在选择器中使用 #parent #child,我知道JS文件在它们之间共享,并且每个页面上都有一个 #child - AndyMcKenna
6个回答

8
据我所见,异常似乎是由您使用的 jScrollPane 插件触发的。尝试使用来自 trunk 的更新版本替换您包含的脚本(v1.2.3,早在2008年12月就过时了)。它包括对 v.1.2.3 的许多改进,并为我修复了异常 jScrollPane.js (r87 版本的 jScrollPane 压缩版本 jScrollPane.min.js 使用 YUICompressor 进行压缩)。

抖动,我不知道异常发生在哪里,有趣的事实是这只发生在我的一个表单上(我在我的网站上有两个表单,都使用相同的formErrorHandling()函数并遵循相同的代码模式)。我在这里发布了包含此表单处理部分的JS:http://artdevmedia.net/gds/test.js 注意:包含与表单相关的主要函数是在ajax请求成功后调用的。 - Adrian
嗨,jitter,谢谢你的时间。我一遍又一遍地测试了,我认为错误可能不是由我的表单或错误处理函数引起的。这是第一点。第二,它并不总是发生。无论如何,如果你有时间,请看这里:artdevmedia.net/gds -- 这是我发现的:如果你点击“购买专辑”,然后继续填写表单等,就不会出现异常。现在,点击“视频”,然后点击X关闭视频。有时候这就是异常抛出的时刻,其他时候,在关闭视频并返回到“购买专辑”表单并提交它之后才抛出异常。 - Adrian
我的意思是,异常的原因更可能是VIDEO关闭链接,我似乎不知道出了什么问题。请注意,链接是通过js动态创建并添加到div中的。那可能是原因吗?我在那里做错了吗?如果您有时间,可以查看整个javascript文件。再次感谢您的帮助。 - Adrian
添加了压缩版本 (~8kb)。使用 YUICompressor 进行压缩(与 jQuery 本身使用的相同)。 - jitter
谢谢jitter。我现在也遇到了同样的问题,但是原因是我错误地将jQuery ScrollTo插件的导航链接作为目标,导致了这个错误。 - mikkelz
显示剩余3条评论

3
在一些浏览器中,id可能为空,而jQuery对"#"作为选择器会出现问题。

顺便说一句,我不确定是什么条件导致了实际的错误,但我在使用jqGrid插件时遇到了同样的问题。当组件转换为jqGrid时,插件代码似乎会导致jquery几乎在任何地方都出现故障,如果没有id,则会出现问题。我通过将一个随机选择器分配给该元素来解决这个问题。table.attr("id","table" + Math.floor(Math.random()*100000)); - Shanimal

1

2011年9月

更改自

$(document).ready( function () {
  $('#'+id).creatorCall( {init:param} ) ;
} );

$(document).ready( function () {
  $(this).creatorCall( {init:param} ) ;
} );

并且解决了那个自身的 uncaught exception: Syntax error, unrecognized expression: # 错误信息


0

对我来说,问题似乎是由选择器中有一个太多的#号引起的。

例如:

$('##id_name')

应该是...

$('#id_name')

0

我知道这是一个旧问题,现在有更新版本的jScrollPane,但由于遗留问题,我需要使用当前版本。如果您要使用上面答案中的jScrollPane.js,则需要更改第534行的代码:

更改为:

    if (h && h.substr(0, 1) == '#' && h.length > 1) {

    if (h && h!='#' && h.substr(0, 1) == '#' && h.length > 1) {

整个代码块负责文档点击的修复:

$(document).bind('click', function(e){
    $target = $(e.target);
    if ($target.is('a')) {
        var h = $target.attr('href');
        if (h && h!='#' && h.substr(0, 1) == '#' && h.length > 1) {
            setTimeout(function(){
                scrollTo(h, !settings.animateToInternalLinks);
            }, $.browser.safari ? 100 : 0);
        }
    }
});

基本上,如果链接的 href 等于 #,那么 scrollTo 函数将被忽略。

祝好

G.


0

formErrorHandling函数长什么样子?它是期望选择器还是jQuery对象?

也许你需要这样调用它

formErrorHandling($("#userLastName"));

嗨,维克多,formErrorHandling函数看起来像这样:function formErrorHandling(id, filter) { id=id.replace("#",""); ... } 然后我会使用switch(id),然后显示该id的正确错误消息。(如果有过滤器,则显示特定消息) - Adrian
Adrian,如果你要去掉“#”,为什么在执行函数时还要设置它呢? - Justin Johnson
嗯,你说得对,我可以直接调用formErroHandling("userLastName")而不需要#,并且在函数中也不需要将其删除。但是我把它留在那里,以便更好地跟踪我的代码。至少对我来说,这有所帮助。 - Adrian

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