【问题标题】:How do you make website for both web crawlers and single page application users?您如何为网络爬虫和单页应用程序用户制作网站?
【发布时间】:2016-04-11 15:42:38
【问题描述】:

我会非常具体。

我有一个前端... http://www.eroticahub.site(不是色情)

如果你有 javascript,它会变成... http://www.eroticahub.site/#!body=home [使用 jquery/ajax 加载渲染]

如果您没有 javascript,它仍然存在... http://www.eroticahub.site/

然后你点击底部的“隐私”。

如果你有 javascript,它会将文件 /body/privacy.html 加载到主 div 中,你会得到... http://www.eroticahub.site/#!body=privacy [使用 jquery/ajax 加载渲染]

如果你没有 javascript,你只会得到... http://www.eroticahub.site/body/privacy_body.html

^ 我只是在获取 jquery/ajax 插入到模板中的文件。

这不是一个很好的解决方案。我想要一个永远不会完全刷新/重新加载但被每个主要搜索引擎完全索引的页面。

有没有可能做这样的命令:

For each link in page, 
  if ( user_has_javascript )
    return page_with_javascript;
  else
    return serverside_render( page_with_javascript );

这样,任何没有 javascript(包括网络爬虫)的用户都将获得页面的纯 html/css 版本。我打算将 Ruby 用于我的后端。有没有人有一个干净的解决方案来解决这个问题?

【问题讨论】:

  • 可以通过User-Agent检测是否是爬虫,或者在html中使用
  • 假设用户直接访问...eroticahub.site/privacy。它将具有通用站点模板,然后在其中将有一个包含隐私正文模板的 noscript。然后在底部会有一个 javascript,上面写着“如果 URL == 隐私”,然后运行这个使用 jquery/ajax 加载隐私正文语句的 javascript。然后,如果用户单击链接以转到“合法”...您无法重新加载通用网站模板,因为这会导致页面刷新。
  • 您不能根据爬虫用户代理生成不同的 html,因为这听起来像是在欺骗搜索引擎。那些东西很愚蠢。
  • 好的。假设用户直接访问... eroticahub.site/#privacy。搜索引擎理解 URL 参数但通常忽略片段,因此#privacy 可能不会出现在搜索引擎列表中,因为它是一个片段。
  • 好的。假设用户直接访问... eroticahub.site/privacy,然后他们单击链接转到 eroticahub.site/legal 。指向法律的链接将具有一个 javascript 函数,可将用户带到 eroticahub.site/legal#dynamic 。如果#dynamic 存在,则将“合法”模板加载到正文中。如果不存在,则必须有一个

标签: javascript html ajax search-engine single-page-application


【解决方案1】:

好的。假设用户直接访问... eroticahub.site/privacy,然后他们单击链接转到 eroticahub.site/legal 链接如下所示:

<a href=eroticahub.site/legal.html onclick=function(){window.location.hash = 'legal.html';return false;}> 
    Link 
</a>

因此,如果用户没有 javascript,他们会转到 eroticahub.site/legal.html 并从服务器请求一个全新的页面,如果他们有 javascript,他们会转到 eroticahub.site#legal.html 并且不会请求来自服务器的全新页面。

# 将触发哈希更改事件,该事件将调用一个带有大 switch 语句的函数,其中包含 (window.location.hash === "legal.html")。此条件将触发使用 jquery/ajax 将 sn-ps/legal.html html 加载到网页中。

如果链接指向 eroticahub.site/legal.html,后端将提供与 eroticahub.site/privacy.html 相同的模板,但中间部分包含来自 sn-ps/privacy.html 的单词

如果用户有 javascript,中间部分的渲染与用户没有 javascript 相同。只有当用户单击链接时,才必须区分他们是否有 javascript。 AJAX 必须在 eroticahub.site/privacy 的内容 div 中的 [替换] 静态内容之上加载动态内容 (#legal),然后这将被完全相同的 div 中的更多 html 替换。必须保持这样的约定:

<a href=eroticahub.site/legal.html onclick=function(){window.location.hash = 'legal.html';return false;}> 
    Link 
</a>

<a href=eroticahub.site/privacy.html onclick=function(){window.location.hash = 'privacy.html';return false;}> 
    Link 
</a>

<a href=eroticahub.site/user_content/stories.html onclick=function(){window.location.hash = 'user_content/stories.html';return false;}> 
    Link 
</a>

等等

【讨论】:

  • 这样做的结果是被放入的sniper的ID和正在替换它的snipper的ID应该相同。
【解决方案2】:

首先让所有内容都使用常规 URL 而不是 JavaScript。你希望你的 JS 是 unobtrusive,所以将它构建在一个工作的、普通的 HTML + 服务器端解决方案之上。

接下来编写从服务器获取所需数据的 JavaScript 并更新文档以匹配另一个页面。

该 JavaScript 应使用 pushState 更改 URL,以匹配您在本地使用 JavaScript 生成的服务器页面的 URL。

注意:pushState 替换了 hashbang URI。它是为您描述的用例设计的标准(而 hashbang 是 ugly hack)。

将该 JavaScript 绑定到您的链接点击/表单提交/等事件。

popstate event 添加listener,这样当用户单击返回时,您可以将页面恢复到之前的状态。

【讨论】:

  • 所以这样做,我应该将 javascript 保留在 html 之外,因为那将是“不引人注目的”。 html 中没有 javascript [除了一个用所有 javascript 填充的链接]
  • 然后在弹出状态下,我会执行“history.back();”
  • @MichaelLafayette — 不,history.back() 是您将人们送回历史的方式。 popstate 事件在用户选择返回历史记录时触发。此时您使用 JS 通过 DOM 操作将后页更改为之前的状态。
  • 哦。因此,如果我只是使用 pushState 更改 url 以匹配来自服务器的 URL,然后单击返回,那么如果不设置 window.onpopstate,它就不会返回。只需像这样设置 window.onpopstate ... window.onpopstate = function(event) { loadOldState() };其中 loadOldState 从事件中获取状态并使用 jquery/ajax 从旧页面中加载 html。您如何从事件对象中获取旧 URL 并执行最后一部分?
  • $(window).bind('popstate', function(event) { var state = event.originalEvent.state; } . 这个状态变量中是旧的url吗?
猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 2023-03-21
  • 2015-07-15
相关资源
最近更新 更多