1

私はクロム拡張機能を開発しています。JavaScript ファイルを正常にロードしましたが、問題は外部 JavaScript (ロードしたもの) がコンテンツ スクリプト ファイルの関数を呼び出せないことです。私のコードは次のとおりです。

$(document).ready(function() {
$('.main_list').click(function()
{
    $('.sub_list') .hide();
    $(this) .parent() .children('.sub_list') .slideToggle("normal");
});


$('#click') .click(function()
{
    $('.sub_list') .hide();
    $(this) .parent() .parent() .children('.sub_list').slideToggle("normal");
});


$('#btnnewtask').click(function()
{
    showdialog('http://localhost:51967/task.aspx');
});
$('#linknewtask').click(function()
{
    showdialog('http://localhost:51967/task.aspx');
});
$('#btnnewcall').click(function()
{
    showdialog('http://localhost:51967/call.aspx');
});
$('#linknewcall').click(function()
{
    showdialog("http://localhost:51967/call.aspx");
});
$('#btnnewmeeting').click(function()
{
    showdialog("http://localhost:51967/meeting.aspx");
});
$('#linknewmeeting').click(function()
{
    showdialog("http://localhost:51967/meeting.aspx");
});
});

Showdialog() は、コンテンツ スクリプトの関数です。以下の通りです

function showdialog(url)
{
var xhr=new XMLHttpRequest();
xhr.onreadystatechange=function()
{
    if (xhr.readyState==4 && xhr.status==200)
        {
        xmldoc=xhr.responseXML;
        var js=getfile(getjavascript(xmldoc));
        for(i=0;i<js.length;i++)
        {
            loadjscssfile(js[i],"js");
        }
        var css=getfile(getstylesheet(xmldoc))
        for(i=0;i<css.length;i++)
        {
            loadjscssfile(css[i],"css");
        }
document.file.push(
{"url":url,"css":css,"js":js});
document.getElementById("dialogcontainer3").
innerHTML=gethtmldocument(xmldoc);
        document.getElementById("blacklayer").style.display="block";
        document.getElementById("dialogcontainer3").style.display=
"inline-block";
        document.getElementById("dialogcontainer2").style.display="block";
        document.getElementById("dialogcontainer1").style.display="block";
        }
}
xhr.open("GET",url,true);
xhr.send();
}

しかし、それはエラーを出します

Uncaught ReferenceError: showdialog is not defined (program):1
(anonymous function) (program):1
b.event.dispatch (program):3
v.handle (program):3
4

1 に答える 1

7

コンテンツ スクリプトは、隔離された世界と呼ばれる特別な環境で実行されます。挿入先のページの DOM にはアクセスできますが、ページによって作成された JavaScript 変数や関数にはアクセスできません。各コンテンツ スクリプトは、それが実行されているページで他の JavaScript が実行されていないかのように見えます。逆の場合も同様です。ページで実行されている JavaScript は、関数を呼び出すことも、コンテンツ スクリプトによって定義された変数にアクセスすることもできません。

http://developer.chrome.com/extensions/content_scripts.html#execution-environmentを参照してください

コンテンツ スクリプトとページまたはMessage Passingの間で通信するために共有 DOM を試すことをお勧めします。

ページ上のコードの例は次のとおりです。

function showDialog(url) {
    window.postMessage({
        type: "FROM_PAGE",
        text: url
    }, "*");
}

そしてコンテンツスクリプトで:

// This function will NOT collide with showDialog of the page:
function showDialog(url) {
    /* ... */
}

window.addEventListener("message", function (event) {
    // We only accept messages from ourselves
    if (event.source != window) { return; }

    // Make sure we're looking at the correct event:
    if (event.data.type && (event.data.type == "FROM_PAGE")) {
        showDialog(event.data.text);
    }
}, false);

上記はテストしていないので、疑似コードと考えてください。同様の例がここにあります: http://developer.chrome.com/extensions/content_scripts.html#host-page-communication

于 2013-02-05T11:21:09.750 に答える