1

我有一个 silverlight 用户控件,其中有一个文本框和一个按钮。此 silverlight 页面中可以有多个这些用户控件。

单击按钮时,我想启动一个调用 jquery 弹出窗口的 javascript 函数,以通过 iframe 在同一应用程序中打开另一个页面。在该页面中,用户进行搜索,数据需要一直传递到 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 需要进行某种翻译。

经过一番研究,我找到了一个名为SilverQuery的东西,它“通过 Silverlight 运行时和 jQuery JavaScript 库的托管代码桥将 jQuery 的强大功能和表现力与 .NET 的生产力相结合。”

不幸的是,我无法继续这样做,因为我无法在这台计算机上运行测试,也找不到 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

我想给自己一个“Pat”来解决这个问题。我所做的是 - 我在上面调用了相同的过程来启动弹出框,但是当 setSearchWord 函数(在 popupbox 中调用来设置 id 的函数)时,我在 silverlight 托管代码中创建了一个方法,该方法暴露给 javascript 并在我传递的地方调用该方法变量并设置 silverlight 文本框。

希望这是有道理的。基本上,我在托管代码中创建了另一个方法,并通过用 [ScriptableMember] 装饰它来将其暴露给 javascript。这使我可以从 javascript 调用此方法。问题解决了!!

感谢 Beetroot 和 Omar 的意见和建议,这些意见和建议让我继续前进。

于 2013-04-11T06:18:18.553 回答
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 回答