在阅读了Google关于使Ajax生成的内容可抓取的政策以及许多开发人员的博客文章和Stackoverflow问答主题之后,我得出的结论是,没有办法建立只有JavaScript/Ajax生成的网站HTML可抓取.我目前正在工作的网站没有获得相当数量的内容索引.我们的非索引内容的所有表示层都是通过从基于Ajax的Web服务调用返回的JSON生成HTML而构建的,我们相信Google并没有因此而对内容编制索引.那是对的吗?
唯一的解决方案似乎是拥有搜索引擎(特别是谷歌)网站的"后备"版本,其中所有HTML和内容都将按照传统方式在服务器端生成.对于启用了JavaScript的客户端,似乎我们可以使用与现在基本相同的方法:使用JavaScript从异步加载的JSON生成HTML.
回顾一下,我的理解是,如上所述,当前在创建可抓取的Ajax生成的网站时应用DRY原则的最佳实践是使用可以在客户端和服务器端使用相同模板的模板引擎.对于启用了JavaScript的客户端,客户端模板引擎(例如mustache.js)会将从服务器发送的JSON数据转换为HTML,如其模板文件的副本所定义.对于禁用了JavaScript的搜索爬虫和客户端,同一模板引擎(例如mustache.java)的服务器端实现将类似地对其相同的模板文件的副本进行操作以输出HTML.
如果该解决方案是正确的,那么这与4或5年前由前端重型站点使用的方法有何不同,其中站点基本上必须维护两个模板代码副本,一个副本用于启用JavaScript的用户(几乎每个人)和没有启用JavaScript的搜索引擎和浏览器的另一个副本(例如在FreeMarker或Velocity中)(几乎没有人)?似乎应该有更好的方法.
这是否意味着需要维护两个模板模型层,一个在客户端,另一个在服务器端?将这些客户端模板与Backbone.js,Ember.js或YUI App Library等前端MVC(MV/MVVC)框架相结合是多么可取?这些解决方案如何影响维护成本?如果不将更多框架(一个新的模板引擎和一个前端MVC框架)引入开发团队的技术堆栈,尝试这样做会更好吗?有没有办法减少冗余?
如果该解决方案不正确,那么我们是否缺少某些东西,并且可以通过我们的JavaScript做得更好,以保持我们现有的异步HTML-from-JSON结构并将其编入索引,因此我们不需要引入新的东西到架构堆栈?当业务需求发生变化时,我们确实不必更新表示层的两个版本.
我有一个Javascript对象数组,我想通过一个属性进行交叉兼容排序,该属性总是一个正整数,最后有一个可选的单个字母.我正在寻找一种至少适用于Firefox 3和Internet Explorer 8的解决方案.我最接近这样的排序功能如下:
var arrayOfObjects = [{id: '1A', name: 'bar', size: 'big'}, {id: '1C', name: 'bar', size: 'small'}, {id: '1', name: 'foo', size: 'big'}, {id: '1F', name: 'bar', size: 'big'}, {id: '1E', name: 'bar', size: 'big'}, {id: '1B', name: 'bar', size: 'small'}, {id: '1D', name: 'bar', size: 'big'}, {id: '1G', name: 'foo', size: 'small'}, {id: '3', name: 'foo', size: 'small'}, {id: '23', name: 'foo', size: 'small'}, {id: '2', name: 'foo', size: 'small'}, {id: '1010', name: 'foo', size: 'small'}, {id: …
Run Code Online (Sandbox Code Playgroud) 我希望能够使用 Tuckey URLRewrite 过滤器在 Tomcat 中进行跨上下文请求转发。例如,我希望能够使用 SEO-/user-friendly URL 路由传入请求,如http://example.com/group-elements/300245/some-descriptive-text,其中“group-elements " 不是已部署应用程序的名称,不是映射到应用程序 'foo' 的 Java Spring 控制器方法的 URL,例如http://example.com/foo/app/group/300245/elements。我正在使用 Tomcat 7.0.27 和 URLRewrite 3.2.0;我正在使用 Java Spring 3.1 Web 应用程序。
所述URLRewrite 3.20文档注意到一个可选的“上下文”用于“到”滤波器参数元素属性:
If your application server is configured to allow "cross context" communication then this attribute can be used to forward (and only forward, not redirect or other "to" types) requests to a named servlet context.
On Tomcat, for instance, the application contexts in the server configuration …
Run Code Online (Sandbox Code Playgroud) spring tomcat servlets url-rewriting tuckey-urlrewrite-filter
我正在尝试在jQuery中实现XHR流Comet技术,但是在检测onreadystatechange
事件时遇到了一些麻烦.我正在使用Firefox 4.0.1.
我正在使用预过滤器(自jQuery 1.5起可用)来修改本机XHR对象,特别是为事件添加事件处理程序onreadystatechange
.我在http://jsfiddle.net/Rdx6f/上有一个粗略的实现.该事件被触发时,该代码会将文档附加到XHR对象readyState
和responseText
属性onreadystatechange
.但奇怪的是,它似乎只onreadystatechange
在readyState
1 时检测到事件.
换句话说,onreadystatechange
当XMLHttpRequest对象处于"打开"状态(readyState 1)时,jQuery似乎检测到事件,但是当XHR对象处于"收到的头"状态(readyState 2),"loading"(readyState 3)时,jQuery似乎没有检测到事件. ),也没有"完成"(readyState 4).
奇怪的是,如果我alert()
在事件处理程序中,那么我确实看到onreadystatechange
readyState为1,2,3和4时的处理.请参阅http://jsfiddle.net/Rdx6f/1/.与http://jsfiddle.net/Rdx6f/相同的代码,只是alert()
而不是附加到文档.
我还可以在本机JavaScript中检测1,2,3或4 onreadystatechange
时的事件readyState
- 请参阅http://jsfiddle.net/d7vaH/.(该代码几乎是从Dylan Schiemann在"Even Faster Websites"一书的第115页上实现的XHR流程中逐字记录的.)
我只是在这里做错了,比如使用jQuery的Ajax前置错误或者出现JavaScript错误?这可能是jQuery中的一个错误吗?