私は、window
オブジェクトのプロパティjQuery
を、設定スクリプトのコードを含むコンテンツスクリプトから定義しようとしています。このようにして、実際のjQueryオブジェクトが定義されたらすぐに使用できます。私はそれを正しく得ることができないようだ。どのようにしてタブのメインウィンドウオブジェクトにプロパティを定義できますか?
対象のWebサイトはOutlook.comです。それはOutlookのウェブメール版です。
私が直接コンテンツスクリプト内のコードを入れてみましたが、私はマニフェストのcontent_scripts
セクションに"all_frames": true
を入れても、(そのコードはすべてのフレームに注入します)、それが機能していません。
function afterInit(){
var _jQuery;
console.log('This gets logged');
Object.defineProperty(window, 'jQuery', {
get: function() { return _jQuery; },
set: function(newValue) {
_jQuery = $ = newValue;
console.log('This is never logged!');
$(document.body).append($('<span>I want to use jQuery here</span>'));
}
});
}
afterInit();
私はwindow.jQuery
が適切に実際のjQuery
機能/オブジェクトによって、後で定義されていることを確認し、私のセッター・コードが実行されることはありません。
私はメッセージの受け渡しでそれを試しました。文字列としてのコードを含むメッセージをバックグラウンドスクリプトに送り、executeScript
を使って正しいタブでそれを実行しますが、これも機能しません。
chrome.runtime.sendMessage(
{action:'jQueryPreInit', value: '('+afterInit.toString()+')();'});
そして、私のバックグラウンドスクリプトで:
chrome.runtime.onMessage.addListener(function(message, sender, callback) {
switch (message.action){
case "jQueryPreInit": chrome.tabs.executeScript(sender.tab.id, {code: message.value});
}
});
私は正常に動作executeScript
コード、中Object.defineProperty
コード以外の何かを置く場合。私はプロパティを定義する際に問題があります。
簡単な質問:なぜこの複雑なダンスをやっていますか? – Xan
私は、ページ自体が提供するjQueryを使用したいと思います。私は、Outlookと同じjQueryファイルを挿入しようとする可能性があり、キャッシュからロードされることを期待していますが、私はエクステンションをできるだけきれいに保ち、すでに利用可能なものを使用します。 すべてのことが言われて終了したら、私はjQueryの 'ajaxSuccess'関数を使用して、読み取りウィンドウで電子メールが開かれるたびにコードを実行します。 –