【问题标题】:Grails Calendar plugin throws stack / recursion errorGrails Calendar 插件抛出堆栈/递归错误
【发布时间】:2011-11-24 23:38:04
【问题描述】:

日历插件版本:当前版本 1.2.1

我按照 grails 插件文档中提到的步骤操作,在所有类型的浏览器中都出现以下错误

Chrome 14.0835:未捕获 RangeError:超出最大调用堆栈大小。

Firefox 6.02:过多的递归 calendar.js 第 1851 行

IE 9:超出堆栈空间 calendar.js 第 1850 行

【问题讨论】:

    标签: grails plugins calendar jscalendar


    【解决方案1】:

    有问题的 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()。在 "old jscalendar" page 上查看 cmets #124 和 #125。

    评论 #124(克里斯·莱弗利)

    建议更新 calendar.js(接近底部,~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(larisa 回复)

    由于日历的多个包含而出现递归问题 页面上的 JavaScript。结果日期补丁重新定义了 setFullYear 函数两次并在执行时导致无限循环。我们 通过确保只重新定义一次函数来修复它:

    if(Date.prototype.msh_oldSetFullYear == null) {
        Date.prototype.msh_oldSetFullYear = Date.prototype.setFullYear;
    }
    

    这两个都建议对 calendar.js 进行更新,这并不理想,因为它是随插件一起提供的。

    两个建议:

    • 确保您没有两次导入日历资源。您的主布局中是否有<calendar:resources/> 和您的视图 GSP?如果是这样,请删除其中一个。
    • 如果这不起作用,也许使用不同的插件。日历插件看起来有一段时间没有更新了(它使用的是旧版本的 jscalendar)。如果你有野心,你可以自己去更新插件!

    【讨论】:

    • 非常感谢您指出我正确的地方。正如你所说,我已经直接在插件的 calendar.js 中进行了更改并进行了测试。它工作正常。但既然你也指出触摸插件文件并不理想,我需要寻找一种合适的方法来改变它。
    【解决方案2】:

    这对我有用:

    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);
    };
    

    【讨论】:

      【解决方案3】:

      我解决这个问题的方法是

      1) 下载了插件的源码 2)在本地创建了一个同名插件。 3)将原始源文件复制到我创建的本地插件 4) 按照上面的建议更改了 javascript 文件 5) 编译并打包插件 6)在我的主项目中删除了旧插件 7) 从第 5 步创建的 zip 文件中安装新创建的插件。

      它就像一个魅力。

      感谢 Rob Hruska 指出我在 javascript 文件中的评论位置

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,我将<calendar:resources/> 放在我的主jsp 以及在jsp 中呈现的模板中。删除其中一个解决了这个问题。

        【讨论】:

          猜你喜欢
          • 2018-03-10
          • 2014-08-27
          • 2016-11-11
          • 2015-06-17
          • 1970-01-01
          • 2012-08-20
          • 2016-12-30
          • 2015-02-08
          • 1970-01-01
          相关资源
          最近更新 更多