Grails 日历插件引发堆栈/递归错误

发布于 2024-12-06 08:50:23 字数 217 浏览 0 评论 0原文

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

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

:未捕获的 RangeError:超出了最大调用堆栈大小。

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

IE 9:堆栈空间不足 calendar.js 第 1850 行

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夏有森光若流苏 2024-12-13 08:50:23

有问题的 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(作者:Chris Lively)

建议更新 calendar.js(靠近底部,~第 1850 行)。

对于那些遇到递归错误的人。您只需评论几条即可
线。见下文。

//Date.prototype.msh_oldSetFullYear = Date.prototype.setFullYear;
Date.prototype.setFullYear = 函数(y) {
    var d = 新日期(this);
    //d.msh_oldSetFullYear(y);
    if (d.getMonth() != this.getMonth())
        this.setDate(28);
    //this._msholdSetFullYear(y);
};

评论#125(拉里萨回复)

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

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

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

两个建议:

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

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!
青丝拂面 2024-12-13 08:50:23

这对我有用:

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

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);
};
债姬 2024-12-13 08:50:23

我解决这个问题的方法是

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

它运行得非常好。

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

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

南冥有猫 2024-12-13 08:50:23

我遇到了同样的问题,我已将 放置在我的主 jsp 以及在 jsp 中呈现的模板中。删除其中一个就解决了这个问题。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文