3

外部 JavaScript ファイルを動的にロードしているユーザースクリプトがあり、何らかの理由で 2 回実行されています。

ファイルをロードするコードは次のとおりです。

var jqScript = document.createElement('script');
jqScript.setAttribute('type', "text/javascript");
jqScript.setAttribute('src', "http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.js");
(document.body || document.head || document.documentElement).appendChild(jqScript);

var extraScript = document.createElement('script');
extraScript.setAttribute('src', "http://youtube.thegoblin.net/layoutFix/script.js");
document.body.appendChild(extraScript);

そして、外部ファイルからのコード:

alert(1);

$.get(
"http://www.youtube.com/my_subscriptions",
function(data) {
   var dataSplit = data.split("<ol class=\"vm-vertical-nav\">")[1].split("</ol>")[0].split("<li>");
   var dataString = [];
   for (var i=2;i<dataSplit.length;i++)
   {
       dataString[i - 2] = dataSplit[i].split(">")[1].split("</a")[0];
   }
  alert(dataString);
}
, "text");

コードを実行すると、外部の .js ファイルから両方のアラートを受け取りますが、2 回受け取ります。

私が何をした?一度だけ呼び出されるようにするにはどうすればよいですか?

アップデート:


絞り込みました。ページにある iframe の Body に追加されているために発生しています。

iframe ではなく、現在のページにのみ追加するにはどうすればよいですか?

4

1 に答える 1

2

何が起こっているかは、追加を行うユーザースクリプトがすべてのウィンドウ (メインウィンドウと iframe) に適用されていることであり、追加を行うコードがメインウィンドウだけでなく iframe にも誤って追加されることではないと思います。たとえば、追加コードはメイン ウィンドウ各 iframe に対して実行されています。

iframe 内にいるかどうかを確認するには、いくつかの方法があります。1 つは であることを確認するwindow.frameElementこと!nullです。そう:

if (!window.frameElement) {
    // ...your append code here...
}

MDN によると、ほぼすべてのバージョンの IE、すべてのバージョンの Firefox、および Chrome 18 以降で動作します。

チェックする別の方法は、window.top!=かどうかを確認することですwindow.self

if (window.top != window.self) {
    // ...your append code here...
}
于 2012-12-16T07:55:48.440 に答える