使用 jQuery,您可以加载 URL 的内容,还可以加载该 URL 内特定 CSS 选择器的内容。 就像这样。
$("#area").load("something.html #content");
这会在 something.html
文件中找到 ID 为 content
的元素内的内容,并将其放置到当前页面上,位于 ID 为 area
的元素内部。
但是,假设 something.html
实际上与当前页面非常相似。 您的目标实际上是替换 something.html
中的 #area。
$("#area").load("something.html #area");
但这样做会有问题,因为您最终会得到
<div id="area">
<div id="area">
<!-- stuff -->
</div>
</div>
并且无论触发该操作的是什么,如果您再次执行它,都会导致更多嵌套(不好)。
简单的解决方案是只获取 #area 的所有内容,而不是 #area 本身。
$("#area").load("something.html #area > *");
以及世界上最简单的(功能不完整)演示
这在以下情况下特别有用:
- 您正在将站点作为渐进增强进行 Ajax 化,因此每个 URL 不仅仅是数据片段,而是一个独立存在的完整页面(并且页面彼此结构相似)。
- 您不想向页面添加像
<div id="inside"></div>
这样的标记来解决此问题。
感谢 Anthony Harris。
简洁明了的帖子,我记得你之前关于 ajax 加载的一个屏幕录像,真的很棒!
我真的很喜欢你的屏幕录像……现在太少了,Chris! 我想念它们!
我也是。 我想念每周都能从 css-tricks 获得屏幕录像的乐趣 >< 哈哈
通常,当您执行此类操作时,根元素(在您的示例中为 #area)可能具有不同的属性,这使得“#area > *”不完全正确。
出于这个原因,我有一个“loadReplace”方法来为我完成这项工作 :)
“使用 jQuery,您可以加载 URL 的内容,还可以加载该 URL 内特定 CSS 选择器的内容。 就像这样。”
你的意思是 DOM 选择器,对吧?
无论如何,好技巧,我之前也遇到过这个问题,这是一个优雅的解决方案。
我的意思是 CSS 选择器。 jQuery 使用 Sizzle,这是一个使用 CSS 选择器的选择器引擎,因此这就是您在 load 函数中 URL 后使用的东西。
感谢你的文章
仅供参考。 这不允许您从外部页面加载内容。 我以惨痛的代价了解到这一点。
AJAX 实施了同源策略,并且只会加载与加载它的页面相同的地址的内容。 要解决此问题,您可以使用 PHP 等服务器端语言加载页面,然后将其回显/打印出来(基本上是代理)。
这真的很棒。 看我的页面一遍又一遍地重新加载相同的背景很烦人。 谢谢!
加载整个页面,但只获取其中一部分。 尽管这可以通过 jQuery 实现,但我永远不会使用它。 我只会加载我想要的数据。 加载任何额外的数据听起来像是糟糕的架构……
同意
同意你的观点!
我理解你的意思,但在没有任何上下文的情况下很难争论这些事情。 这就是这种孤立提示的本质。 这可能对某些特定项目来说是 100% 完美的。
@Chris:正如你所说,这个技巧在你需要编辑/更改/添加现有行为的功能时很有用,但我永远不会在制作项目时*计划*这个功能
这就是我所说的。
如果您需要加载在浏览器中显示为“常规”网页的页面的内容,最好在其中插入一些服务器端逻辑,以便在存在 XHR 时过滤内容(在大多数情况下实际上是一个 if 块)。
但是,当您只需要其中的一两个块时,通过 XHR 加载整个页面,嗯,这是违反逻辑的。 您加载了额外的内容而不是保存它并减少响应的大小,这反过来会加快加载速度。
hristo 说得对! 如果您只需要页面的某些部分,为什么要加载整个页面? 了解这一点很棒,我以前不知道!
请注意,此行为会加载整个页面,然后 jquery 解析它以仅返回选择器.. 所以,我认为这是一种“快速而肮脏”的解决方案,绝对浪费带宽和浏览器资源;)
我唯一能想到的问题是 SEO。 就我所知,搜索引擎不会加载此内容。
当您有服务器端包含时,搜索引擎会完整获取 HTML。
使用上述 jQuery 方法,浏览器负责获取该 HTML。
我可能是错的,但我认为这对 SEO 不利。
我不这么认为。 除非我看错了,否则您可以设置一个正常的网站,所有页面都通过正常的导航链接,搜索引擎可以轻松抓取。
此脚本只是在此基础上添加了一些渐进增强,因此您不必加载整个页面,而只需加载内容即可。 但如果没有脚本,它就会降级为标准网站。
绝对的。 对用户也有好处,不仅仅是 SEO。
看起来不错,但您可能只需更改 # 并添加一个隐藏类,这样它只需加载每个页面一次,并且仍然可以在它们之间切换。
function changePage(page) {
if( $(page).css(‘display’) === ‘none’ ) { //如果已加载并隐藏
$(page).fadeIn(‘fast’);
}
elseif( $(page).css(‘display’) !== ‘block’ ) { //如果未加载
$(page).load(page+”.html #”+page+” > *”);
}
// 如果已加载且处于活动状态,则不执行任何操作
}
这是一个功能示例,尽管代码质量不是很好。
糟糕,这是在 [$(page).fadeIn(‘fast’);] 之后
$(‘.active’).removeClass(‘active’).fadeOut(‘fast’);
$(page).addClass(‘active’);
这仍然让我感到困惑。 不一定是文章,我认为文章很棒,而是对哈希的需求。
我想我之前提到过,为什么不这样做呢?
因为 SEO。 有关更多信息,请参阅 https://css-tricks.org.cn/video-screencasts/85-best-practices-dynamic-content/。
啊哈,所以与功能无关,而与爬虫和搜索引擎有关。
嗯,爬虫通常使用链接的 href 属性来索引站点。 因此,从技术上讲,对每个使用哈希可能会导致更多问题,对吧?
刚刚加载的页面显示在 URL 栏中并不一定意味着它对 SEO 更有利,因为我遇到的大多数爬虫都会搜索 href 属性并从 HTML 中跟随它。
我唯一能想到在 URL 中使用哈希的真正原因是针对最终用户。
哈希存在的实际原因不是为了 SEO,而是为了保持后退按钮的使用。 使用 Ajax 化站点的规则 #1 是不要破坏浏览器的功能,而您的代码会通过使后退按钮加载错误页面来做到这一点。
假设我在谷歌上,最终点击了一个使用您代码的网站,然后我点击了一些动态内容链接。 然后,如果我想返回到您网站上的一些先前内容并点击浏览器的后退按钮,我将返回到谷歌。
通过使 a.click() 触发哈希更改,我们使用该哈希更新浏览器的历史记录。 然后,我们侦听页面上的哈希更改事件,当您看到它根据点击的链接或历史记录导航操作发生更改时,网站将以一致的方式运行。
我将此技巧发送给 Chris 是因为 Jan-Marten 提到的视频——你绝对应该看看。此方法与 Chris 在该视频中的方法之间的区别在于,他的方法需要一个 #guts div 来包含您尝试加载的内容。此方法不需要,并且允许您编写纯粹语义的 HTML,而无需为了 JavaScript 而添加多余的元素。
我将所有代码复制粘贴到我的 CSS 样式表中,但它不起作用。这个网站是关于 CSS Tricks 的,对吧?;P
我开玩笑的,它看起来是一个非常简单的方法,我喜欢。
再次,非常及时。我正在构建一个网站,并且一直在使用动态页面/替换内容(https://css-tricks.org.cn/dynamic-page-replacing-content/) 项目来创建一个只加载一次背景、导航等,然后独立加载网站其余内容的网站。
但是当我要加载的内容包含其他 jQuery 好东西(如选项卡或内容滑块)时,我遇到了麻烦。不知何故,这一切都变成了火车失事,停止工作了。也许这项技术可以解决这个问题……
/祈祷
我正在开发一个应用程序,它将在首页切换内容(自定义 PC 应用程序),这样的功能可能正是我需要的。;)
以防万一,我会保持此选项卡打开状态。
非常有用。请记住在内容加载前使用一个酷炫的加载圆圈。
我也很高兴看到你喜欢培根!
很酷的文章
在这种情况下使用 $.get 会不会更好?
如果你需要传递参数或其他内容,当然可以,但我认为它并不自动更好。我敢肯定,它们内部都使用 $.ajax。
真的很酷,但我想知道,这在 SEO 方面是如何工作的?当页面被抓取内部链接时,它是否将其识别为链接?
是的。
酷
在使用 jQuery 时,我将其作为快速解决方案,我认为它是一个非常有用的技巧,因为当您遇到其他方法都不起作用的情况时,这可能是真正的救星。这是您通过经验获得的东西。
“使用 jQuery,您不仅可以加载 URL 的内容,还可以加载该 URL 中的特定 CSS 选择器”……
但是,不要忘记 AJAX 很棒,因为它可以使您的页面对最终用户的工作效率更高、速度更快。如果您只是使用 AJAX 加载整个页面,然后从那个巨大的页面中获取一个部分,那么您就是在浪费每个人的带宽和时间!
这并不是说这不是一篇很棒的文章,因为它确实是一个非常方便的技巧——但请不要用这些知识做任何疯狂的事情。
另一种解决方案是使用两个 div。
然后在通过 JQuery 加载时
$("#1").load("something.html #2");
嗯……
所以在 IE 中 **尝试** 这样做 $(“#target”).load(url+” aside#All-Content > *”);
此致!附言:Load() 函数在 IE 中无法很好地与 HTML 5 标签一起使用!
我们可以在加载后添加动画吗?
例如
$(“#area”).load(“something.html #area > *”).show(“slow”);
将函数作为第二个可选参数传递
Chris,感谢你的分享。我正在处理一个使用一些非常简单的 Ajax 的项目(对 Ajax 比较新手),而这正是我想要改进它的方法。当我想从 ajaxed 页面运行 JavaScript 时,我遇到了问题——你的想法可以作为解决方案的一部分吗?
每个人都一直说如果只需要一小部分内容,就避免加载整个页面。我的问题是
最好的方法是什么?发布一个变量在 php 中进行测试?将您需要的区域分成一个新文件,该文件包含在原始文件(服务器端)中,并将 ajax 请求发送到那里?或者以上都不是……
我有一个页面/应用程序,它比我想象的更依赖于此 jquery 函数。如果我能解决这个问题以使用更少的带宽,那就太好了,我只是不知道最好的方法。感谢您提前提供的任何建议。
抱歉链接错误。这是正确的链接
Bless Your Letter Art
我之前只是为了好玩做过这个。
当 javascript 未激活时仍然有效。
唯一的问题是通过 ajax 加载的联系表单。
很酷,不过我刚刚发现它实际上并没有“获取 #area 的所有内容”,而是选择与“> *”表达式匹配的每个 *DOM 节点*。例如,如果您的标记像“Lorem Ipsum Content”,则只会选择“content”。
当你想到它的时候,这是很合乎逻辑的,但花了我一段时间才弄清楚。
抱歉,意思是<section id=”area”>Lorem Ipsum<p>Content<p></section>。
有没有办法将其应用于不以 .html 结尾的页面?
例如,我想在页面重新加载后显示最新的 div,但我使用的是 wordpress,并且 url 如下所示
http://civitasinc.com/2013/philosophy/#ideas
因此,如果页面重新加载或有人将 url 复制粘贴到另一个浏览器中,我想显示目标为 #ideas 的 div……
谢谢!
不错。
你从哪里获取“something.html”文件。