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を回避します。
- ハンドラーが1回だけアタッチされ、AJAXの変更を適切に補正するように、ではなくjQuery
.on()
を使用します。.click()
すべてをまとめると、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")
);
}