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

首次加载时JavaScript失效,刷新后正常,依赖document ready未解决

解决首次加载jQuery脚本失效、刷新后恢复的问题

看起来你遇到的是典型的动态DOM元素加载时机不匹配问题——我帮你分析下原因和修复方案:

核心原因:DOM元素还没加载,脚本就执行了

$(document).ready()只会等待页面的初始HTML结构加载完成,但如果你的课程列表是通过AJAX、后端模板异步渲染或者其他动态方式加载的,那ready触发的时候,你要操作的那些.course-listing-extra-info、.atr458元素根本还没出现在DOM里,选择器找不到元素,自然脚本执行了也没效果。而刷新页面时,浏览器可能缓存了动态加载的内容,元素加载速度变快,刚好赶在ready触发前渲染完成,所以脚本就生效了。

另外你的代码里还有几个小问题,也可能加剧这个情况:

  • jQuery.noConflict()的调用时机不对,在ready内部调用会导致后续的$失效;
  • 直接用.hover()绑定动态添加的元素,只会对ready时已存在的元素生效;
  • 选择器过于依赖DOM结构的层级和位置(比如:nth-child(7)),稳定性极差;
  • 多个元素用了同一个id='atr457',违反了id唯一性规则。

一步步修复方案

1. 先把jQuery.noConflict()用对

如果需要避免jQuery和其他库的$冲突,应该在脚本最开头就调用,并且用自定义变量代替$:

<script>
// 先调用noConflict,保存jQuery引用
var $j = jQuery.noConflict();

if (window.location.href.indexOf(".com/courses") >= 0) {
  $j(document).ready(function () {
    // 这里统一用$j代替$,避免冲突
  });
}
</script>

2. 用事件委托处理动态元素的hover事件

因为.atr458是你动态添加到页面的,直接用.hover()绑定只会对ready时已存在的元素生效。换成事件委托,绑定到父元素(或者document),这样不管元素什么时候添加,事件都会生效:

// 代替原来的$(".atr458").hover(...)
$j(document).on('mouseenter', '.atr458', function() {
  $j(this).css("color", "#09A59A");
}).on('mouseleave', '.atr458', function() {
  // 记得添加鼠标离开时的样式还原,不然颜色会一直保留
  $j(this).css("color", "#你的默认颜色值");
});

3. 等待动态内容加载完成再执行DOM操作

最可靠的方式是用MutationObserver监听DOM变化,等课程列表元素加载完成后再执行你的修改:

$j(document).ready(function() {
  // 找到课程列表的父容器
  var courseList = $j(".row.course-list.list")[0];
  if (!courseList) return; // 如果容器不存在,直接退出

  // 创建观察者,监听子元素变化
  var observer = new MutationObserver(function(mutations) {
    // 检查目标元素是否已经存在
    if ($j(".course-listing-extra-info.col-xs-12").length > 0) {
      // 执行所有DOM修改操作
      updateCourseUI();
      // 完成后停止观察,避免重复执行
      observer.disconnect();
    }
  });

  // 配置观察选项:监听子元素添加,包括子树
  observer.observe(courseList, { childList: true, subtree: true });
});

// 把所有DOM修改逻辑封装成一个函数
function updateCourseUI() {
  var $j = jQuery;
  
  // 修改"Mas Informacion"的代码
  $j("body > div.view-school > div > div > div.row.course-list.list > div:nth-child(7) > div > div.course-listing-extra-info.col-xs-12").html( "<a class='ahre55' href=''>Mas Informacion</a>" );
  // ...这里复制你其他所有修改DOM的代码
  
  // 设置按钮位置
  $j(".atr458").css("left", "30%");
}

4. 优化选择器(可选但推荐)

你现在的选择器太依赖DOM层级,比如body > div.view-school > div > div...,一旦页面结构微调就会失效。建议给课程项添加自定义属性,比如后端渲染时给每个课程项加data-course-id,然后用$j("[data-course-id] .course-listing-extra-info")来选择,这样更稳定。

5. 调试技巧

可以在脚本里加日志,确认首次加载时元素是否存在:

$j(document).ready(function() {
  console.log("Ready事件触发");
  console.log("找到的课程额外信息元素数量:", $j(".course-listing-extra-info.col-xs-12").length);
});

如果首次加载时数量是0,就实锤了是元素还没加载的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:48:50