3

HTML ページで、外部からロードされた Javascript オブジェクトが定義され、メソッドを呼び出す準備が整ったことをどのように知ることができますか?

問題の詳細:

Javascript ウィジェットと SSO ( Single-SignOn ) オプションを含むuservoiceフィードバック Web アプリケーションを使用しています。

すべて正常に動作します。ウィンドウの左側に目立つ [フィードバック] タブがあります。また、追加のリンクに次のアンカーを使用して、ポップアップ フィードバック ウィジェットを開くことができます。

<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が定義されていません".

したがって、呼び出されるまでにuservoice Javascriptが実行されていないと思い_autoPopupUserVoice()ます。

私は他のいくつかのことを試しましたが、それを機能させることができませんでした。UservoiceJavascript オブジェクトがロードされ、メソッドを呼び出す準備が整ったことをどのように知ることができますか?

参考までに、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(); };
4

2 に答える 2

3

ページの下部にあるUservoiceウィジェットコードの下に次のJavaScriptを作成しました。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>

これを行うためのより良い方法があると確信しています。おそらく、私が知らないコールバック関数さえありますか?

更新(2009年12月8日): このメソッドはUservoiceによって半承認されています:

UserVoiceサポートにお問い合わせいただきありがとうございます。その方法は完全に合理的に見えます。これを行うための組み込みメソッドはありませんが(現在、このタイプの機能を検討しています)、説明されているコードはかなりハッキーですが、うまくいくはずです。

于 2009-12-08T14:32:47.763 に答える