- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于 JS/jQuery 的小 JavaScript 文件和一个额外的库。它作为独立文件完美运行,但我在 Chrome 扩展程序中启动和运行时遇到问题。
脚本检查 HTML 页面的每个图像的特定特征,并根据特征在图像周围添加边框。
list .json
{
"name": "ImageId",
"version": "0.1",
"manifest_version": 2,
"browser_action": {
"default_icon": "icon.png"
},
"content_scripts" : [
{
"matches" : [
"http://*/*",
"https://*/*"
],
"js" : ["jquery-1.8.3.min.js","jquery.exif.js","content_script.js"],
"run_at" : "document_start",
"all_frames" : false
}
],
"icons":{
"128":"icon.png"
}
}
content_script.js:
jQuery(window).load(function(){
$('img').each(function() {
var gpslo=0;
var gpsla=0;
if (typeof(gpslo) != "undefined" && gpslo != null) {
var gpslo= $(this).exif("GPSLongitude");
var gpsla = $(this).exif("GPSLatitude");
}
console.log(gpslo+"--"+ gpsla);
if (gpslo!=0) {
$(this).css('border', "solid 20px red");
$(this).click(function() {
alert("Long: " + $(this).exif("GPSLongitude") + ", Lat: " + $(this).exif("GPSLatitude"));
});
}
else {
$(this).css('border', "solid 20px gray");
};
});
});
现在,当我在一个非常简单的只有 1 张图片的网站上在 Chrome 中运行它时,我没有收到任何错误,只有一个白页。
在扩展系统之外运行脚本也一切正常。我不太确定如何更好地解释这一点。这些是我在教程之外的第一步,所以请善待 :)
我将完整的测试和扩展文件上传到:Working(Html).zip和 NotWorking(Chrome).zip .
最佳答案
As Sudarshan answered ,注释掉jquery.exif.js
中的document.write
代码。内容脚本中的 document.write
会删除之前的 DOM,并且 VBscript 无论如何在 Chrome 中都不起作用。
然而,这不是唯一的问题:
当内容脚本设置为"run_at": "document_start"
时,如问题中,您必须使用$(document).ready()
。如有疑问,无论如何使用 $(document).ready()
永远不会有坏处。
当内容脚本设置为 "run_at": "document_idle"
时,如您链接的文件中所示,the script may fire after the document.load
event has .所以,$(window).load()
并不总是有效。
在 Chrome 中,至少在您提供的测试页面上,Exif 数据最多需要 6 秒才能进入! (在 Firefox 上几乎是即时的。)这意味着,您需要在一段时间延迟后检查图像。
其他不太重要的问题:
.on()
,而不是 .click()
,以便处理程序仅附加一次并优雅地补偿 AJAX 更改。把它们放在一起,content_script.js
变成了(更新,看下面这个脚本):
$(document).ready ( function () {
$(window).load (CompForExifPluginInitDelay);
//--- In a content script, the load event may have already fired.
if (document.readyState == "complete") {
CompForExifPluginInitDelay ();
}
$(document.head).append ( ' \
<style type="text/css"> \
img.myExt_HasExif { \
border: 20px solid red !important; \
} \
img.myExt_WithoutExif { \
border: 20px solid gray !important; \
} \
</style> \
' );
//-- Use jQuery .on(), not .click().
$(document.body).on ("click", "img.myExt_HasExif", popupLatLong);
} );
function CompForExifPluginInitDelay () {
//-- Exif Init takes somewhere between 1.6 and 6 seconds on Chrome!!!
var numChecks = 0;
var checkInterval = 444; //-- 0.4 secs is plenty fast enough
var maxChecks = 6 * 1000 / checkInterval + 1;
var imageCheckTimer = setInterval ( function() {
numChecks++;
findImagesWithLatLong (numChecks);
if (numChecks >= maxChecks) {
clearInterval (imageCheckTimer);
//-- All remaining images don't have lat-long data.
$("img").not(".myExt_HasExif").addClass("myExt_WithoutExif");
console.log ("***** Passes complete! *****");
}
},
checkInterval
);
}
function findImagesWithLatLong (passNum) {
console.log ("***** Pass: ", passNum);
$("img").not (".myExt_HasExif").each ( function (J) {
var jThis = $(this);
var gpslo = jThis.exif ("GPSLongitude");
var gpsla = jThis.exif ("GPSLatitude");
console.log (J + ": ", gpslo + "--" + gpsla);
if (gpslo != 0) {
jThis.addClass ("myExt_HasExif");
}
} );
}
function popupLatLong (zEvent) {
var jThis = $(this);
alert (
"Longitude: " + jThis.exif ("GPSLongitude")
+ ", Latitude: " + jThis.exif ("GPSLatitude")
);
}
到目前为止,它在我所有的测试中都有效,(结合杀死 document.write()
。
.exifLoad()
:正如 PAEz 指出的那样 in his answer , Chrome 计时问题似乎通过使用 .exifLoad()
强制手动扫描图像来解决。
这在我测试时有效,并且是使用计时器的更可取的方法。
因此,PAEz 的答案有效(结合 Sudarshan 的答案),但我的代码版本(解决其他问题)将是:
$(document).ready ( function () {
$(window).load (findImagesWithLatLong);
//--- In a content script, the load event may have already fired.
if (document.readyState == "complete") {
findImagesWithLatLong ();
}
$(document.head).append ( ' \
<style type="text/css"> \
img.myExt_HasExif { \
border: 20px solid red !important; \
} \
img.myExt_WithoutExif { \
border: 20px solid gray !important; \
} \
</style> \
' );
//-- Use jQuery .on(), not .click().
$(document.body).on ("click", "img.myExt_HasExif", popupLatLong);
} );
function findImagesWithLatLong (passNum) {
$("img").not (".myExt_HasExif").each ( function (J) {
$(this).exifLoad ( function () {
var jThis = $(this);
var gpslo = jThis.exif ("GPSLongitude");
var gpsla = jThis.exif ("GPSLatitude");
console.log (J + ": ", gpslo + "--" + gpsla);
if (gpslo != 0)
jThis.addClass ("myExt_HasExif");
else
jThis.addClass ("myExt_WithoutExif");
}.bind (this) );
} );
}
function popupLatLong (zEvent) {
var jThis = $(this);
alert (
"Longitude: " + jThis.exif ("GPSLongitude")
+ ", Latitude: " + jThis.exif ("GPSLatitude")
);
}
关于javascript - 使用 jQuery 插件的代码可以在 Chrome 中运行,但不能在 Chrome 扩展中运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772002/
我是 javascript 的新手(今天开始弄乱它)。 我正在尝试更改名为“bar”的元素(div)的高度。条形图将成为图表的一部分。 我可以毫无问题地将按钮连接到更改栏高度的函数。一切正常,除了条形
错误 -> “UIVIew”没有名为“addSubView”的成员 override func viewDidLoad() { super.viewDidLoad() // Do an
我在命令行工具项目中复制并粘贴了 main.swift 下面链接中的代码。 How do you use CGEventTapCreate in Swift? 它构建没有错误,但是当我运行时, gua
我在尝试编译我的代码时遇到以下错误。 ERROR! ..\myCode\CPOI.cpp:68:41: error: cannot dynamic_cast 'screenType' (of type
我正在尝试将多个字符串连接到一个我已为其分配内存的字符串指针。这是一个例子: char *finalNumString = malloc(sizeof(char)*1024); finalNumStr
我在使用 dup2() 和 pipe() 时遇到问题。 当我尝试将管道的写入端 dup2 到 STDOUT_FILENO 时,我收到了 EBADF。 我用 gdb 在 dup2(pout[1], ST
首先,我应该说我运行的是 Windows 7。 因此,今天早上我尝试像往常一样从我的存储库中提取数据,但我做不到。我得到了错误: The authenticity of host 'github.co
刚开始在虚拟环境中运行Python,乱用Django,无法激活虚拟环境。 花了最后 4 个小时尝试在本地终端/VS 代码上激活虚拟环境 (venv),但没有成功。 避免使用“sudo pip inst
Tidyverse 的粉丝经常给出使用小标题而不是数据框的几个优点。它们中的大多数似乎旨在保护用户免于犯错误。例如,与数据框不同,小标题: 不需要 ,drop=FALSE不从数据中删除维度的论据。 不
我一直在对 Elm 应用程序进行 docker 化时遇到问题。据我所知,我已经创建了一个完整且有效的 Docker 文件……但它不起作用。 我会解释的。 所以我的脚本在 3 个文件中运行。 首先是启动
我可以在 Controller 中使用@Autowired,例如 @RestController public class Index { @Autowired HttpServlet
我定义了一个方法和一个函数: def print(str:String) = println val intToString = (n:Int) => n.toString 现在我想创作它们。 我的问
当我控制台单独记录变量“pokemons”时,它确实返回一个数组。但是当我尝试映射它时,出现错误: TypeError: pokemons.map is not a function 我的代码: im
每当我尝试在 Python 解释器中导入 smtplib 时,都会收到此错误: ImportError: cannot import name fix_eols 我该如何解决这个问题? 编辑:这是完整
我正在使用 Meteor.js 开发一个项目,但在使用 Handlebar 时遇到了一些问题:我想检索集合的最后一项,并显示字段:其中包含 html 的文本: 这是我的javascript代码: Te
你好,我想使用 Service 实现 GestureDetector 但是我有这个错误The method onTouchEvent(MotionEvent) of type GestureServi
我正在尝试在 Controller bean 中 Autowiring 接口(interface) 在我放置的上下文配置文件中 和 我的 Controller 类是 @Controller pub
我试图在 mainwindow.cpp 中包含 QtSvg,但是当我编译时它说无法打开包含文件:QtSvg。我已经在我的 *.pro 文件中添加了这个(QT += svg)。我可以知道可能是什么问题吗
鉴于以下 PostgreSQL 代码,我认为这段代码不容易受到 SQL 注入(inject)攻击: _filter 'day' _start 1 _end 10 _sort 'article_name
我想执行以下操作。这在 MySQL 中是非法的。 PostGRESQL 中关联的 CTE(“with”子句)有效。这里的假设是 MySQL 中的子查询不是完全限定的 CTE。 请注意:这个查询显然非常
我是一名优秀的程序员,十分优秀!