Javascript chrome抛出未捕获范围错误:超过最大调用堆栈大小
我正在尝试使用bootstrap popover构建一个简单的小部件Javascript chrome抛出未捕获范围错误:超过最大调用堆栈大小,javascript,jquery,twitter-bootstrap-rails,Javascript,Jquery,Twitter Bootstrap Rails,我正在尝试使用bootstrap popover构建一个简单的小部件 UW.UI.ProjectMember = { dropdown: ".project-member-select-dropdown", input: ".member-search-field", options: { container: $('.project-member-select'), trigger: "click", minChar: 2 }, renderTemplate: f
UW.UI.ProjectMember = {
dropdown: ".project-member-select-dropdown",
input: ".member-search-field",
options: {
container: $('.project-member-select'),
trigger: "click",
minChar: 2
},
renderTemplate: function() {
var template = '<div class="project-member-picker">'+
'<div class="project-member-search-box">'+
'<input type="text" class="member-search-field input-block-level" placeholder="Enter a name">'+
'<ul class="project-member-select-dropdown"></ul>'+
'</div>'+
'<div><p>You can invite your colleagues to use UberWork with you</p></div>'+
'</div>';
this.options.container.append(template);
return this;
},
initPopover: function() {
var _this = this;
$(".add-member-btn").popover({
html: true,
placement: "bottom",
trigger: _this.options.trigger,
container: '#window',
content: _this.build()
});
},
build: function() {
return $('.project-member-picker').html();
},
delegateEvents: function() {
var _this = this;
$(document).on("keydown",'.popover .member-search-field', function(event) {
_this.processInput(event, _this);
});
$(document).on("click", '.popover li.member', function(event) {
_this.addToken(event, _this);
});
$(document).on("click", '.popover .project-members ul li a.remove', function(event) {
_this.deleteToken(event, _this);
});
},
showDropdown: function() {
$(this.dropdown).css({
position: "absolute",
zindex: 999
}).show();
},
hideDropdown: function() {
$(this.dropdown).hide().empty();
},
processInput: function(event, that) {
var input = $(event.currentTarget),
inputValue = input.val(), timeout;
if(inputValue.length >= 1) {
that.showSearchActivity();
clearTimeout(timeout);
timeout = setTimeout(function() {
that.runSearch(inputValue.toLowerCase())
}, 300);
}
else {
that.hideDropdown();
}
},
showSearchActivity: function() {
$(this.dropdown).html('<p>Searching...</p>');
this.showDropdown();
},
runSearch: function(query) {
var results = $.grep(UW.Members, function (row) {
return[row.name].toString().toLowerCase().indexOf(query.toLowerCase()) > -1;
});
this.populateDropdown(query, results);
},
populateDropdown: function(query, results) {
var _this = this;
if(results && results.length) {
$(this.dropdown).empty();
this.hideDropdown();
$.each(results, function (index, value) {
if(value.photo == "")
var photo = UW.Constants.avatar;
else
var photo = value.photo;
var template = '<li class="member" data-id="'+value.user_id+'">'+
'<div class="member-avatar pull-left"><img src="'+photo+'"></div>'+
'<div class="member-name pull-left">'+value.name+'</div>'+
'</li>';
$(_this.dropdown).append(template);
});
this.showDropdown();
}else {
$(this.dropdown).html('<p>No results</p>');
this.showDropdown();
}
},
addToken: function(event, that) {
var el = $(event.currentTarget);
var id = el.attr('data-id');
var user = {
name: $(el).find('div.member-name').html(),
photo: $(el).find('div.member-avatar').find('img').attr('src')
};
//update member list
var members = this.options.container.find('div.project-members ul.member-avatars');
if(members.find('li[data-id="'+id+'"]').length == 0) {
members.append('<li data-id="'+id+'"><img src="'+user.photo+'" title="'+user.name+'"></li>');
}
//clear input
$(that.input).val('');
//Hide dropdown
this.hideDropdown();
},
deleteToken: function(event, that) {
event.preventDefault();
},
init: function() {
this.renderTemplate();
this.initPopover()
this.delegateEvents();
}
UW.UI.ProjectMember={
下拉列表:“.项目成员选择下拉列表”,
输入:“.member搜索字段”,
选项:{
容器:$('.project member select'),
触发:“点击”,
明察尔:2
},
renderTemplate:function(){
变量模板=“”+
''+
''+
“
”+
''+
“您可以邀请您的同事使用优步与您一起工作”+
'';
this.options.container.append(模板);
归还这个;
},
initPopover:function(){
var_this=这个;
$(“.add member btn”).popover({
是的,
位置:“底部”,
触发器:_this.options.trigger,
容器:“#窗口”,
内容:_this.build()
});
},
构建:函数(){
返回$('.project member picker').html();
},
delegateEvents:函数(){
var_this=这个;
$(document).on(“keydown”,'.popover.member搜索字段',函数(事件){
_this.processInput(事件,_this);
});
$(文档).on(“单击”,'.popover li.member',函数(事件){
_this.addToken(事件,\u this);
});
$(文档).on(“单击”,'.popover.project members ul li a.remove',函数(事件){
_this.deleteToken(事件,_this);
});
},
下拉列表:函数(){
$(this.dropdown).css({
位置:“绝对”,
zindex:999
}).show();
},
hideDropdown:函数(){
$(this.dropdown).hide().empty();
},
processInput:函数(事件,即){
变量输入=$(event.currentTarget),
inputValue=input.val(),超时;
如果(inputValue.length>=1){
showsearchavity();
clearTimeout(超时);
timeout=setTimeout(函数(){
that.runSearch(inputValue.toLowerCase())
}, 300);
}
否则{
hideDropdown();
}
},
showSearchActivity:函数(){
$(this.dropdown).html(“搜索…”);
这个。showDropdown();
},
runSearch:函数(查询){
var results=$.grep(UW.Members,函数(行){
返回[row.name].toString().toLowerCase().indexOf(query.toLowerCase())>-1;
});
这个.populateDropdown(查询、结果);
},
PopulatedDropDown:函数(查询、结果){
var_this=这个;
if(results&&results.length){
$(this.dropdown).empty();
this.hideDropdown();
$.each(结果、函数(索引、值){
如果(value.photo==“”)
var photo=UW.Constants.avatar;
其他的
var photo=value.photo;
var template=''+
''+
''+值。名称+''值+
“ ”;
$(\u this.dropdown).append(模板);
});
这个。showDropdown();
}否则{
$(this.dropdown).html(“无结果””;
这个。showDropdown();
}
},
addToken:函数(事件,即){
var el=$(event.currentTarget);
变量id=el.attr('data-id');
变量用户={
名称:$(el).find('div.member-name').html(),
照片:$(el).find('div.member-avatar').find('img').attr('src'))
};
//更新成员名单
var members=this.options.container.find('div.project-members-ul.member-avatars');
if(members.find('li[data id=“”+id+“]”]).length==0){
append(“”);
}
//清晰输入
$(that.input).val(“”);
//隐藏下拉列表
this.hideDropdown();
},
deleteToken:函数(事件,即){
event.preventDefault();
},
init:function(){
this.renderTemplate();
this.initPopover()
这是delegateEvents();
}
我知道我正在发布大量代码,无论如何,我正在从主干视图实例化UW.UI.ProjectMember
类。
当点击$(“.add member btn”)
元素触发popover时,第一次一切正常,但当再次点击元素隐藏popover时,chrome控制台显示此错误“未捕获范围错误:超过最大调用堆栈大小”。
我可能做错了什么?如果有任何帮助,我们将不胜感激。在代码中的某个地方,您的代码在某种循环中调用了其他东西,导致了太多调用,以至于调用堆栈达到其极限,并发生了错误。很难准确地说出它在哪里,您应该设置一些断点,执行一些控制台日志等来尝试我看不出任何明显的递归,因此问题没有明显的答案。观察:在
processInput()
中,作为一个新声明的本地变量,timeout
在cleartimout(timeout)时总是未定义调用了
。但我认为这不会解决问题。我已经仔细检查了我的代码,也找不到任何递归。