Javascript:点击后加载AddThis
很长一段时间以来,我一直对此感到困惑,无法让它发挥作用。 这是情况。 如果人们点击某些DIV,我想要一个社交媒体栏。 除非人们点击div,否则不应加载它。 对于社交媒体,我添加了这个,以及GOOGLE + 1图标。 但我无法通过这样的外部呼叫来加载它们。 这是到目前为止的代码:
Test $(function(){ $("#socialmedia").live('click',function(){ $("#loadhere").load('html-part.html'); $.getScript('js-part.js'); }); }); Show the Social Media
在HTML部分中,我有需要加载的HTML信息:
HTML-part.html:
这里的问题是addthis代码在dom ready
事件上触发。 使用jQuery加载它时,dom已经加载,因此代码不会被执行。 修复是使用addthis.init()
方法在加载代码后强制执行代码。 没有跨域问题或任何问题。
请注意,根据addthis文档,它应该可以通过像http://s7.addthis.com/js/250/addthis_widget.js#pubid=[PROFILE ID]&domready=1
那样通过小部件URL传递一个get变量。它对我不起作用。
我还建议你将html存储在一个字符串变量中,这样你就不必对一些静态html做不必要的请求。
在这里查看工作演示: http : //jsfiddle.net/z7zrK/3/
$("#socialmedia").click(function(){ var add_this_html = ''+ ''; $("#loadhere").html(add_this_html); $.getScript('http://s7.addthis.com/js/250/addthis_widget.js#pubid=xxx', function(){ addthis.init(); //callback function for script loading }); $.getScript('https://apis.google.com/js/plusone.js'); });
刚刚使用了amosrivera的答案(对你来说很大的吻)并遇到了另一个问题:
添加此对象只能加载一次,因此当您在同一页面上有多个addthis工具箱时,它可能只适用于第一个单击的工具箱。
解决方法是:
if (window.addthis){ window.addthis = null; }
在打电话之前
addthis.init();
这是我刚刚在文章长时间徘徊时开始加载按钮所做的事情:
HTML:
.....
JS:
// Only throw AJAX call if user hovered on article for more than 800ms // Then show the spinner while loading buttons in a hidden div // Then replace the spinner with the loaded buttons $(function() { var t; $("article").hover(function() { var that = this; window.clearTimeout(t); t = window.setTimeout(function () { sharing_div = $('.sharing', that); add_this_html = ''; if (sharing_div.find('.content div').length == 0) { sharing_div.find('.spinner').show(); sharing_div.find('.content').html(add_this_html); sharing_div.find('addthis_toolbox').attr({ 'addthis:url': $(that).attr('data-url'), 'addthis:title': $(that).attr('data-title'), 'addthis:description': $(that).attr('data-description'), }) if (window.addthis){ window.addthis = null; } // Forces addthis to reload $.getScript('http://s7.addthis.com/js/250/addthis_widget.js#pubid=xxx&async=1', function(){ addthis.init(); setTimeout(function() { sharing_div.find('.spinner').hide(); sharing_div.find('.content').show(); }, 2500); }); } }, 800); }); });
要回答你的官方问题,是的,我相信这是可能实现的。
但是,为了进一步详细说明,我相信您可能想要尝试使用的是外部脚本和外部标记的加载顺序。 我们在处理诸如此类的异步操作时发现的有趣情况是,除非您明确说明,否则它们并不总是按您希望的顺序完成,加载或执行。 jQuery允许您通过一些可以传递给getScript
和load
方法的回调来完成此getScript
。
其他域上的javascript文件也不应该存在“跨域”问题,尽管加载HTML时肯定存在问题。
我不确定这是否能完全解决你所遇到的问题,但肯定觉得这值得一试。 您可以尝试确保在脚本执行之前加载标记:
$(function(){ $("#socialmedia").live('click',function(){ $("#loadhere").load('html-part.html', function() { // this waits until the "html-part.html" has finished loading... $.getScript('js-part.js'); }); }); });
现在,我们还应该询问您如何构建“js-part.js”文件。 (您只显示了您想要的内容,而不是您构建的内容。)如果这是一个真正的JS文件,您不能只使用一些HTML
标记来加载其他JS文件。 (您可能希望继续在此文件中调用getScript
,或者使用其他几种方法之一来加载其他JS内容,例如手动将脚本元素附加到文档的头部,或使用其他库等...)
祝好运!