单击动态创建的选择,使用Javascript/jQuery选择其他动态内容
Click a dynamically created select to select other dynamic content using Javascript/jQuery
你好,我玩得很开心。
我目前正在为我工作的一个附带项目开发一个小型Chrome扩展。扩展只是将一个div附加到页面的右侧,并为用户提供带有输入的"快速链接"。不要试图点击树菜单,而是选择正确的选项,然后更改文本区域。我在我的扩展上有按钮,他们可以在那里设置值并单击应用。现在的情况是,我们有一个web应用程序,它有一堆动态加载的<select>
。有一个包含链接的树菜单。当树菜单中的一个项目被选中时,它将动态加载更多包含<select>
的div。
我想做的是通过程序更改所选选项,该选项将关闭web应用程序处理的另一个事件,以调用一些动态内容。
选择将转到正确的值,但web应用程序没有将其注册为任何更改。
***已编辑***以下是该页面的外观示例:https://jsfiddle.net/tpkn92o8/6
编辑下方
web应用程序的工作方式是(以下逻辑被烘焙到web应用程序中,我对此无法控制):
- 选择树菜单中的项目。这将ping home并将一些内容动态加载到蓝色select中
- 由于蓝色选择被更改,这将触发
change
事件和绿色选择动态加载 - 由于绿色选择再次触发
change
事件,它将动态更新文本区域值
我想做的是,一旦加载了所有内容,我希望能够更改绿色选择的值,这将使web应用程序触发更改并更新文本区域,即
$("#dynamic-content-2 select").val('some new value').change()
会给我们
<textarea value="some new value"></textarea>
但不幸的是,选择会被更改,但不会触发文本区域更新
第二次编辑
var updatedVal = 'a new value I get from an array';
window.addEventListener ("load", setupEventHandlers, false);
function setupEventHandlers(){
var jsInitChecktimer = setInterval (checkForJS_Finish, 111);
function checkForJS_Finish () {
// the select I want to manipulate gets loaded when the radio is checked and a different select has a certain value
if ( document.querySelector("#myRadio:checked") && $("#parentSelect").val() == "100" ) {
clearInterval (jsInitChecktimer);
console.log('loaded');
$("#changeSelect_Button").on("click", function () {
$("#mySelect").val(updatedVal).change();
});
}
}
}
您应该为option
元素的value
属性赋值。所以改变:
<option val='load-something-1'>Option 2.1</option>
至:
<option value='load-something-1'>Option 2.1</option>
或者,如果您需要自定义val
属性,那么也可以添加value
属性。
其次,您尝试了以下代码:
$("#dynamic-content-2").val('some new value').change();
但是这改变了CCD_ 11的值。看着你的小提琴,你应该给select
(这个div
的子项)一个值,如下所示:
$("#dynamic-content-2>select").val('some new value').change();
并且您作为参数给出的值应该对应于option
标记的value
属性值之一。
如果你的网络应用程序监听select的change
事件,它就会工作。
以下是一些受小提琴启发的HTML
代码:
<div id="dynamic-content-2" class='fifty'>
<select size="3">
<option value='load-something-1'>Option 2.1</option>
<option value='load-something-2'>Option 2.2</option>
<option value='load-something-3'>Option 2.3</option>
</select>
</div>
以及一些演示工作原理的JavaScript
:
// Mimic the web-app, about which we have no information:
$('#dynamic-content-2>select').change(function (e) {
$("textarea").val('Option ' + (this.selectedIndex+1) + ' was selected.');
});
// On page load, select the second option and trigger the change event
$(function () {
$('#dynamic-content-2>select').val('load-something-2').change();
});
解决方案
由于Chrome扩展是在沙盒环境中运行的,因此在尝试与DOM中的对象交互时,它的结果不可靠。我需要做的是向包含我的change()
事件的页面中注入一个脚本。
以下是我在content_script.js由扩展名加载时运行的代码
var injectedCode =
'function changeSelect(newVal) { '+
'$("#pageSelect").val(newVal).change();'+
'}';
var script = document.createElement('script');
script.appendChild(document.createTextNode( injectedCode ));
(document.body || document.head || document.documentElement).appendChild(script);
这是我点击按钮时注入的代码:
$("#buttonInExtensionDiv").click(function(){
function injectCode(code){
var newScript = document.createElement('script');
newScript.appendChild(document.createTextNode( code ));
(document.body || document.head || document.documentElement).appendChild(newScript);
}
});
上面的脚本归功于另一个StackOverflow用户。我找不到链接。我只是把它分离成一个函数,以便在没有混乱的情况下重用它
示例
例如,我的扩展有一个div,它通过包含按钮的content_script.js注入到页面上。当点击该按钮时,我希望它能更改(由网络应用程序)动态添加到页面中的选择。由于扩展是沙盒式的,它没有正确地启动更改事件。
注意事项
在我的扩展中,按钮被绑定到一个点击处理程序,该处理程序将调用:injectCode('updateSelect()');
。
每次我点击该按钮,扩展就会附加
<script>injectCode('updateSelect()');</script>
到DOM的末尾,这增加了混乱。
- d3基于用户选择动态更新节点
- JQuery--无法选择动态附加到表中的对象
- 如何根据用户选择动态更改多个复选框的编号
- JavaScript确认何时在表单中选择动态HTML字段
- 使用JQuery通过下拉选择动态更改PHP值
- 使用用户选择动态更新页面
- 在jquery中选择动态创建的元素
- 选择动态添加表单的元素
- 根据<选择>动态创建的表单不起作用
- j查询选择动态添加的表行的列数据
- Dojo 筛选选择 - 动态将下拉列表中的特定选项标记为禁用(灰显且不可选择)
- 选择动态创建的 html 元素而不单击
- 如何运行函数以选择动态添加
- Jquery 选择动态 ID
- 使用 Knockoutjs 根据用户的语言选择动态调整页面内容
- jQuery 选择动态创建的 html 元素
- 如何在JQuery中从Gallery View中选择动态图像
- 如何从AngularJS指令中选择动态生成的元素
- 选择动态创建的表中高亮显示的行,onclick事件
- 按类名选择动态更改的元素