我没有发现类似的问题 - 我在搜索引擎优化和谷歌上广泛搜索过这个主题,但找不到答案。
这是我的难题:
DIV
,并添加了'列表&# 39;类表到表格的主体,以及表格主体的相应类别' td'元素 - 我想要搜索的一列。 不管我是否把
var options = {
valueNames: ["searchterm"]
};
var eventsList = new List("events", options);
在manifest.js中指定的预注入代码中,或者在点击扩展程序图标时运行的其他脚本中,我在Chrome控制台中收到相同的错误:
'Uncaught ReferenceError: List is not defined'
更新:代码如下。
我怎样才能使该表可搜索?我做错了什么,应该在什么之前注入或写出?
代码如下:
HTML:
<html>
<head>
<meta http-equiv = "Content-Type" content = "text/html; charset = utf-8">
</head>
<body>
<title> a title</title>
<table>a table</table>
<table>
<thead>
<tr>
<th>someContent</th>
/*14 <th> elements corresponding to 14 columns, the last one being: */
<th>contentIWantToSearch</th>
</tr>
</thead>
<tbody>
<tr id = "some ID" class = "someClass" style = "someStyle">
/*14 <td> elements, with the last one being:*/
<td> the actual content I want to filter the table after</td>
</tr>
/*next, a long list of <tr>s, same structure, part of the table */
</tbody>
<tfoot>
/*one <tr>, 11 <td> */
</tfoot>
</table>
</body>
Chrome扩展清单(Manifest.JSON)
[...]
"permissions": [
"URL I want it to inject the script automatically",
"declarativeContent"
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_scripts": [
{
"matches": ["URL I want to run it on*"],
"js": ["includedstuff.js"],
"css": ["list.css", "someothercss"]
}
[... rest of manifest.json
/*appending the list.js CDN on page load*/
var head = document.getElementsByTagName("head")[0];
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://cdnjs.cloudflare.com/ajax/libs/list.js/1.1.1/list.min.js";
head.appendChild(script);
/*creating the required list.js classes, only for pages with the structure mentioned above - I cannot match it perfectly based on URL*/
if(document.getElementsByTagName("table").length >1) {
var fulltable = document.getElementsByTagName("table")[1];
var searchboxelem = document.createElement("input");
var events = document.createElement("div");
events.id = "events";
searchboxelem.setAttribute("class", "search");
searchboxelem.setAttribute("placeholder", "Input Search Term");
events.appendChild(searchboxelem);
events.appendChild(fulltable.cloneNode(true));
fulltable.parentNode.replaceChild(events, fulltable);
var defineachrow = document.getElementsByTagName("table")[1].getElementsByTagName("tbody")[0].getElementsByTagName("tr");
document.getElementsByTagName("table")[1].getElementsByTagName("tbody")[0].setAttribute("class", "list");
for(x=0; x<defineachrow.length; x++) {
defineachrow[x].getElementsByTagName("td")[13].setAttribute("class", "searchterm");
}
}
content_script.js:
/*some script with XHR loop requests - and sadly sync, as I could not get around it to make it async, it works however, and then:*/
var options = {
valueNames:["searchterm"]
};
var eventsList = new List("events", options);
chrome.browserAction.onCLicked.addListener(
function(tab) {
chrome.tabs.executeScript(null, {file:
"content_script.js"});
});
答案 0 :(得分:1)
您需要掌握isolated world:
的概念内容脚本在称为孤立世界的特殊环境中执行。他们可以访问注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。它将每个内容脚本视为在其运行的页面上没有执行其他JavaScript。反过来也是如此:页面上运行的JavaScript无法调用任何函数或访问内容脚本定义的任何变量。
首次注入includedstuff.js
时,会为文档创建一个单独的JS上下文并在其中执行。
但是,当您插入<script>
标记时,它会在页面的上下文中执行代码。因此,所有List
内容只对页面本身可见。
当您content_script
执行时,它会在与includedstuff.js
相同的上下文中执行,但不包括List
。
故事的故事:你真的需要向页面公开List
吗?可能不是 - 你添加它,因此你是使用它的人。
从CDN加载它没有任何优势 - 实际上,您正在请求特定版本,因此它不会发生变化。它还增加了另一个网络请求。你不需要那个。
相反,请在您的扩展程序文件中加入list.min.js
,然后修改清单:
"content_scripts": [
{
"matches": ["http://example.com/*"],
"js": ["list.min.js", "includedstuff.js"],
"css": ["list.css", /*...*/]
}
这将在您的代码执行的上下文中加载List
;它对页面本身是不可见的,但它不会影响你的代码。