7

通常通りのJavaScriptファイルを含むページhttp://example.com/1.phpがあります:window.onloadはFirefox + Greasemonkeyスクリプトでは動作しますが、Chromeのuserscriptでは動作しませんか?

<script type="text/javascript" src="/util.js?1354729400"></script> 

このファイルには、私は私のuserscriptで使用する必要がexampleFunctionという名前の関数が含まれています。私はそれを動作させるにはどうすればよい

Uncaught ReferenceError: exampleFunction is not defined 

:Firefoxで完璧に動作し、Chromeでエラーを返します

// ==UserScript== 
// @name   SomeName 
// @namespace  http://example.com/userscripts 
// @description Greets the world 
// @include  http://example.com/* 
// ==/UserScript== 
window.onload = function() { 
     console.log(exampleFunction); 
     alert("LOADED!"); 
} 

: はまた、私はユーザースクリプトを持っていますか?

+0

クロムのキャッシュを無効にするか、Ctrl + F5を押してみてください。 – Ibu

+0

助けにならない – Alex

答えて

9

exampleFunctionが未定義の理由は、Chromeのuserscriptがサンドボックス("isolated world")で動作するためです。 Greasemonkeyスクリプトはサンドボックスでも動作することがよくありますが、現在はです。an implicit @grant noneで実行されています。
スクリプトでGM_機能を使用する場合は、Firefoxでも機能しなくなります。

このスクリプトを両方のブラウザ(およびほかのいくつかのブラウザ)で動作させるには、スクリプトインジェクションsimilar to this answerを使用してください。

でも、スクリプトにはwindow.onloadが使用されているため、別の問題があります。 Chrome userscripts, with the default execution start-mode, will often never see the onload event.

これを回避するには、// @run-at document-endをメタデータブロックに追加します。

ので、スクリプトは次のようになります。

// ==UserScript== 
// @name   SomeName 
// @namespace  http://example.com/userscripts 
// @description  Greets the world 
// @include   http://example.com/* 
// @run-at   document-end 
// @grant   none 
// ==/UserScript== 

function GM_main() { 
    window.onload = function() { 
     console.log(exampleFunction); 
     alert("LOADED!"); 
    } 
} 

addJS_Node (null, null, GM_main); 

//-- This is a standard-ish utility function: 
function addJS_Node (text, s_URL, funcToRun, runOnLoad) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    if (runOnLoad) { 
     scriptNode.addEventListener ("load", runOnLoad, false); 
    } 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 
+0

それはいつも働いているわけではありません...そしてその理由を特定できません。 – Alex

+1

**どのように**動作していませんか? ***症状は何ですか***?回答のスクリプトは変更せずに '@include'行を使います。 **スクリプトの動作しないページのURL **は何ですか?そのページは完全にロードするのに時間がかかりますか?最後の大きいイメージなどがダウンロードを終了するまで、 'onload'は起動しません。 –

+0

自分で試してみてください: "console.log(exampleFunction);を削除してください"スクリプトから「警告」を出してください。このページでは、プロフィールのリンクをクリックして、そのページを何度かリフレッシュします。どのようにあなたのために働いていますか?私はonloadイベントを半分のケースで受け取りません。 – Alex

1

大括弧でexamplefunctionを呼び出してみましたか? :)このよう :あなたはクロームコンソールでそれをしようとした場合

console.log(exampleFunction()); 

は、関数を呼び出すために括弧を追加する必要があります。

+1

exampleFunctionが実際には定義されていない場合は、何もしません。 – Stuart

1

ページ上のすべてのイメージがロードされているまで発火しない、onLoadと同等にしたい場合は、あなたがあなたのメタデータブロックに// @run-at document-idleを使用したいです。デフォルトのdocument-endは、DOMがロードされると起動します。document.readyに相当します。

関連する問題