0

何が起こっているのかわかりません...
アクセスするページにいくつかのDIV、cssスタイル、およびJS関数を追加する単純なユーザースクリプトがあります
特に、onClickリスナーでJS関数をトリガーする1つのDIVがあります-この関数「トグル」機能です(他のDIVを表示/非表示):

function togglegm(etat) {
 if (etat = 'on') {
    document.getElementById('greasemky').style.display = 'block';
    document.getElementById('greasemkytoggle').innerHTML = '<a href="javascript:return(false);" onClick="togglegm(\'off\');"></a>';
 } else if (etat = 'off') {
  document.getElementById('greasemky').style.display = 'none';
  document.getElementById('greasemkytoggle').innerHTML = '<a href="javascript:return(false);" onClick="togglegm(\'on\');"></a>';
 }
}
var script2 = d.createElement('script');
script2.appendChild(d.createTextNode(togglegm));
(d.body || d.head || d.documentElement).appendChild(script2);

DIV「greasemkytoggle」には、「togglegm('on')」をトリガーする onClick を持つリンクのみが含まれています。私の目的は、togglegm(on) が実行されると、この DIV の innerHTML が togglegm(off) のトリガーになることです
。奇妙な部分... DIVグリースmkytoggleをクリックすると、関数togglegm(on)が完全に実行され(greasemkyが表示されます)、innerHTMLが「togglegm(off)」のリンクで完全に変更されますが、クリックすると繰り返しますが、何も起こりません。

ソース コードを確認したところ、JS 関数が消えていることがわかりました (最後のクリックで何も起こらなかったのはそのためです)。今、私の togglegm() を置き換える空の関数があります:

<script>
scriptHolderArray1
</script>

そのような行動を理解していますか...?
そのような状況については、オンラインで何も見つかりませんでした...

4

2 に答える 2

1

GreaseMonkeyは、はるかに多くのセキュリティ良心のルールセットの下で実行されます。

適切なDOM3(addEventListener)メソッドを使用してイベントリスナーをアタッチします。

(ユーザースクリプトまたは一般的なスクリプトでは)innerHTMLを介してJavascriptを割り当てることは決して良い考えではありません。

「javascript:」疑似プロトコルを使用することは決して良い考えではありません。

于 2012-08-24T20:37:32.193 に答える
0

問題はetat = 'on'etat = 'off'です。

値を設定する場合は、

etat = 'on'
etat = 'off'

比較したい場合は、次を使用します。

etat == 'on'
etat == 'off'

また、href="javascript:return(false);"Firefox では return が関数の外にあるため、エラーをスローします (SyntaxError: return not in function)。href="javascript:void(0);"、またはreturn falseonclick イベントの最後に行う必要があります。

とにかく、あなたがここで何をしているのかよくわかりません:

var script2 = d.createElement('script');
script2.appendChild(d.createTextNode(togglegm));
(d.body || d.head || d.documentElement).appendChild(script2);

togglegm要素によってブラウザのメモリにロードされた関数があり<script>ます。

<script>次に、その関数を使用して新しいものを作成し、それをドキュメントに追加して、ブラウザのメモリに再度ロードします(推測します)。

なんで?

于 2012-08-24T20:42:38.333 に答える