您好我正在开发chrome扩展程序,我正在使用ebay搜索API ... 以下是我的HTML代码:
<html>
<head>
<title>eBay Search Results</title>
<style type="text/css">body { font-family: arial,sans-serif;} </style>
<script type="text/javascript" src="j.js"></script>
</head>
<body>
<h1>eBay Search Results</h1>
<div id="results"></div>
</body>
</html>
的javascript
function _cb_findItemsByKeywords(root) {
var items = root.findItemsByKeywordsResponse[0].searchResult[0].item || [];
var html = [];
html.push('<table width="100%" border="0" cellspacing="0" cellpadding="3"><tbody>');
for (var i = 0; i < items.length; ++i) {
var item = items[i];
var title = item.title;
var pic = item.galleryURL;
var viewitem = item.viewItemURL;
if (null != title && null != viewitem) {
html.push('<tr><td>' + '<img src="' + pic + '" border="0">' + '</td>' +
'<td><a href="' + viewitem + '" target="_blank">' + title + '</a></td></tr>');
}
}
html.push('</tbody></table>');
document.getElementById("results").innerHTML = html.join("");
} // End _cb_findItemsByKeywords() function
var url = "http://svcs.ebay.com/services/search/FindingService/v1";
url += "?OPERATION-NAME=findItemsByKeywords";
url += "&SERVICE-VERSION=1.0.0";
url += "&SECURITY-APPNAME=myappid";
url += "&GLOBAL-ID=EBAY-US";
url += "&RESPONSE-DATA-FORMAT=JSON";
url += "&callback=_cb_findItemsByKeywords";
url += "&REST-PAYLOAD";
url += "&keywords=harry%20potter";
url += "&paginationInput.entriesPerPage=3";
// Submit the request
s=document.createElement('script'); // create script element
s.src= url;
debugger;
document.body.appendChild(s);
以下是manifest.json文件
{
"manifest_version": 2,
"name": "eBay",
"description": "This extension demonstrates a 'browser action' with ebay products.",
"version": "1.0",
"browser_action": {
"default_icon": "ebayicon.png",
"default_popup": "MySample.html"
}
它将我的<h1>
标记作为输出....
以下是发生的错误:
**未捕获的TypeError:无法读取属性&#39; appendChild&#39; null **
我不明白究竟是什么意思...... 请帮我理解上面的错误。
谢谢
答案 0 :(得分:0)
您的代码存在的问题是Google Chrome扩展程序无法加载外部脚本。如Content Security Policy所示,Chrome会出于安全原因限制脚本扩展可以加载的内容(例如,防止中间人攻击)。这是导致您的问题的代码,因为您正在尝试从Ebay加载脚本,这是不允许的,因为它是外部脚本:
var url = "http://svcs.ebay.com/services/search/FindingService/v1";
url += "?OPERATION-NAME=findItemsByKeywords";
url += "&SERVICE-VERSION=1.0.0";
url += "&SECURITY-APPNAME=myappid";
url += "&GLOBAL-ID=EBAY-US";
url += "&RESPONSE-DATA-FORMAT=JSON";
url += "&callback=_cb_findItemsByKeywords";
url += "&REST-PAYLOAD";
url += "&keywords=harry%20potter";
url += "&paginationInput.entriesPerPage=3";
// Submit the request
s=document.createElement('script'); // create script element
s.src= url;
更改网址以使用“https://”协议。只需用
替换错误代码的第一行var url = "http://svcs.ebay.com/services/search/FindingService/v1";
在manifest.json
中,更改/添加content_security_policy
行以匹配以下内容
"content_security_policy": "script-src 'self' https://svcs.ebay.com; object-src 'self'"
这应该可以解决Chrome扩展程序CSP的问题。
您的manifest.json
也存在问题,括号未关闭。只需在}
段之后以及文件末尾之前插入额外的browser_action
。
为了让您的脚本能够访问该页面,您需要在content_scripts
的{{1}}下注册该脚本。这将允许脚本与页面的manifest.json
元素进行交互,但会在隔离的环境中运行您的脚本,这意味着与页面本身的全局JavaScript进行交互,并且您的扩展程序是有限的。
如果您需要与页面本身的全局JavaScript环境进行交互,则必须在您希望与之交互的页面的文档元素中使用document
标记注入脚本。消息传递可以通过短期或长期请求完成,您可以在Google Developer documentation on messaging中进行探索。请确保不要使用不安全的<script>
,并通过某些方式验证您的邮件是否为正版邮件,例如来源或回调属性。