在内容脚本中使用jQuery获取DOM对象失败
Getting DOM object fails with jQuery in content script
我在谷歌页面上有一个按钮。DOM Inspector给出它的id。然而,试图获得该对象失败。我得到一个未定义的结果,而试图在控制台中写入它的类名。页面中只有一个iframe,而我的对象不在其中(据我所知)。
manifest.json:
{
"manifest_version": 2,
"name": "modify strings",
"description": "modify strings in bulk",
"version": "1.0",
"permissions": [
"tabs",
"history",
"http://*/*",
"https://*/*"
],
"content_scripts": [
{
"matches": ["https://play.google.com/apps/*"],
"js": ["jquery-1.11.1.min.js", "myInject.js"],
"all_frames": true
}
],
"web_accessible_resources": [
"script.js",
"jquery-1.11.1.min.js"
],
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
}
}
myInject.js(内容脚本):
var buttonJGET = jQuery("gwt-uid-115", document);
console.log(buttonJGET.className);
jQuery使用类css的选择器。
要按id选择元素,需要使用#。此外,jQuery总是返回一个数组的结果,即使它是唯一的。
var buttonJGET = jQuery("#gwt-uid-115")[0];
jQuery元素不同于DOM元素;它们没有className
属性。要获得它,可以使用,例如:
console.log(buttonJGET.attr('class'));
还有其他处理元素类的函数。
否则,您可以从jQuery元素中提取一个DOM元素:
var buttonJGET = jQuery("#gwt-uid-115").get(0);
console.log(buttonJGET.className);
如果代码仍然失败,这可能是因为在脚本运行的那一刻,还没有具有该id的元素。要实现"每次添加这样的元素时运行我的代码",可以使用DOM突变观察器(这里的规范答案):
// Runs a function for every added DOM element that matches a filter
// filter -- either function(DOM_node){/*...*/}, returns true or false
// OR a jQuery selector
// callback -- function(DOM_node){/*...*/}
function watchNodes(filter, callback){
var observer = new MutationObserver( function (mutations) {
mutations.forEach( function (mutation){
if(typeof filter === "function"){
$(mutation.addedNodes).filter(
function(i){ return filter(this); }
).each(
function(i){ callback(this); }
);
} else {
$(mutation.addedNodes).filter(filter).each(
function(i){ callback(this); }
);
}
});
});
// For every added element, a mutation will be processed
// with mutation.taget == parent
// and mutation.addedNodes containing the added element
observer.observe(document, { subtree: true, childList: true });
return observer;
}
使用(注意,过滤器和回调使用DOM元素):
function logger(node) {
console.log(node.className);
}
var observer = watchNodes("#gwt-uid-115", logger);
或者,例如,如果希望捕获id以gwt-uid
开头的所有节点,则可以编写自定义过滤器:
function filter(node) {
if(node.id && node.id.match(/^gwt-uid/)) return true;
else return false;
}
var observer2 = watchNodes(filter, logger);
在run_at: "document_start"
注入此将确保您将捕获添加的所有元素。
要停止观察,在返回的观察者对象上调用observer.disconnect()
。
相关文章:
- 在for循环中未获取JQuery/JavaScript对象值
- 点击获取jQuery上的href属性
- 如何获取jQuery Confirm(jConfirm)值并使用该值检查条件
- 通过传递的参数位置获取jQuery中图像的宽度
- MVC Syncfusion Grid-HTML EJ Grid-获取Jquery中所选行的主键
- 如何获取 jQuery 以触发本机自定义事件处理程序
- 如何获取 jQuery 回调触发返回值
- 如何在wordpress插件中获取jquery中的img url和文件url
- 我想知道如何只激活表单提交,而不获取jquery中ajax url的值
- 如何获取jQuery集合中的第k个元素..作为JQUERY元素
- 从aspx.cs页面获取jquery post中的Null响应而不是json
- 如何获取 jquery 变量 childeren
- 如何从每个对象获取jQuery的“title”和“url”值
- 如何动态获取jquery noConflict()的引用
- 用于获取jQuery元素或值的方法
- 获取jquery数组对象的第n项
- 获取jquery确认在函数中返回的结果
- 获取JQuery UI自动完成元素的索引
- 获取jQuery UI排序后的ID数组
- 获取 jQuery DataTable 中的元素