You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Seaside 3.1中Ajax实现井字棋图片替换失效问题求助

解决Seaside 3.1中Ajax井字棋ImageButton不更新的问题

我之前也踩过Seaside Ajax组件更新的坑,你的问题核心在于:普通表单提交会刷新整个页面,所以每次点击后按钮的图片URL会重新计算并更新;但用Ajax时,默认只执行回调里的业务逻辑,不会自动刷新页面上的元素——你得明确告诉Seaside要更新哪一部分内容。

具体修改步骤:

  1. 给棋盘区域加一个可识别的标记
    把整个棋盘放在一个带ID的<div>里,这样Ajax就能精准定位到要更新的区域。

  2. 用Ajax回调替代普通回调
    给imageButton绑定onClick事件,触发Ajax回调,同时指定更新刚才标记的棋盘区域。

修改后的完整代码示例:

首先,主渲染方法里把棋盘封装到带ID的div中:

renderContentOn: html
    html heading: 'Tictactoe'.
    "给棋盘区域设置唯一ID,供Ajax更新用"
    html div id: 'tictactoe-board'; with: [ self renderBoardOn: html ]

然后新增一个辅助方法专门渲染棋盘:

renderBoardOn: html
    1 to: 3 do: [ :row |
        1 to: 3 do: [ :col |
            html imageButton
                url: (tictactoe imageCase: row * 10 + col);
                "绑定Ajax回调:先执行业务逻辑,再更新棋盘区域"
                onClick: (html ajax
                    callback: [ tictactoe playsX: row playsY: col ];
                    update: 'tictactoe-board')
        ].
        html break ]

为什么这样能解决问题?

  • 当你点击按钮时,Ajax会先执行callback:里的tictactoe playsX: playsY:逻辑,更新游戏状态;
  • 然后Seaside会重新渲染#tictactoe-board里的所有内容,包括每个imageButton的URL,这样按钮的图片就会根据最新的游戏状态更新了;
  • 整个过程只有棋盘区域会被异步刷新,页面其他部分不会动,完美实现Ajax效果。

额外注意点:

  • 确保你的tictactoe对象在回调后状态确实被正确更新了;
  • 确认imageCase:方法能根据当前格子状态返回正确的图片URL(比如X、O或空的图片)。

内容的提问来源于stack exchange,提问作者qCazelles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:20:17