日历插件版本:CURRENT RELEASE 1.2.1
我按照 grails 插件文档中提到的步骤操作,在所有类型的浏览器中都出现以下错误
Chrome 14.0835:未捕获 RangeError:超出最大调用堆栈大小。
Firefox 6.02:太多递归 calendar.js 行 1851
IE 9:超出堆栈空间 calendar.js 第 1850 行
日历插件版本:CURRENT RELEASE 1.2.1
我按照 grails 插件文档中提到的步骤操作,在所有类型的浏览器中都出现以下错误
Chrome 14.0835:未捕获 RangeError:超出最大调用堆栈大小。
Firefox 6.02:太多递归 calendar.js 行 1851
IE 9:超出堆栈空间 calendar.js 第 1850 行
有问题的 jscalendar 代码是这样的:
Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
Date.prototype.setFullYear = function(y) {
var d = new Date(this);
d.__msh_oldSetFullYear(y);
if (d.getMonth() != this.getMonth())
this.setDate(28);
this.__msh_oldSetFullYear(y);
};
这重新定义了Date.setFullYear()
. 看看这个“旧 jscalendar”页面上的评论 #124 和 #125 。
评论#124(克里斯·莱弗利)
建议更新 calendar.js(靠近底部,~line 1850)。
对于那些得到递归错误的人。你只需要评论几行。见下文。
//Date.prototype.msh_oldSetFullYear = Date.prototype.setFullYear; Date.prototype.setFullYear = function(y) { var d = new Date(this); //d.msh_oldSetFullYear(y); if (d.getMonth() != this.getMonth()) this.setDate(28); //this._msholdSetFullYear(y); };
评论 #125(拉丽莎回复)
由于页面上包含多个日历 JavaScript,会出现递归问题。结果,日期补丁重新定义了 setFullYear 函数两次,并在执行时导致无限循环。我们通过确保该函数只重新定义一次来修复它:
if(Date.prototype.msh_oldSetFullYear == null) { Date.prototype.msh_oldSetFullYear = Date.prototype.setFullYear; }
这两个都建议对 calendar.js 进行更新,这并不理想,因为它是随插件一起提供的。
两个建议:
<calendar:resources/>
的主要布局和视图中是否有 GSP?如果是这样,请删除其中之一。这对我有用:
if (Date.prototype.__msh_oldSetFullYear == null) {
Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
}
Date.prototype.setFullYear = function(y) {
var d = new Date(this);
Date.prototype.__msh_oldSetFullYear.apply(d, arguments);
if (d.getMonth() != this.getMonth())
this.setDate(28);
Date.prototype.__msh_oldSetFullYear.apply(this, arguments);
};
我解决这个问题的方法是
1) 下载了插件的源码 2) 在本地创建了一个同名插件。3) 将原始源文件复制到我创建的本地插件 4) 按照上面的建议更改 javascript 文件 5) 编译并打包插件 6) 在我的主项目中删除旧插件 7) 从 zip 文件中安装新创建的插件从第 5 步创建。
它就像一个魅力。
感谢 Rob Hruska 指出我在 javascript 文件中的评论位置
我面临同样的问题,我已经放置<calendar:resources/>
在我的主 jsp 以及在 jsp 中呈现的模板中。删除其中一个解决了这个问题。