1

テキスト ボックスとボタンがある Silverlight ユーザー コントロールがあります。この Silverlight ページ内には、これらのユーザー コントロールが複数存在する可能性があります。

ボタンをクリックすると、jquery popup を呼び出して iframe 経由で同じアプリケーション内の別のページを開く JavaScript 関数を起動したいと考えています。そのページでは、ユーザーが検索を行い、データを Silverlight ユーザー コントロールに渡す必要があり、テキスト ボックスにデータを入力する必要があります。

Silverlight 内で HtmlPage Invoke メソッドを使用すると、javascript 関数を呼び出すことができます。この JavaScript 内で、jquery モバイル ポップアップも呼び出すことができます。ただし、その関数から検索ワードを返すことはできません。以下の関数は、空の文字列をすぐに返します。setTimeout と defer メソッドを使用しましたが、まだ成功していません。ポップアップ ウィンドウで、ユーザーが単語の検索を終了してウィンドウを閉じると、そのポップアップ関数は setSearchWord() という親関数を呼び出します。この関数は、searchWord 変数を設定するこのページにあります。

var searchWord = '';

function calljquerymobilePopUp(){
$("$popupWin").popup('open'); 
  //what should I do here such that I can make sure 'searchWord' 
  //variable is not empty and return it to silverlight user control.
   return searchWord;
}

function setSearchWord(val){
  searchWord = val;     
  // I always get this value but its always too late. 
  // In silverlight user control, I end up getting empty string
  console.log(searchWord);

  $("$popupWin").popup('close'); 
}
4

4 に答える 4

0

Bobsov、私はあなたに可能な方法を与えることができますが、残念ながらそれ以上のものはありません:

値を直接返すことができないためopenPopUp、解決時に必要な値を生成する Promise を返す必要があります。javascript/jQuery の場合、これは非常に簡単ですが、ページ/iFrame アーキテクチャのためにグローバル変数/関数が関係します。

コードは次のようになります (グローバル名前空間内):

var searchDfrd;

function openPopUp() {
    $("$popupWin").popup('open');
    searchDfrd = $.Deferred().done(function(val) {
        console.log(val);
    });
    return searchDfrd.promise();
}

function setSearchWord(val) {
    searchDfrd.resolve(val);
    $("$popupWin").popup('close');
}

ここで問題が発生します... openPopUp()javascript ではなく、Silverlight に戻りますHtmlPage.Invoke

Silverlight についての詳しい知識がなければ、Silverlight は jQuery Promise を直接処理できない (これは JavaScript 環境ではありません) と自信を持って言えます。Promise は何らかの翻訳を受ける必要があります。

少し調べた結果、「Silverlight ランタイムと jQuery JavaScript ライブラリによるマネージ コード ブリッジを介して、jQuery のパワーと表現力と .NET の生産性を組み合わせた」SilverQueryと呼ばれるものにたどり着きました。

残念ながら、このコンピューターでテストを実行できず、Silverquery が jQuery の Deferreds/Promises をブリッジするという証拠を見つけることができないため、これ以上進めることはできません。これらは、SilverQuery が作成された後に導入された可能性があります (SilverQuery のダウンロードの日付は 2009 年 9 月で、jQuery は約 1.3 または 1.4 IIRC で、まだ $.Deferred API が含まれていませんでした)。

おそらく、SilverQuery が実行可能かどうか、またはより単純なアプローチの方が優れているかどうかは、他の誰かが知っているでしょう。

于 2013-04-10T08:54:31.203 に答える
0

JS ポップアップ関数はすべて非同期です。彼らは待ちません。ポップアップ ウィンドウが閉じられるまで JS を待機させる方法はありません。

これで、別の方法で同じ結果を得ることができます。親ページでユーザーに何もさせたくないので、スレッドをブロックしたいと思いますか? ポップアップ ウィンドウが閉じられるまで、親ページのすべてを無効にしてみませんか? すべてのマウス イベントをインターセプトして何もしない、ポップアップのすぐ下のページ全体にフローティング DIV を作成できます。

于 2013-04-10T19:33:34.943 に答える
0
$(document).on('tap', '.btnSelectWord', function(){
        if( typeof parent.setSearchWord === 'function'){
            parent.setSearchWord(selectedPointId)
        }else if (typeof window.opener.setSearchWord == 'function'){
            window.opener.setSearchWord(selectedPointId);
        }
        else {
            console.log('No function')
            alert('No callback in parent')
        }
    });
于 2013-04-10T03:38:16.657 に答える
0

この問題を解決するために、自分自身に「パット」を与えたいと思います。私がしたことは - ポップアップ ボックスを起動するために上記と同じプロセスを呼び出しましたが、setSearchWord 関数 (popupbox 内で ID を設定するために呼び出された関数) のときに、javascript に公開される Silverlight マネージ コードでメソッドを作成し、そのメソッドを渡している場所で呼び出しました。変数と Silverlight テキストボックスの設定。

これが理にかなっていることを願っています。基本的には、マネージ コード内に別のメソッドを作成し、[ScriptableMember] で装飾して JavaScript に公開しました。これにより、javascript からこのメソッドを呼び出すことができました。問題が解決しました!!

Beetroot と Omar のコメントと提案に感謝します。

于 2013-04-11T06:18:18.553 に答える