【问题标题】:Prevent refresh when using dynamic content使用动态内容时防止刷新
【发布时间】:2018-09-24 02:10:52
【问题描述】:

我使用基本的 JS 来更改网站上的内容,而无需传统的超链接。我使用它在另一个文件中加载内容并将其插入到 HTML <div> 中。每个内容页面都包含在 <div> 中。

<!-- Inside head -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $("#content").load("home.html");
        $("#home").click(function(){
            $("#content").load("home.html")
        });
        $("#page1").click(function(){
            $("#content").load("page1.html")
        });
        $("#page2").click(function(){
            $("#content").load("page2.html")
        });
    });
</script>

<!-- Inside body -->
<div id="content">
    <!-- Dynamic content here -->
</div>

最近我注意到这并不像我预期的那样严格工作。是的,它使用同一个页面插入内容,但它也会刷新页面,当链接不在页面顶部时,这有点烦人。所以必须向下滚动才能看到加载的内容。

如何才能获得真正动态的内容?是否需要全新的构造?

【问题讨论】:

  • 如果您的点击触发器是a 标签,return false 或将event 作为参数添加到点击处理程序和preventDefault()
  • @click2install 与 JS 函数中的 return false 一样,例如上面最里面的​​函数?
  • $("#home").click(function(){ $("#content").load("home.html"); return false;});
  • 或者,$("#home").click(function(e){ $("#content").load("home.html"); e.preventDefault();});
  • 整个解决方案似乎是在重新发明轮子。为什么不从一开始就静态加载所有内容并将其全部隐藏。然后,使用点击显示所需的部分?

标签: javascript dynamic-content


【解决方案1】:

您可以通过返回 false 或阻止事件处理程序执行其默认操作来阻止 a 标记重新加载页面,例如:

$("#home").click(function()
{ 
   $("#content").load("home.html"); 
   return false;
});

$("#home").click(function(e)
{ 
   $("#content").load("home.html"); 
   e.preventDefault();
});

另外,为简洁起见,您的 ready 处理程序可以缩短为:

// no need for $(document).ready(function(), can just be as below 
$(function() 
{
   // other stuff here after document is ready
});

正如@ScottMarcus 建议的那样,您可以只加载您的内容并默认隐藏它,然后在点击处理程序中根据点击的内容显示您的内容:

<a href="#" id="home">Home</a>
<div id="content">
  <div id="home-content">Home content here, hide it on page load with css</div>
  <div id="page1-content">Page 1 content here, hide it on page load with css</div>
  <div id="page2-content">Page 2content here, hide it on page load with css</div>
</div>

#content > div
{
  display: none;
}    

// if you dont want to hide home on page load
#home-content
{
  display: block;
}

$("#home").click(function()
{ 
   $('#content > div').hide(); // could also use .fadeOut()
   $("#home-content").show(); // could also use .fadeIn()
   return false;
});

【讨论】:

  • fadeIn fadeOut 如果你有很多 HTML 会很笨拙,你最好使用 CSS 进行转换而不是 JavaScript - 如果你谷歌 CSS 转换,你会发现一些很好的资源。如果你的 HTML 是最小的,那么 JavaScript “可能” ok
  • 类似地,您可以使用.addClass('hidden').removeClass('hidden') 而不是hide show,并在CSS 中添加.hidden { display: none; } - 有很多选择
  • 这是一个很好的解决方案,基于 OPs 的原始想法。当超链接被用作 JavaScript 触发器时,我总是有点畏缩,因此,取消本机行为成为一种要求。在这种情况下,我总是选择使用不需要的其他元素,例如span。但是,这只是我的 2 美分。 ;)
  • 但是,请记住 HTML 是用于语义的,而语义会影响 UI 的可用性。
猜你喜欢
  • 2012-08-16
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多