将一个位复杂的javascript函数返回给silverlight用户控件

时间:2013-04-09 18:19:53

标签: javascript jquery silverlight callback deferred

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

当点击按钮时,我想启动一个调用jquery popup的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 个答案:

答案 0 :(得分: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')
        }
    });

答案 1 :(得分:0)

鲍勃索夫,我可以给你一个可能的前进方向但不比我害怕更好:

由于它不能直接返回值,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环境)。承诺将需要进行某种翻译。

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

不幸的是,由于我无法在此计算机上运行测试而无法找到Silverquery将桥接jQuery的Deferreds / Promises的证据,因此我无法继续这样做。这些可能是在SilverQuery编写之后引入的(SilverQuery下载的日期是2009年9月,当时jQuery大约是1.3或1.4 IIRC并且还没有包含$ .Deferred API)。

也许其他人知道SilverQuery是否可行,或者更好,更简单的方法。

答案 2 :(得分:0)

JS弹出功能都是异步的。他们不会等待。实际上没有办法让JS等待弹出窗口关闭。

现在你可以用另一种方式达到相同的效果。我假设您要阻止该线程,因为您不想让用户在父页面上执行任何操作?为什么不禁用父页面上的所有内容,直到弹出窗口关闭?您可以在弹出窗口正下方的整个页面上创建一个浮动DIV,它将拦截所有鼠标事件并且不执行任何操作。

答案 3 :(得分:0)

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

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

感谢Beetroot和Omar的意见和建议让我顺利。