我有一个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');
}
答案 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的意见和建议让我顺利。