在 AppBrowser 中以编程方式更改 selectMenu 选项
Change selectMenu option programmatically in child inAppBrowser
我用javascriptwindow.open()
打开一个window
打开的window有以下代码:
jQuery(document).ready(function(){
jQuery("#lang").change(function(){
var lname = jQuery(this).val().split("-");
window.location = '<?php echo JURI::root();?>index.php?lang='+lname[0];
alert(lname[0]);
alert('lang '+lang);
});
现在,此代码会在 'lang' select 菜单更改时触发。我使用 window.open
以编程方式打开 window,并设法使用 Window.executeScript()
将数据填充到 window 字段中。例如,这对我有用:
loginWindow.executeScript({
code: "jQuery('input#username').val('10500050')"
});
但是,当我尝试按照相同的逻辑更改 select 菜单中名为 'lang' 的 selected 项时,我失败了。
尝试次数
我在 executeScript
;
中尝试了以下所有行
code: "$('#lang').val('ms')"
code: "jQuery('#lang option[value=ms]').prop('selected', true)"
code: "jQuery('#lang').selectmenu('value', 'ms')"
在接下来的executeScript
中使用这些来触发更改
code: "$('#lang').trigger('change')"
code: "$('#lang').selectmenu('refresh', true)"
code: "jQuery('#lang').selectmenu('refresh')"
code: "jQuery('#lang').selectmenu('change')"
code: "$('#lang').change()"
None 其中有帮助。我不确定是否应该将它们合二为一 executeScript
。我不知道如何去做。打开的 window 来自不同的域。
我是不是漏掉了什么?
opener端的全部代码如下:
loginWindow.addEventListener( 'loadstop', function() {
alert('test');
var loop = setInterval(function() {
loginWindow.executeScript({
code: "jQuery('input#username').val('10500050')"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
loginWindow.executeScript({
code: " jQuery('input#name').val('10500050')"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
loginWindow.executeScript({
//code: "$('#lang').val('zh')"
//code: "jQuery('#lang option[value=ms]').prop('selected', true)"
code: "jQuery('#lang').selectmenu('value', 'ms')"
//code: "localStorage.setItem( 'lan', 'ms' )"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
loginWindow.executeScript({
//code: "$('#lang').trigger('change')"
//code: "$('#lang').selectmenu('refresh', true)"
//code: "jQuery('#lang').selectmenu('refresh')"
//code: "jQuery('#lang').selectmenu('change')"
code: "$('#lang').change()"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
});
});
前两个 executeScript
工作正常。但是最后两个(select菜单部分)不起作用。什么都没有发生。
更新
将此代码添加到 window 本身时,它起作用并且 select 框值被更改:
jQuery("#lang option[value='zh-TW']").attr("selected","selected");
jQuery('#lang').change();
但是,当我在父 window(opener)的 executeScript
中添加它时,它不起作用!
当我将代码直接粘贴到 jQuery(document).ready(function()
内的子 window 中时代码有效,我假设它应该使用 executeScript
从父 window 开始工作。经过多次反复试验,以下代码对我有用:
loginWindow.executeScript(
{
code: "jQuery('#lang option[value=zh-TW]').attr('selected','selected'), jQuery('#lang').change()"
});
这与我在问题的 "Update" 部分中提到的代码相同,除了单引号和双引号的区别。这里使用 executeScript
,我不得不操纵使用双引号来包围整个注入的代码,其余的我使用单引号。
上面的代码,使用父 window 中的 executeScript
方法更改子 window 中 select 框中的选项 selected(开启者)。
我用javascriptwindow.open()
打开的window有以下代码:
jQuery(document).ready(function(){
jQuery("#lang").change(function(){
var lname = jQuery(this).val().split("-");
window.location = '<?php echo JURI::root();?>index.php?lang='+lname[0];
alert(lname[0]);
alert('lang '+lang);
});
现在,此代码会在 'lang' select 菜单更改时触发。我使用 window.open
以编程方式打开 window,并设法使用 Window.executeScript()
将数据填充到 window 字段中。例如,这对我有用:
loginWindow.executeScript({
code: "jQuery('input#username').val('10500050')"
});
但是,当我尝试按照相同的逻辑更改 select 菜单中名为 'lang' 的 selected 项时,我失败了。
尝试次数
我在 executeScript
;
code: "$('#lang').val('ms')"
code: "jQuery('#lang option[value=ms]').prop('selected', true)"
code: "jQuery('#lang').selectmenu('value', 'ms')"
在接下来的executeScript
中使用这些来触发更改
code: "$('#lang').trigger('change')"
code: "$('#lang').selectmenu('refresh', true)"
code: "jQuery('#lang').selectmenu('refresh')"
code: "jQuery('#lang').selectmenu('change')"
code: "$('#lang').change()"
None 其中有帮助。我不确定是否应该将它们合二为一 executeScript
。我不知道如何去做。打开的 window 来自不同的域。
我是不是漏掉了什么?
opener端的全部代码如下:
loginWindow.addEventListener( 'loadstop', function() {
alert('test');
var loop = setInterval(function() {
loginWindow.executeScript({
code: "jQuery('input#username').val('10500050')"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
loginWindow.executeScript({
code: " jQuery('input#name').val('10500050')"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
loginWindow.executeScript({
//code: "$('#lang').val('zh')"
//code: "jQuery('#lang option[value=ms]').prop('selected', true)"
code: "jQuery('#lang').selectmenu('value', 'ms')"
//code: "localStorage.setItem( 'lan', 'ms' )"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
loginWindow.executeScript({
//code: "$('#lang').trigger('change')"
//code: "$('#lang').selectmenu('refresh', true)"
//code: "jQuery('#lang').selectmenu('refresh')"
//code: "jQuery('#lang').selectmenu('change')"
code: "$('#lang').change()"
},
function( values ) {
var give = values[ 0 ];
if ( give ) {
clearInterval( loop );
giveMeUsername();
}
});
});
});
前两个 executeScript
工作正常。但是最后两个(select菜单部分)不起作用。什么都没有发生。
更新
将此代码添加到 window 本身时,它起作用并且 select 框值被更改:
jQuery("#lang option[value='zh-TW']").attr("selected","selected");
jQuery('#lang').change();
但是,当我在父 window(opener)的 executeScript
中添加它时,它不起作用!
当我将代码直接粘贴到 jQuery(document).ready(function()
内的子 window 中时代码有效,我假设它应该使用 executeScript
从父 window 开始工作。经过多次反复试验,以下代码对我有用:
loginWindow.executeScript(
{
code: "jQuery('#lang option[value=zh-TW]').attr('selected','selected'), jQuery('#lang').change()"
});
这与我在问题的 "Update" 部分中提到的代码相同,除了单引号和双引号的区别。这里使用 executeScript
,我不得不操纵使用双引号来包围整个注入的代码,其余的我使用单引号。
上面的代码,使用父 window 中的 executeScript
方法更改子 window 中 select 框中的选项 selected(开启者)。