jQuery对请求图像的外部文本进行查询
jQuery on external text requesting images
我正在开发一个chrome扩展,该扩展使用jquery解析页面的源代码以查找特定内容。举个例子,我正在浏览维基百科以获取类别。
我通过获得页面的来源
chrome.tabs.executeScript(tabId, {
code: "chrome.extension.sendMessage({action: 'getContentText', source: document.body.innerHTML, location: window.location});"
}, function() {
if (chrome.extension.lastError)
console.log(chrome.extension.lastError.message);
});
然后我(成功地)监听这个消息,然后使用jquery解析对象的source
密钥,就像一样
if (request.action == "getContentText")
{
//console.log(request.source);
$('#mw-normal-catlinks > ul > li > a', request.source).each(function()
{
console.log("category", $(this).html());
});
}
这可以按预期工作,并在HTML中记录所有类别链接的列表。然而,这个问题发生在jQuery选择器中,它试图加载request.source
中包含的图像。这会导致等错误
GET chrome-extension://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Padlock-silver.svg/20px-Padlock-silver.svg.png net::ERR_FAILED
这些都是有效的链接,但它们是从我的扩展中调用的(不需要),前缀为chrome-extension://
(无效)。我不知道为什么jquery会尝试使用选择器来评估/请求源内的图像
我想这是因为维基百科在其图像上使用相对路径(而不是https://或http://,简单地说是//-所以加载的内容是相对于服务器的)。jQuery正在发出请求,您可以在这里看到如何解决此问题(将来,请确保更彻底地搜索SO)。
非常感谢@timonwimmer在聊天中对我的帮助。我们碰巧同时找到了不同的解决方案。
我的解决方案是使用正则表达式来删除任何出现的图像。通过
var source = request.source.replace(/.*?'.wikimedia'.org'/.*?/g, "");
他的答案已经是关于堆栈溢出的,这是从另一个答案派生出来的。如果你感兴趣的话,这个答案非常适用
如果给jQuery一个带有完整元素声明的字符串,它实际上会生成一个新的DOM元素,类似于调用document.createElement(tagName)
并设置所有属性。例如:var $newEl = $("<p>test</p>")
,或者在您的情况下使用$("<img/>")
标记img
元素。它将被解析并创建为一个新的DOMHTML元素,并由jQuery包装,以便您可以查询它
由于传递的是一个完整有效的HTML字符串,因此它首先将其解析为一个实际的DOM。这是因为jQuery使用了内置的底层document.querySelector
方法,它们作用于DOM而不是字符串——将DOM视为一个数据库,其中包含用于查询的id、class和属性的索引。例如,MongoDB无法对原始JSON字符串执行查询,它需要首先将JSON处理到BSON中并对其进行索引,然后对其执行查询。
jQuery的问题较少,而元素是如何创建的,以及当这些元素的属性发生变化时会发生什么。例如,当用document.createElement('img')
创建img
元素,然后用imgElement.src = "link to image"
设置src
属性时,这会自动触发对位置src
处的图像的加载。
您可以在JavaScript开发人员控制台中运行以下程序来自行测试:
var img = document.createElement('img');
img.src = "broken-link";
请注意,在运行后,这可能会在控制台中显示并出错,说明找不到映像。
因此,为了确保它不会解析图像的src
,您需要1) 在现有DOM上应用jQuery(document.body
等),或者2) 让它将字符串解析和求值为DOM,并在处理之前清理字符串(使用Regex或其他方法删除img
标记)。看看https://stackoverflow.com/a/11230103/2578205用于从字符串中删除HTML标记。
希望它能成功!
- 如何从查询字符串中的输入字段发回文本
- nodejs正在解析请求的文本查询
- 如何在下拉列表更改时自动填充mysql查询结果中的文本框值
- jQuery对请求图像的外部文本进行查询
- 为什么我的文本框没有用查询结果更新
- 可以't使我的文本值在查询中起作用
- 无法使我的文本参数与我的查询一起工作
- 如何将mysql查询的结果获取到html文本框中
- j查询在多个文本框之间指定
- j查询限制文本函数
- Php菜单查询数据库并显示文本/链接
- 选中悬停查询的循环中的定位标记文本
- j查询文本滑块动画
- j查询文本在第一次点击时不切换
- j查询以显示文本
- j查询菜单滑动和更改按钮文本
- j查询验证模糊文本区域与其他输入问题
- j查询遍历和文本替换
- 查询选择器设置文本值
- 在 Javascript 中将对象文本编码为 URL 查询字符串