-1

これは私が昨日尋ねた質問のフォローアップです。

私はユーザースクリプトを持っています(GreaseMonkeyスクリプトのようなものですが、Chrome用です)。

アイデアは、テキストボックスとボタンをページに追加することです。次に、ユーザーがボタンをクリックすると、処理を実行する機能が開始されます。そのため、テキストボックス、ボタン、関数をページに挿入しましたが、ユーザーがボタンをクリックすると、Chromeコンソールに「UncaughtTypeError:オブジェクトは関数ではありません」と表示されます。したがって、明らかに、私が注入したばかりの関数は表示されません。これonclickは、ボタンのイベントで指定されています。

だから私はこのようなコードを持っています:

initialize();

function initialize() { 
    var dropDown = document.getElementById("tstGlobalNavigation_ddlChooseProject"); 

    // add a textbox 
    dropDown.innerHTML = dropDown.innerHTML + "&nbsp;&nbsp;&nbsp;<input type='text' name='txtSearch' style='position:absolute;top:8px;left:800px;width:50px' >";

    // add a button 
    dropDown.innerHTML = dropDown.innerHTML + "&nbsp;&nbsp;&nbsp;<input type='button' name='btnSearch' value='Go' onclick='fn()' style='position:absolute;top:8px;left:860px;width:35px'>";

    addScript("var obj = document.getElementById('txtSearch'); " 
    + "if (obj != null) { " 
    + " var incidentId = document.getElementById('txtSearch').value; " 
    + " var currentURL = location.href; " 
    + " var splitResult = currentURL.split('/'); " 
    + " var projectId = splitResult[4]; " 
    + " location.href = 'http://dev.myApp.com/ProductTeam/' + projectId + '/Incident/' + incidentId + '.aspx'; " 
    + " }" 
    , "fn"); 
}

function addScript(contents, id) { 
    var head, script; 
    head = document.getElementsByTagName('head')[0]; 
    script = document.getElementById(id); 
    if(script != undefined) { 
    head.removeChild(script); 
    } 
    script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.id = id; 
    script.innerHTML = contents; 
    head.appendChild(script); 
}

ここで何が欠けていますか?

4

3 に答える 3

2

作成した関数を呼び出しているのではなく、script タグに指定した ID を使用しています... コードを次のように変更してみてください

addScript("function fn() { var obj = document.getElementById('txtSearch'); " 
    + "if (obj != null) { " 
    + " var incidentId = document.getElementById('txtSearch').value; " 
    + " var currentURL = location.href; " 
    + " var splitResult = currentURL.split('/'); " 
    + " var projectId = splitResult[4]; " 
    + " location.href = 'http://dev.myApp.com/ProductTeam/' + projectId + '/Incident/' + incidentId + '.aspx'; " 
    + " } }" 
    , "fn"); 

そして、呼び出すことができる fn() 関数があります

于 2011-04-07T22:00:23.903 に答える
1

The problem is that you're trying to use the onclick element attribute to bind an event handler. These attributes are only parsed when the page is first loaded, at which time the function you're trying to bind as the callback doesn't exist.

Avoid binding event handlers in element on* attributes whenever possible. This is called writing unobtrusive JavaScript.

That said, if you absolutely must stick with using onclick, you can bind to a dummy function which does nothing but turn around and call the function that you inject:

<button onclick="wrapper()"

Where wrapper looks something like this:

function wrapper() {
    return functionThatWillEventuallyBeInjected();
}
于 2011-04-07T21:54:02.497 に答える
-1

実際scriptにその場でタグを作成してコンテンツをプッシュできるかどうかはわかりません。

代わりに、script タグを作成し、src 属性を一部の JS ファイルに変更することもできます。

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "path/to/your/javascript.js";
document.body.appendChild(script);

文字列に格納されたコードを本当に実行する必要がある場合は、必要に応じて簡単に実行できるかもしれませんeval()!

于 2011-04-07T21:52:49.233 に答える