使用 jQuery 加载 plusone.js

从 Google 推出 +1 按钮之后就在网站上部署了,后来又添加了 Google 企业信息页徽章。然而天朝封掉了 plusone.js 的服务器,多数人在访问页面的时候都无法正常加载该 js 文件。其实不能显示 +1 按钮也关系不大,可是不能在加载该 js 文件的时候遇到错误往往会使页面加载时间成倍上升。

一直在想办法通过判断 plusone.js 能否正常加载来设置一个过期时间(timeout),让浏览器不要一直等待一个永远不会来的文件。今天终于算是差不多实现了。至于效果怎么样,还有待观察。

1. 实现方法

实现这一想法使用的是 jQuery.ajax 方法,所以要用到 jQuery 框架的基础代码 jquery.js 或者 jquery.min.js。下面使用的是 Google 提供的 CDN(WordPress 有个插件 Use Google Libraries 可以将主题、插件中使用的框架代码链接替换为 Google CDN 的链接,但是下面的代码是直接添加到主题模板的)。不用担心,这个一般不会被墙。

只需要将 Google +1 按钮中的第二段代码,

window.___gcfg = {lang: 'zh-CN'};

(function() {
     var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
     po.src = 'https://apis.google.com/js/plusone.js';
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
 })();

替换为下面的代码段(以 // 开头的行为注释,使用时可删除),

// 使用时可删除下面一行,如果可用就不需要了,不工作时再加上;后面有解释 
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'> 
</script> <script type="text/javascript"> 
$.ajax({
     url: "https://apis.google.com/js/plusone.js",
     type: "GET",
     dataType: "script",
     // 下一行设置的是超时时间 500ms,如果觉得不够可以增大
     timeout: 500 }) 
</script>

// 前面是有问题的代码,修改后的代码从这里开始
// 使用时可删除下面一行,如果可用就不需要了,不工作时再加上;也就是说,如果前面已经加载了 jquery.min.js 就不要再次加载 —— 脚注 1
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script> 
<script type="text/javascript">
window.___gcfg = { lang: 'zh-CN' };
( function( $ ) {
	$( document ).ready( function() {
		if ( $( 'body' ).length ) {
			$.ajax( {
				type: 'GET',
				url: 'https://apis.google.com/js/plusone.js',
                                // 下一行设置的是超时时间 500ms,如果觉得不够可以增大
				timeout: 500,
				dataType: 'script',
				cache: true
			} );
		};
	} );
} )( jQuery );
</script>

即可。

在上面的代码,

cache: true

后面还可以增加下面的内容,

success:
	function() {  },
error:
	function() {
		$( 'div.g-plusone' ).hide();
		$( 'div.g-plus' ).parent().hide();
	}

想来大家看看上面的代码就知道什么意思了:如果成功了,什么都不做;如果失败(没有加载到 plusone.js)就将相应的代码框隐藏起来。

其实这一部分没多大用啦,除非有人自己弄了个框框给+1按钮装了起来。

庆幸的是,最近好像可以畅快的访问很多东西了,包括+1按钮。甚至在校园网里面都可以。

2. 存在的问题

虽然勉强实现了需要的效果,可是目前还存在一些问题需要解决。列举如下,希望有高手可以帮忙。

  • 我将上述代码放到了页面最靠后的位置,前面已经有别的代码需要用到 jquery.min.js 并且已经加载了,可是到这里的时候却不管用,所以只好又加载一次;
  • 因为第二次加载 jquery.min.js 代码,导致前面用到的 lazyload 停止工作;
  • 希望可以不用 jQuery.ajax 方法,只纯粹用 javascript 实现,可是不知道怎么弄。

3. 更新¶updates

当日 —— 好了,前面存在的问题中的前两个问题已经解决,参考了 github:gist 上的一段代码。问题是我使用的 jQuery 代码段不够规范。唉,又因为 GFW 折腾了一天的时间。

脚注 1:

如果在 WordPress 中使用此代码段,也可以通过在(一般位于主题的 footer.php 文件中)

<?php wp_footer(); ?>

一行的前面增加

<?php wp_enqueue_script( 'jquery' ); ?>

来实现自动判断加载 jquery.js 或者是 jquery.min.js,且是最新版本。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/load-plusone_js-with-jquery/>。转载请保留此信息及相应链接。

4 条关于 “使用 jQuery 加载 plusone.js” 的评论

    • 如果某台机器不能从 Google 服务器获取 plusone.js,即使在本地给它提供 plusone.js,它也是看不到 +1 按钮的,因为 plusone.js 需要与服务器通信。我是这么理解的啊,所以就这么做了。
      虽然将 plusone.js 放在本地服务器上可以避免获取该文件超时的问题,可是经常更新 plusone.js 也挺烦人的。
      不过你说的方法也不失为一个捷径。

  1. plusone.js确实会再跟服务器通讯,加载apis.google.com域名下的一些东西,所以就算把这个js放到自己服务器上也没用,亲测结果。

    • 嗯,不过当前的环境下,网站上加任何Google的东西都是麻烦。让人郁闷至极。

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)