javascript - Uservoice Javascript 小部件 - 如何在页面加载时自动弹出反馈表单

标签 javascript dom-events uservoice

在 HTML 页面中,我如何知道何时定义了外部加载的 Javascript 对象并准备好在其上调用方法?
问题具体:
我正在使用 uservoice反馈 Web 应用程序,包括他们的 Javascript 小部件和他们的 SSO(单点登录)选项。
一切正常。窗口左侧有一个突出的反馈选项卡。我可以使用以下 anchor 获取其他链接以打开其弹出式反馈小部件:

<a href="#" onclick="UserVoice.Popin.show(uservoiceOptions); return false;">feedback</a>
但是......我在尝试支持额外的工作流程时遇到了麻烦 - 在一个特定页面(例如反馈页面)上,我希望用户语音反馈表单在用户进入页面时自动弹出,而无需通过点击事件启动。
我尝试将以下内容放在页面底部:
<script type="text/javascript">
function _autoPopupUserVoice() {
  UserVoice.Popin.show(uservoiceOptions);
}
_loadSuper = window.onload;
window.onload = (typeof window.onload != 'function') ? _autoPopupUserVoice : function() { _loadSuper(); _autoPopupUserVoice(); };
</script>
但 Firebug 显示错误:

"UserVoice is not defined".


所以我猜到时间 _autoPopupUserVoice() 还没有执行 uservoice Javascript叫做。
我已经尝试了一些其他的东西,但还没有设法让它工作。怎么知道什么时候Uservoice Javascript 对象已加载并准备好对其调用方法?
作为引用,Uservoice 对象通过页面末尾的以下 Javascript 加载:
<script type="text/javascript">
function _loadUserVoice() {
  var s = document.createElement('script');
  s.setAttribute('type', 'text/javascript');
  s.setAttribute('src', ("https:" == document.location.protocol ? "https://" : "http://") + "cdn.uservoice.com/javascripts/widgets/tab.js");
  document.getElementsByTagName('head')[0].appendChild(s);
}
_loadSuper = window.onload;
window.onload = (typeof window.onload != 'function') ? _loadUserVoice : function() { _loadSuper(); _loadUserVoice(); };

最佳答案

我想出了以下 javascript,我把它放在页面底部的 Uservoice 小部件代码下。它每 100 毫秒循环一次并测试是否定义了 Uservoice 对象。一旦它被定义,它就会调用 Popin弹出小部件的方法:

<script type="text/javascript">

// Show the Uservoice feedback widget
function _autoPopupUserVoice() {
    UserVoice.Popin.show(uservoiceOptions);
}

// Wait for the uservoice JS object to load, fire _autoPopupUserVoice when it is finished.
if ((typeof window['UserVoice'] == 'undefined')) {

    var timer = setInterval(function () {
        ok = false;
        try { ok = (typeof window['UserVoice'] != 'undefined');} catch (e) {}

        if (ok) {
            clearInterval(timer);
            _autoPopupUserVoice();
        }
    }, 100);
}
</script>

我相信有更好的方法来做到这一点。也许甚至有一个我不知道的回调函数?

更新(8/Dec/09):
这个方法是 - 由 Uservoice 批准:

Thanks for contacting UserVoice support. That method looks perfectly reasonable. We don't have any in built methods for doing this (currently, we are looking at this type of functionality) but the code described even though quite hacky, should do the trick.

关于javascript - Uservoice Javascript 小部件 - 如何在页面加载时自动弹出反馈表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1860501/

相关文章:

javascript - Google 标签管理器中的自定义 Javascript 宏 : Determining Which Button Was Clicked

javascript - event.preventDefault() 在 contenteditable div 中似乎对我不起作用

javascript - Chrome 丰富通知 - 如何使用

web - 如何为每个子域创建站点实例

javascript - jQuery.load();并不总是用图像射击

javascript - 使用 Webpack 的 Rails

javascript - 使用 ajax 传递 # 值不起作用

javascript - 当 Selenium 中自动下拉菜单时,无法触发 Angular ng-change 功能

android - 多个dex文件定义了Lcom/google/gdata/util/common/base/Escaper