简体   繁体   中英

Grails Calendar plugin throws stack / recursion error

Calendar plugin version :CURRENT RELEASE 1.2.1

I followed steps as mentioned in the grails plugin documentation, I get the following error in all types of browser

Chrome 14.0835: Uncaught RangeError: Maximum Callstack size exceeded.

Firefox 6.02: Too much recursion calendar.js line 1851

IE 9: Out of stack space calendar.js line 1850

The offending jscalendar code is this:

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

Which redefines Date.setFullYear() . Have a look at comments #124 and #125 on this "old jscalendar" page .

Comment #124 (by Chris Lively)

Suggests updating calendar.js (near the bottom, ~line 1850).

For those getting the recursion error. You just need to comment a few lines. See below.

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

Comment #125 (reply by larisa)

The problem with recursion occurs due to multiple includes of calendar JavaScript on a page. As a result Date patch redefines setFullYear function twice and causes infinite loop when it gets executed. We fixed it by making sure that function is redefined only once:

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

Both of these suggest updates to calendar.js, which isn't ideal since it's delivered with the plugin.

Two suggestions:

  • Make sure you're not importing the calendar resources twice. Do you have a <calendar:resources/> in your main layout and your view GSP? If so, remove one of them.
  • If that doesn't work, perhaps use a different plugin. The calendar plugin looks like it hasn't been updated in a while (it's using an older version of jscalendar). If you're feeling ambitious, you could go update the plugin yourself!

This works for me:

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

I was facing same issue, I had placed <calendar:resources/> in my main jsp as well as in the template which was rendered in the jsp. Removing one of them solved the issue.

The way I resolved this issue is

1) Downloaded the source of the plugin 2) Created a plugin with the same name locally. 3) Copied the original source files to the local plugin I created 4) Changed the javascript file as suggested above 5) Compile and package the plugin 6) Removed the old plugin in my main project 7) Installed the newly created plugin from the zip file created from step 5.

It worked like a charm.

Thanks Rob Hruska for pointing me where to comment in the javascript file

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM