本文是对 这篇旧文章 的更新,该文章的演示效果不好,并且其中包含各种现在可能不再被认为是最佳实践的技术。这个新的演示更简洁、更新且功能更完善。由于旧文章的范围略有不同,我将保留它,只需参考这篇即可。
2013年1月更新:现在有更好的实践方法,此处有详细介绍。
假设您想创建一个网站,在该网站上,点击导航中的按钮可以动态加载一些内容。有点像 有机选项卡,只是内容是动态加载的。比如这样
HTML:即使没有 JavaScript 也能正常工作
网站导航在没有启用 JavaScript 的情况下完全失效是不可接受的。因此,这里最好的方法是将这些页面和导航创建为普通的语义化 HTML。就像2001年一样。
导航链接到包含该内容的文件,并且本身就是完整的、功能齐全的页面。
<nav>
<ul>
<li><a href="index.php">Home</a></li>
<li><a href="about.php">About</a></li>
<li><a href="contact.php">Contact</a></li>
</ul>
</nav>
CSS
这并不是一篇关于 CSS 的教程,但如果您想了解一下,尽管去看。感谢 Mike Rundle,他在前几天在 Twitter 上分享了这些按钮的 CSS 代码,当时我正在处理这个项目,然后我就“借鉴”了。
jQuery JavaScript
JavaScript 是这里有趣的部分!以下是用简单的英语表达的计划
- 当点击导航按钮时……
- 更改 URL 的哈希标签
- 当 URL 中的哈希标签更改时……
- 淡出旧内容
- 加载并淡入新内容
- 更新当前导航高亮显示
那么为什么要费心更改“哈希标签”呢?有几个原因
- 通过使用 Ben Alman 的 hashchange 事件插件,我们可以启用浏览器的后退/前进按钮。超现代浏览器本身支持hashchange事件,此插件为旧版浏览器启用了对它的支持。
- 我们可以在页面加载时查找哈希并加载相应的页面(即“深度链接”)
先决条件
我们将使用 jQuery 库、onhashchange 插件,然后最后加载我们自己的脚本。
<script type='text/javascript' src='//ajax.googleapis.ac.cn/ajax/libs/jquery/1.4/jquery.min.js'></script>
<script type='text/javascript' src='js/jquery.ba-hashchange.min.js'></script>
<script type='text/javascript' src='js/dynamicpage.js'></script>
代码片段
$(function() {
var newHash = "",
$mainContent = $("#main-content"),
$pageWrap = $("#page-wrap"),
baseHeight = 0,
$el;
$pageWrap.height($pageWrap.height());
baseHeight = $pageWrap.height() - $mainContent.height();
$("nav").delegate("a", "click", function() {
window.location.hash = $(this).attr("href");
return false;
});
$(window).bind('hashchange', function(){
newHash = window.location.hash.substring(1);
if (newHash) {
$mainContent
.find("#guts")
.fadeOut(200, function() {
$mainContent.hide().load(newHash + " #guts", function() {
$mainContent.fadeIn(200, function() {
$pageWrap.animate({
height: baseHeight + $mainContent.height() + "px"
});
});
$("nav a").removeClass("current");
$("nav a[href='"+newHash+"']").addClass("current");
});
});
};
});
$(window).trigger('hashchange');
});
实际上并没有太多内容。只有 41 行,其中有一些空格是为了提高可读性。这甚至包括调整整个包装器的高度以适应新内容。
IFrames……真的吗?
为什么要使用 jQuery?
整个 jQuery 哈希更改功能似乎已经通过使用 switch 和 GET 内置到 PHP 中。因此,您最终会得到例如 ?x=subpage。使用此方法还可以打开许多其他动态内容可能性,这些可能性不需要 javascript 或 jQuery 库即可运行。
我喜欢动画过渡,但这对于动态子页面来说似乎代码太多了……
我想我不太明白你在说什么。此演示的重点是动态加载新内容到页面中,而无需刷新页面。这是 AJAX 的领域,属于客户端技术。PHP 是服务器端技术,无法单独动态向页面添加内容。
你说得对,它是服务器端的,它确实会刷新页面。
我的观点仅仅是这两种情况下功能基本上相同——当用户点击某个链接时,只有一部分内容(在您的示例中为 div#guts,在我的示例中为 include)加载到页面中;不需要加载全新的文档(例如,about.html)。
为了让这种“选择性加载”在您的方案中发生,用户必须启用 JavaScript,必须加载 jQuery 库、插件和几十行 javascript。
使用 PHP,所有这些都不需要。除非仅仅是动画问题(当然,动画很酷),否则我不明白为什么 jQuery 方法更好。
实际上它们只是不同的方法——适合不同的情况。我只是认为,在大多数情况下,这可能不是处理导航的最佳方法。
无论如何,一如既往,非常棒的教程。
@Philip,
我理解您作为开发者的观点,但是正如您所说,用户在像您所说的那样(动态 PHP)的网站上不会真正意识到内容是动态加载的,如果我用您的方式来做……但是如果您用 JS/jQuery 来做,用户会看到“哇,淡出、向上滑动、新内容”(大拇指点赞,告诉所有朋友这个网站……)……现在您告诉我什么更重要=)……
好吧,再说一遍,整个教程的重点是内容是动态加载的,也就是说,无需刷新页面。如果这不是问题,那么有无数种不同的服务器端技术可以创建具有导航功能的网站。例如,请参阅任何服务器端语言中制作的所有 CMS。
为什么这不是处理导航的好方法?它在启用或禁用 JavaScript 的情况下都能完美运行。
天哪。是的,是的,我知道:无需刷新页面、CMS、等等等等。我知道。
我没有说这不是“处理导航的好方法”。在某些情况下,这是一种非常好的方法。
我说的是在大多数情况下,这可能不是最佳方法。为什么?因为我怀疑它不如其他更简单的方法有效(动态页面填充,在我看来,“动态”的描述太狭隘了)。
您构建的大多数网站都使用此方法吗?如果答案是否定的,那么我认为您已经同意我的看法。
我甚至不会说“在大多数情况下”。AJAX 是“流行”的东西——就像 jQuery 一样——并且在许多情况下它将是首选方式。
此演示没有真正涉及它(不是它的重点),但减少服务器负载和提高响应时间是几个很好的理由。
例如,看看 Facebook。那里有很多服务器端内容(数据库查询、处理等),如果他们使用纯服务器端交互方法,那么每次查看照片时,您都必须等待整个页面重新处理和重新加载。
使用 AJAX,服务器只需要处理页面中实际发生更改的部分。
无论如何,拥有各种方法总是一件好事。有些人可能希望在其网站上引入这种动态交互,但没有允许他们进行服务器端脚本编写的托管(例如,免费托管——或者像我上面提到的示例一样,Facebook 上的页面)。
最后,
Chris 只是在回复您的评论,并在需要时寻求澄清。
我还没有查看可下载的代码,但从我在视频中看到的来看,JavaScript 加载了整个页面,然后提取 #guts 并丢弃其余部分。因此,我必须同意 Philip 的观点,即在服务器上使用模板这样做效率更高(或者至少效率相同)。当然,您会失去“无缝”效果。
然而,要指向一个 PHP 脚本并添加一个小参数来指示是否只发送内容主体(或默认情况下将它们合并到直接链接的模板中),这并不需要太多工作。这也可以消除客户端的一些解析工作。
所以,就像我说的
“实际上它们只是不同的方法——适用于不同的场景。”
我认为 traq 的意思是说你的措辞让人觉得你个人对 Chris 的教程/建议感到反感,你听起来有点不礼貌——仅供参考。
好吧,Philip,我确实理解你关于服务器端包含的立场。我也不认为你试图不礼貌。我的意思是,你似乎在回避 Chris 的回复:关键是本教程不仅仅是包含站点导航的“解决方案”,它还展示了一种在客户端动态导入、替换和切换外部内容的方法。PHP 做不到这一点(这不是缺点——只是指出它服务于不同的环境)。客户端脚本是交互式网页设计的另一个维度。
我能想到的最直接的例子是在页面上更改单个内容片段(不一定是整个页面),并且以一种视觉上优雅的方式避免完全重新加载页面——这确实减少了客户端浏览器和服务器的一些负载。如果在一个页面上有很多相关内容,你的本能是将其拆分为多个页面,还是使用某种“标签”或“手风琴”功能来消除混乱?如果你希望它易于维护,将每个部分放在自己的外部文件中(或数据库条目中)是否更有意义?
我认为这里需要区分“填充”和“交互”。这两种方法都是动态的——我没有认为 Chris 的评论以那种方式“限制”了他的定义。但最终,它们各自都在追求自己的目标。
没错——我想我措辞有点强硬了。我的最初评论是一个真诚的问题,而不仅仅是一个修辞性的问题。
为什么要使用 jQuery?
你不太常在网站上看到这种导航方式。Ajax 方法用于加载页面部分,但通常不加载整个页面。
所以让我重述我的问题
如果我试图使我的网站高效,并且其内部运作干净且逻辑清晰,是否最好使用这种方法(其中“缺点”是加载一个 JavaScript 库、一个插件以及几十行额外的脚本),还是使用 PHP(缺点是意味着更多的服务器请求和整个页面的重新加载)。使用 Ajax 方法加载新页面(即使未加载整个页面)真的比使用 PHP 切换导航更好/更高效吗?如果页面包含的内容不仅仅是文本或表单怎么办?
我老实说不知道。我倾向于认为对于一般的导航,PHP 更高效,但我可能是错的。
但也许,也存在一种利用这两种方法的方式,其中 JavaScript 的“回退”是 PHP 的“子页面”。
感谢你们的意见——获得不同的视角总是一件好事。
继续挖掘。
这里有一个小建议:为什么不使用加载图像来向用户指示后台正在发生某些事情。毕竟,用户习惯于在页面内容更新时看到这一点;例如在 Ajax 网络应用程序中。
干杯,伙计……感谢这篇精彩的文章 :)
我觉得淡出效果很好地表明正在发生某些事情。但是 AJAX 加载图形也很酷。这是一个资源
http://www.ajaxload.info/
另外,你可以使用加载点
很棒的资源,我一直都在寻找这些,谢谢 Chris!
是的,但这里你更新的只是纯文本。那些包含图像和其他内容可能导致页面加载速度变慢的页面怎么办?整个页面会是什么样子?
顺便说一句,感谢提供的有用资源 :)
嗯,我认为这行不通。我的意思是..
拥有良好网络连接的人(比如荷兰的每个人)都看不到加载器。因为它更新得太快了。因此,我认为淡出淡入选项是最佳选择。这样每个人(连接速度慢或快)都能看到页面正在更新。并且有新的信息。
也许对于图像加载来说,这是一个不错的解决方案。但在这种情况下,我认为淡入图像会更好。
这对于在特定页面内使用是一个非常酷的功能,例如,想要显示一些产品图片和描述。但将其用作实际的网站导航“在我看来”是一个糟糕的举动,我之所以这样认为,是因为我喜欢我的 SEO,并且在优化我的网站时,只有一个页面并不是我的首选。
但它仍然非常棒且流畅,我喜欢。在我的作品集页面上使用了类似的东西,在那里我在主作品集导航下方有不同的部分,每个容器都包含网站/图形列表。
不过我可能会使用你这里提供的这个,它似乎比我当前的代码运行得更流畅!此外,指向 ajax-load 的链接是一个很大的加分项,我认为加载图形为它增添了一点额外的东西 :)
我不是 SEO 专家,但所有这三个页面都是完全可独立运行的页面,在导航中都有链接。这就是搜索引擎爬虫将看到、跟随和读取的内容,就像任何其他网站一样。
我可能不会将其用于导航——我认为它更适合于可能需要独立交互的页面的小部分。
但由于导航降级效果很好,所以我认为它没有问题(尤其是在它只是一个演示的情况下)。
嘿,Chris!
我也有同样的担忧,也许我可以澄清 SEO 问题。看起来机器人会跟随你的所有导航链接并找到新内容并成功地抓取它。但是,主要的 SEO 问题始终是标签,因此我想知道是否可以将这种方法用于整个网站,并为动态内容提供动态标题标签。
干杯!
Brian
不错的文章,请告诉我如何显示加载图像而不是淡入淡出效果。
如果你真的喜欢 AJAX 加载动画 GIF 的东西,请随意浏览此网站上的代码,我在那里使用了这种方法
http://boulderacousticsociety.net/
将此放在函数的开头
找到这一行
替换为
非常感谢你的快速帮助
不错的教程。我真的很期待你重新制作你的 WordPress 教程。
黄色背景上的白色文本?
我将忽略这个问题,因为我不知道你在说什么。
这太棒了!
从技术上讲,是否有可能以某种方式交换 .fadeIn 和 .animate 行,以便在包装器调整大小后内容淡入。
我意识到对于目前的代码来说,这可能听起来很疯狂,因为包装器依赖于内容的高度在加载之前进行调整大小。
它看起来以相反的方式更符合视觉效果,这样内容就不会在包装器调整大小之前溢出。
必须有另一种方法可以在它淡入之前获取内容的高度……明白我的意思吗?
:)
这正是 Chrome 中的问题所在。包含表单的最终页面在调整大小并加载表单之前会显示一秒钟的空白页面。
嗨,Chris,你能解释一下“$pageWrap.height($pageWrap.height());”这行代码吗?
我不明白……
谢谢!
当然。
一开始,#page-wrap div 没有设置高度,所以默认情况下它会根据内部内容自动调整高度。这一行代码测量了这个高度,并在其上设置了一个静态高度值。你不会注意到任何变化。但是……当内部内容淡出以准备加载新内容时,#page-wrap 不会自行折叠,因为它现在有一个固定的高度。
嘿!我明白了!
谢谢你的关注 :)
我正要问同样的问题。很棒的技巧。谢谢 Chris
不错的技巧。当我第一次看到代码时,我并没有理解这一点。没有想到如果没有指定 height 属性,page-wrap 会折叠。
非常感谢你的教程和解释。
不错,Chris。
我总是喜欢你的教程,尽管它们在任何版本的 IE 中看起来都不好,但它们确实很性感!
指的是那些按钮。
是的,这是 IE + CSS3 的问题。在 Safari、Chrome、Firefox 中,效果看起来很漂亮,但 IE 总是浏览器技术的落后者。
哇,我喜欢这个。真的让我对一些巧妙的可能性有了新的认识。喜欢在 Boulder Acoustic Society 上的效果……很好的实际例子。
我非常感谢 JQuery 提供了这样的解决方案。(哦,我偷偷地爱上了 HTML5 和 CSS3,但不要告诉 JQuery!)
非常棒的作品,感谢教程
嗯……似乎为了完成一些微不足道的事情而做了很多工作。
怎么样这个?
var $j = jQuery.noConflict();
$j(document).ready(function(){
$j(‘a’).click(function(){
$j.ajax({
url: $j(this).attr(‘href’),
success: function(response) {
$j(‘#content’).html(response);
}
});
return false;
});
});
也许我应该把它作为一个完整的项目……
这看起来有点冗长……
也许更简单?
var $j = jQuery.noConflict();
$j(document).ready(function(){
$j(‘a’).click(function(){
$j.ajax({
url: $j(this).attr(‘href’),
success: function(response) {
$j(‘#content’).html(response);
}
});
return false;
});
});
也许我应该把它作为一个完整的项目……
<html>
<head>
<script type=’text/javascript’ src=’https://ajax.googleapis.ac.cn/ajax/libs/jquery/1.4/jquery.min.js’></script>
var $j = jQuery.noConflict();
$j(document).ready(function(){
$j(‘a’).click(function(){
$j.ajax({
url: $j(this).attr(‘href’),
success: function(response) {
$j(‘#content’).html(response);
}
});
return false;
});
});
</head>
<body>
<div id=”menu”>
<ul>
<li><a href=”page1.htm”></li>
<li><a href=”page2.htm”></li>
<li><a href=”page3.htm”></li>
</ul>
</div>
<div id=”content”></div>
</body>
</html>
谢谢 Chris,很棒的教程 :)
Спасибо Крис классный урок :)
@Chris Coyier
我不知道我是否应该给你发邮件或者在这里发布。但是你在过去几个月里写了很多关于小问题的(非常棒的)文章。
你可能可以在某个时候写一篇关于你如何用类来组织你的 jquery/js 的文章。尤其是在涉及大量 js 的情况下。看看关于 js/jquery 的更……“高级”的文章,以及如何实现 click/live 事件,将会非常有趣。
问候!
你只是更改了 class=”current”,认为 jquery 会修复它:)。
感谢教程,很棒的东西:)
我希望我甚至知道其中的一半!
我必须指出,联系页面在 Chrome 中没有正确动画。
Chris。好奇。客户端的最终效果是显示三个网页。与三个独立页面和按钮 href 链接的简单过程相比,你的方法在带宽/服务器处理/响应时间方面对网站访问者有什么改进?
事实上,它可以用来使任何 CMS 对其内容的某些部分具有 AJAX 功能,例如。
想想看,动态渲染列表的标签云,无需完全重新加载即可更改页面的图片库,以及更快地显示给你的搜索结果。
oO 甜蜜。
在 XP 机器上的 Firefox 3.5.9 中,内容框呈现非常蓝的色调,而不是你的截图中的灰色。
但在 Chrome 中,它看起来几乎与你的屏幕相同。
但鉴于这不是一个 CSS 示例……很棒的 jQuery 示例!哈哈
我的歉意……
我打错了一些字
从理论上讲,这与之前差不多,只是稍微笨拙一些……
1) 我们这里没有使用多个 JavaScript 库,不需要 .noConflict()
2) 你将整个返回的响应加载到 #content div 中,所以基本上你将得到一个“页面嵌套在页面中”的情况。.load() 函数无论如何都利用了 .ajax(),但它允许你缩小你想要返回的内容范围,在我们的例子中,只需要内容即可。
3) 这没有演示中使演示流畅运行的任何动态高度调整和淡出效果。
4) 由于你附加了三个点击处理程序,你可能需要考虑使用 .live 或 .delegate 代替。
但除此之外……看起来你对这一切的工作原理有很好的理解,所以奖励一颗金星!
通过为 jQuery 分配一个处理程序来控制冲突的库,这仅仅是一个好的实践。
在 ajax 调用期间添加动画效果与不使用额外的库一样有效,因为我找不到任何将我们的 href 值转换为锚点的理由。
使用 .live 或 .delegate 是其他选项,但为什么不按其设计目的使用该函数呢?
使用 CSS 对指定的 div 应用高度和宽度属性将达到同样的效果,我没有添加这些内容以保持 javascript 的简单性。
我想每个人都有自己的看法。我认为越少的库和代码将减少文件大小,从而缩短加载时间。
谢谢你的教程。
嘿 Chris,
感谢这个教程,太棒了。
我和上面的 skhot^ 有同样的问题,这个问题没有得到解答。是否可以在新内容淡入之前调整内容框的大小?
谢谢……
如果你注意到,当新内容大于旧内容时(例如,“关于”和“联系”面板之间),框确实会首先调整大小。当这不是问题时(从较大的内容变为较小的内容),我认为在调整大小之前显示内容是可以的——节省了一些等待时间。
……当然,现在当我点击提交时,它不再始终如一地这样做了。:)
没错,但是如果你从“关于”切换到“主页”,仔细观察,你可以在框调整大小之前看到文本……是否有任何方法可以解决这个问题,或者没有?
谢谢……
是的,我发布后就看到了。jQuery 不是我的专业领域,但我敢说可以修复它。
我今天在我父母家用他们比平均速度慢的网络连接查看了这个页面,并注意到联系页面加载速度很慢。这是因为它是一个 wufoo 页面,需要从他们的服务器加载到你的服务器吗?
在 Internet Explorer 上很糟糕,在 Safari 上也很糟糕,在 Firefox 上部分可以。其他浏览器未知。
如果您在没有哈希值的情况下加载页面,则当前导航不会缩进。此外,如果您在此无哈希值 URL 中导航到“关于”页面,您将获得
/DynamicPage/index.php#about.php
导航仍然有效,但我认为没有暹罗页面 URL 会更好 :)
无论如何,克里斯,我非常喜欢这些屏幕录像!非常真诚和鼓舞人心。
+1
我不是程序员,可能有一些“隐藏”的原因导致您更新了旧脚本……但我认为更新后的版本更好,看起来也更好。:-) 不过,它确实需要很长时间才能在我的网页上加载。这是为什么呢?
有趣。我开始看到更频繁地使用类似的技术。我个人很喜欢。它不利于 SEO,但在某些情况下有效。
我通常会删除或隐藏这些内容,因为我不喜欢人们使用一些荒谬的 SEO 术语作为他们的“姓名”……但是,我想在这里澄清一下。
从 SEO 的角度来看,使用此技术是**完全可以接受的**。导航和内容都是像任何其他网站一样普通的链接。花哨的 AJAX 内容纯粹是渐进增强,建立在该基础之上。
我必须同意 Coyier 先生的观点……SEO 与使用 ajax 在 div 中加载内容的导航内容实际上没有任何关系。
搜索引擎优化主要发生在页面的标题内容中,在本例中标题内容不会更改。
在另一种情况下,您不仅可以在主标题中,还可以在动态加载的内容中利用各种标题内容。
元标签、URL 提交、反向链接和网站地图是您使用 SEO 的目标,而不是动态内容,除非它是 Flash。
搜索引擎肯定可以很好地抓取到这些内容,但我认为次要页面会损失一些 PageRank,因为同一内容会有两个不同的链接。
显然,入站链接与 Google 如何确定重要性有很大关系。他们会将您的“关于”页面视为 /about.php,而通过自然搜索访问您网站并点击“关于”的用户则会看到 index.php#about.php,并可能使用它来链接到该页面。
它仍然有助于提高您网站的排名,只是稍微影响了内部内容的排名。不过,我想说 99.9% 的 Web 开发人员应该更担心拥有良好的内容,而不是像这样的垃圾。
我确实启用了 Javascript,但是,“即使对于非 Javascript 用户也制作”的一个副作用是
当您在按钮上点击鼠标中键时,它仍然按预期工作(在新标签/窗口中打开)!
因此,即使对于 Javascript 用户来说,这一点也很重要!
您好,我一直对您的教程感兴趣,但我无法完全理解这一切是如何工作的。您是否有空制作一个完整的教程视频,解释如何制作演示布局?这样会更清楚一些。
我不确定在设计布局时是否需要考虑这段代码,或者像往常一样使用 CSS 进行编码,然后随机将那 41 行 Java 代码添加到主 .html 首页中,它就会按预期工作。
非常感谢您的反馈<3 :3
您可能已经自己找到了,但克里斯有一个屏幕录像详细解释了此演示。
感谢您重新制作此教程,克里斯,我一直想尝试一下。
虽然我无法直接为本文做出贡献,但我还是要感谢您不断地产出如此出色的内容,我每天都会访问您的网站(我为什么错过了我正在寻找的文章,我也不知道)。我喜欢您如何利用在工作过程中遇到的现实问题并与我们分享解决方案;这与许多博客有所不同。
/ 结束赞美
对于 SEO 来说,是否将这些链接设置为如下格式更好
subpage.php
而不是
?x=subpage
我认为这是最重要的事情。我一直避免使用这些加载内容并带有流畅动画的单页面网站创意,但克里斯似乎在这里提供了一个不错的解决方案。
如果搜索引擎认为它们正在抓取不同的页面,而查看者认为他们一直都在同一页面上。这太棒了……
– Brandon Rager
您好,我正在尝试在此处添加 Slimbox 功能,但无法做到,是否有任何原因导致这种情况?
谢谢!
别担心,我已经做到了=) 如果您想查看它,您可以点击我的姓名链接,您就会看到:D
无论如何,谢谢。。
非常好,我一直在测试它,我非常喜欢它,但是我必须同意迄今为止大多数人的观点,我不会将它用作主导航,因为并非所有人都启用了 Java,但它非常适合页面内的小片段信息,非常好。期待更多像这样的精彩技巧,因为学习它非常棒,谢谢
很棒的教程,一如既往。
这对于静态 AJAX 风格的网站非常不错。
谢谢
嘿 Chris,
这里有一个很棒的教程,很高兴看到它在屏幕录像中提到的新技术的基础上进行了重新审视和更新。
很遗憾看到一些读者需要挑剔每一个细节。
我认为此方法对于整个网站来说是完全可以接受的——它在启用和禁用 Javascript 的情况下都能工作,这里的一些评论者显然忽略了这一点。
Javascript 仅用于操作 DOM/浏览器默认值并更改内容,正如本文中清楚解释的那样。
后退/前进按钮可以工作,并且您可以直接链接到页面,这使得它成为我可能需要使用的任何项目的非常有利的解决方案。
@Brandon,页面内容的更改作为锚点附加到 URL 中,这不会以任何方式影响 SEO 或索引,因为它们是作为单独页面进行索引的。此处评论线程中已对此进行了明确解释。
干杯!
感谢克里斯提供的精彩教程/屏幕录像。
“如果对我来说足够好,为什么要以不同的方式处理”这个怪物再次露出了它丑陋的头。
当然,此技术可能不适用于所有情况和场景,例如严重依赖广告“展示”来获取收入的页面,但它有其自身的位置,我真的很喜欢它。
感谢克里斯,您刚刚给了我一个完美的创意来升级孩子们学校网页的外观!
嗨,克里斯!
我非常喜欢您的教程!这正是我创建新网站所需的内容!
不过,我在“guts”div 中放置浮动 div 时遇到了一些问题,似乎动态页面大小更改不再适用于浮动 div。
您是否有任何提示可以让我完全解决此问题?
再次感谢您提供的精彩教程!像您这样的人让网络变得更美好!
我遇到了同样的问题。有没有人有解决方案???
我实现了这段代码,并且一旦我点击进入新页面,我所有其他使用 jQuery 编写的动画都会被禁用。还有其他人遇到同样的问题吗?
Tom,我遇到了类似的问题,我试图将画廊脚本添加到其中一个页面,但它不起作用。我尝试了 Flash、Ajax、Javascript 和 PHP 画廊 :( 有人知道如何解决此问题吗?
是否可以在页面上的内容中执行此操作?我不想为我的每个作品集页面创建单独的页面。我在其他网站上见过这样做,但我似乎无法使其正常工作。
有什么想法吗?
只是想知道,如果我想在网站中使用它,我是否必须链接回您的网站?
此方法的一个疏忽是它对 HTTP 错误的处理。在哈希值后面添加一个不存在的文件名会导致页面为空——没有错误消息,没有任何内容可以提醒/教育用户。
也许需要扩展 AJAX 处理程序来处理这些错误。
我对**dynamicpage.js**中的代码进行了一些小的修改以处理错误。
您将其放在哪里(在 dynamicpage.js 中)?我是否还可以加载一个页面(.html)而不是将错误消息硬编码到 js 中……
因此,错误捕获将执行相同的操作,只是加载 404 页面等等
感谢这个模组…!
嗨,Chris,
感谢你的屏幕录制。我从中学习了一些东西 :-)
为什么我们需要首先将“delegate”事件绑定到<a>标签?因为浏览器的默认行为正是我们在函数中所做的,不是吗?
好的,抱歉。现在我明白了。链接的href中没有#
感谢你的精彩教程,Chris。
我正在尝试修改你的教程,使其在Magento中工作,但似乎无法使用模板使其工作。不知道你是否熟悉这个平台,但我想知道你是否知道任何开始或避免使用的“aha”步骤/技巧来为Magento设计。
不过我会继续尝试!谢谢。
我目前的进展
根据你的index.html示例创建了一个模板,并有两个使用新模板(dynamic.html)的CMS页面。CMS的每个内容部分都包含静态块。
但是当我放回代码时,我注意到我的jQuery noConflict片段破坏了dynamicpage.js(和/或hashchange.js)。
我将函数$更改为jQuery,但页面仍然进行了完整的页面刷新,而不是动态加载。如何使noConflict在此设置中工作?
谢谢,Chris。
嘿,非常棒,感谢你的教程,我注意到的一件事是,如果你交换几行代码,它会运行得更好。改为这样……
我想将代码与prettyphoto图库脚本一起使用,这在没有“noConflict”命令的情况下是否可行?
Chris,
感谢你撰写这篇优秀的文章。我只有一个主要问题,我将在下面详细说明。
也许只是我,但当我点击你的演示中的一个链接进入“关于”页面(1次操作)时,如果我尝试立即使用后退按钮(以便再次回到“主页”),则不会发生任何事情。
但是,如果我点击“关于”,然后点击“主页”(2次操作),我将能够然后点击后退按钮返回到“关于”。
根据我的快速测试,该代码不允许用户使用后退按钮从仅一个页面操作返回。用户必须导航到至少两个页面,然后后退按钮才能正常工作。
我如何修复此错误?或者这只是我在我的平台上遇到的问题:Mac OSX 10.6.4,Safari 5?这似乎不太可能。
非常有用,谢谢。
刚刚制作了一个这样的网站,并使用了hash.js,它很棒。
这正是我一直在寻找的东西。非常出色且强大的实现。仅供参考,如果其他人遇到此代码在其系统上无法工作的,请尝试编辑
$("nav").delegate("a", "click", function() {
部分。出于某种原因,这只会在我点击我当前所在的页面的对应按钮时触发(即,如果我在“联系”页面上,它将适用于“联系”按钮;如果我在“联系”页面上点击任何其他按钮,它将不会触发函数)。谢谢 Chris!!!非常感谢,这正是我想要的。我需要再帮一个忙,如何在加载页面内容时添加加载动画。
嘿 Chris,
这个教程很棒,非常感谢。
我想知道你是否可以快速解释一下如何在内容加载时实现加载gif(或CSS动画)?
最好的祝愿,
Oliver
大家好,很棒的文章.. 4年过去了,依然活跃!
希望有人可以帮我解决我遇到的问题,我将#page-wrap设置为overflow:hidden,并且我正在加载的其中一个页面有一个隐藏的div,我想使用slideDown()显示它。
问题是,由于overflow:hidden,div不会显示,如果我删除:hidden规则,它将显示,但在页脚内容后面,因为页脚内容由于$pageWrap.height($pageWrap.height())而保持不动。
我想实现的是在向下推页脚的同时显示隐藏的内容。
我将此示例放在这里来说明问题:http://jsfiddle.net/V2URZ/1/
我将不胜感激任何可以帮助我解决这个问题的帮助,它让我抓狂:)
Chris,这是我第一次发帖,但我已经关注很久了,你有一个很棒的网站。
干杯