正如 Sudarshan 回答的那样,在 中注释掉该document.write
代码jquery.exif.js
。 document.write
在内容脚本中删除以前的 DOM,并且 VBscript 在 Chrome 中无论如何都不起作用。
然而,这不是唯一的问题:
当内容脚本设置为 时"run_at" : "document_start"
,如问题所示,您必须使用$(document).ready()
. $(document).ready()
当有疑问时,无论如何使用它永远不会受到伤害。
当内容脚本设置为 时"run_at" : "document_idle"
,如在您链接的文件中, 脚本可能会在document.load
事件发生后触发。所以,$(window).load()
不会总是奏效。
在 Chrome 中,至少在您提供的测试页面上,Exif 数据最多需要 6 秒才能进入!(在 Firefox 上几乎是即时的。)这意味着,您需要在延迟一段时间后检查图像。
其他不太重要的问题:
- 使用 CSS 类来帮助进行上述定时检查并避免内联 CSS。
- 使用jQuery 的
.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在他的回答中指出的那样,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")
);
}