2011-04-23 64 views
2

我最近开始使用jQuery-ui-autocomplete。不过,我正面临着一种奇怪而又狡猾的行为。我正在尝试为多值远程数据(来自我的数据服务的数据)使用自动完成功能。我的代码在逗号后面提取最后一个术语不起作用。我的代码:jQuery ui自动完成奇怪行为

function split(val) { 
    return val.split(/,\s*/); 
} 

function extractLast(term) { 
    return split(term).pop(); 
} 

代码自动完成是

$('#txtBox') 
    .bind("keydown", function (event) { 
     if (event.keyCode === $.ui.keyCode.TAB && $(this).data("autocomplete").menu.active) { 
      event.preventDefault(); 
     } 
    })  
    .autocomplete({ 
     minLength: 3, 
     selectFirst: true, 
     source: function (request, response) { 
      $.ajax('My/Data/Source.json', { 
       global: false, 
       success: function (data) { 
        response($.map(data.d.results, function (item) { 
         return { 
          label: item.Name, 
          id: item.id 
         } 
        })); 
       } 
      }); 
     }, 
     search: function() { 
      // custom minLength 
      var term = extractLast(this.value); 
      if (term.length < 3) { 
       return false; 
      } 
     }, 
     focus: function() { 
      // prevent value inserted on focus 
      return false; 
     }, 
     select: function (event, ui) { 
      var terms = split(this.value); 
      // remove the current input 
      terms.pop(); 
      // add the selected item 
      terms.push(ui.item.value); 
      // add placeholder to get the comma-and-space at the end 
      //terms.push(""); 
      this.value = terms.join(", "); 
      return false; 
     } 
    }); 

当我把一个调试器的功能,“搜索”,该术语总是大于3。这意味着它没有正确评估正则表达式。当我包括术语

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

它完美地工作。但我不能在我的页面中包含这个。但是,在Firefox中,这个工作正确没有文档类型声明也。我在IE8和IE9中都尝试过这两种方式,但都没有成功。


UPDATE 经过深入挖掘,发现主要问题在于IE和其他浏览器如何试图用正则表达式分割上一项。使用IE浏览器时,它第二次试图分割术语后,(逗号)。例如 http://jsfiddle.net/mE6th/尝试在chrome和IE中打开此链接并查看区别。

+0

那么,什么是你当前的doctype或不要”你现在有什么权利吗? – 2011-04-23 04:36:58

+0

截至目前没有任何文档类型。请参阅我的更新。问题似乎缩小了我认为的正则表达式。 – Ashish 2011-04-23 04:38:53

+1

我碰到过这篇文章:http://blog.stevenlevithan.com/archives/cross-browser-split – user670800 2011-04-23 04:59:22

回答

1

如果你想在一个逗号分隔字符串中的最后一项你就不能使用这个.split(',').pop(),例如:

'java,c++,php'.split(',').pop(); 

给“PHP”

+0

最终,这是我所做的,它的工作。但我所看到的是,正则表达式在不同的浏览器中给出了不同的结果。所以简单地删除和正则表达式使用上述结果。 – Ashish 2011-04-23 08:56:24

+0

那么,如果这是被接受的答案,那么自动完成问题标题是完全误导:( – tishma 2014-05-28 15:28:24

+0

是的,它看起来像我的答案是一个更可接受的解决方案,以解决问题的不同部分,即查找逗号分隔的最后一个词字符串jQuery自动完成是触发器的事实可能实际上是无关紧要的。如果您有更多的描述性标题,请随意编辑问题的标题:) – andyb 2014-05-28 16:12:16