在我们的一个本地化页面上通过addthis实现google + one按钮,其中以下数据是从后端(假设数据库)检索的,面临一个奇怪的问题,plus按钮没有加载。我们基于ajax的部分回发
以下html仅在部分回发期间添加到页面
<div class="addthis_toolbox addthis_default_style" style="float:right;">
<a class="addthis_button_google_plusone" g:plusone:size="small"></a>
</div>
同时,脚本通过
包含ScriptManager.RegisterStartupScript(Page, typeof(string),
"RegisterHTMLScript" + scriptID,
scriptstring,
false);
scriptstring的值为
<script type="text/javascript">
var addthis_config = {"data_track_clickback":true};
if (window.addthis) {
addthis.toolbox('.addthis_toolbox');
addthis.init();
}
else {
$.getScript('http://s7.addthis.com/js/250/addthis_widget.js#username=XXXXX&domready=1');
$.getScript('https://apis.google.com/js/plusone.js');
}
</script>
我无法看到任何客户端错误,但同时+1按钮不可见。会出什么问题呢?
而不是RegisterStartupScript,我尝试了1. 以编程方式将ScriptReference添加到当前脚本管理器中。2.
使用RegisterClientScriptInclude方法。但结果几乎相同。
开始了,
在部分回发期间,ASP。. NET AJAX需要知道要下载的依赖脚本列表,以便在下载完所有脚本后宣布"DOCUMENT IS READY"。在ASP。添加"notifyscriptloaded"是ASP. NET 3.5及以下版本的唯一方法。. NET知道一个依赖的脚本资源必须被加载-在部分回发期间。
当你用notifyscriptloaded注册一个脚本时,. NET等待直到脚本被下载,并确保只有在下载后才调用document ready。这样可以确保脚本的文档准备按预期启动。注意:ASP。. NET 4.0不需要这个(但是我不确定它是如何完成的)。
所以现在的问题很清楚了。当使用外部第三方javascript文件作为参考时,ASP。NET限制我们只能从静态页头(或母版页)引用它。在部分回发期间没有办法下载脚本-除非您对第三方脚本进行控制并在其中添加"notifyscriptloaded"。
解决方案,我不得不使这个外部第三方脚本在页头中的静态引用。这并没有伤害到我,因为我在多个页面上都有几个+1按钮的实例。