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

父窗口textarea更新后取值异常:仅alert后能获取当前值求助

子窗口更新父窗口textarea后无法立即获取新值的解决方案

这个问题我之前也碰到过,核心是异步操作的时序问题,不是页面刷新的锅,咱们一步步拆解原因和解决办法:

问题根源:JS执行的时序错配

你父窗口的代码逻辑是:打开子窗口 → 立刻触发btn_save点击去取值。但子窗口的btn_ret.onclick是需要用户手动点击才会执行的,这时候父窗口的保存逻辑已经跑完了,自然只能拿到textarea的旧值。

而添加alert("came here")后,JS执行会暂停,等你点击确定的这段时间,子窗口已经完成了testbox2的赋值操作,所以再取值就能拿到新值——本质是alert给了你一个“人工延迟”,让异步操作追上了同步执行的逻辑。

正确的解决思路:让子窗口通知父窗口完成更新后再保存

不要让父窗口“提前预判”子窗口的操作,而是改成子窗口更新完textarea后,主动触发父窗口的保存逻辑。具体修改如下:

1. 重构父窗口代码,把保存逻辑抽成独立函数

window.selectedVal = "";

// 把保存逻辑单独拎出来,方便子窗口调用
function saveQuestion() {
  var ss_ques = document.getElementById("testbox2").value;
  // 这里处理你的保存逻辑,比如打印或存入变量
  console.log("当前textarea的值:", ss_ques);
}

// 按钮点击依然绑定这个函数
document.getElementById("btn_save").onclick = saveQuestion;

// 打开子窗口,不要立刻触发保存
window.open("http://www.build-exam.com/mathform.html","Math",'width=900,height=500,scrollbars=yes');

2. 修改子窗口代码,更新后主动调用父窗口的保存函数

btn_ret.onclick = function() {
  // 更新父窗口的textarea
  window.opener.document.getElementById("testbox2").value = s_ques;
  // 通知父窗口:我已经更完了,你可以保存了!
  window.opener.saveQuestion();
  // 关闭子窗口
  window.close();
}

关于MathJax的疑问

MathJax的作用是将公式渲染到DOM元素中,它不会直接修改textarea的value属性(除非你特意用MathJax的API去操作)。你代码里是直接给testbox2.value赋值,所以这个问题和MathJax没有关系,核心还是时序问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:17:54