2012-01-10 13 views
3

Greasemonkeyスクリプトを作成して、オンラインチケットシステムのいくつかのオプションの設定を自動化し、ロギングコールをより効率的にするためです。Greasemonkeyスクリプトを使用してフレーム内で関数を呼び出す

とにかく、呼び出しを記録するための画面は複数のフレームで構成されていますが、私はオートメーションに関して興味があります。私がやろうとしています何

<html> 
<head> 
</head> 
<frameset framespacing="0" border="0" bordercolor="#ffffff" rows="130,*,22,0"> 
    <frame scrolling="no" marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" noresize="" src="top.asp?menu=&page=" name="menu"> 
    </frame> 
    <frameset id="contentCols" framespacing="8" border="8" cols="250, *" bordercolor="#ffffff"> 

     <frame marginwidth="0" marginheight="0" leftmargin="0" topmargin="0" border="0" src="../service/loading.html" name="content" frameborder="0" style="padding-right: 10px;"> 
      <html> 
      <head> 
      </head> 
      <body class="winBack" style="background-color: rgb(255, 255, 255);"> 

      <div id="scrollableContainer" class="lockedTableContainer scrollableContainerHeight" style="position: relative; height: 0px;"> 

      <table cellspacing="1" cellpadding="3" border="0"> 
      <form id="configFields" name="configFields" method="post" action="/ics/tt/ticketNew.asp"></form> 
       <input type="hidden" value="" name="task"> 
       <input type="hidden" value="account" name="source"> 
       <tbody> 
       <tr id="ROW_109094"> 
        <td class="webCaption" style="width: 160px;"> 
        </td> 

        <td class="formText"> 
         <select id="FIELD_109094_DROPDOWN_null" class="formText" style="width: 200px;" title="Establishment Type" name="FIELD_109094_DROPDOWN_null" onchange="updateDep(109094, this.options[this.selectedIndex].value);"> 
         </select> 
        </td> 
       </tr> 
       </tbody> 
      <table> 
      </div> 
     </frame> 
    </frameset> 
</frameset> 
</html> 


FIELD_109094_DROPDOWN_null select要素のselectedIndex設定されている次のようにページと(私は編集しようとしている要素を含む)フレームのストリップダウンHTMLが表示されます。
次に、要素の変更イベントにアタッチされているupdateDep関数(フレームに添付されたスクリプトに含まれています)を実行しようとしています。この関数は、select要素に現在設定されている値に応じて、他のフィールドを表示します。 Firebugののコンソールを使用して

私は、次の2行使ってこれを実現することができます:私はGreasemonkeyのスクリプトにこれを入れたときに、しかし

frames["content"].document.getElementById("FIELD_109094_DROPDOWN_null").selectedIndex = 2; 
frames["content"].updateDep(109094, frames["content"].document.getElementById("FIELD_109094_DROPDOWN_null").options[2].value); 

を、メインウィンドウのonload、またはフレームのonloadのいずれかにそれを添付。私は経由updateDep機能を実行する方法を見つけ出すことはできません

document.getElementById("FIELD_109094_DROPDOWN_null").selectedIndex = 2; 

:しかし、私は少なくともselect要素の選択されたインデックスを変更することができ、私が使用している場合

Error: frames.content.document.getElementById("FIELD_109094_DROPDOWN_null") is null

、次のコード:私はこのエラーを取得しますGreasemonkeyスクリプト。スクリプト内のコードは次のように表示されます。

// ==/UserScript== 

var initElements = (function() { 

    var elementExists = document.getElementById("FIELD_109094_DROPDOWN_null"); 

    if(elementExists) 
    { 
     document.getElementById("FIELD_109094_DROPDOWN_null").selectedIndex = 2; 
     frames["content"].updateDep(109094, frames["content"].document.getElementById("FIELD_109094_DROPDOWN_null").options[2].value); 

    } 
} 
)(); 

window.addEventListener('load', initElements, false); 

ご協力いただければ幸いです。

答えて

1

フレームとiFramesのトリックは、それぞれがGreasemonkeyの別のページのように見えるということです。

ので、問題になっているHTMLのために、GMスクリプトが@includeは、@exclude、および/または@matchディレクティブが設定された方法に応じて、3回に分けを実行してしまう可能性があります。

したがって、スクリプトが実行されている実行によって、同じ要素が異なるように表示されます(まったく表示されません)。したがって、スクリプトの実行状態を正確に認識/制御していない限り、frames["content"]のようなコードは使用しないでください。条件付きでノードをテストし、コードを実行する方が良いでしょう。

もう1つのことは、ターゲットページにあるjavascriptを使用する場合、unsafeWindowまたは回避策を使用する必要があることです。 、一緒にその動作するはずのようなコードがすべてを置く

var depSelect = document.querySelector ("#FIELD_109094_DROPDOWN_null"); 
if (depSelect) { 
    depSelect.selectedIndex = 2; 
    unsafeWindow.updateDep (109094, depSelect.options[2].value); 
} 

を(@include@exclude、および/または@matchディレクティブとまったく面白いビジネスを想定していない。)

あなたはwindow.addEventListener('load'...を必要はありませんコードをinitElements()にラップすることもできません。

+0

ねえBrockさん、これは完全に働いた、私はそれを本当に感謝ありがとうございました。 – achillesminor

+0

ようこそ。喜んで助けてください。 –

0

私の発見は、GMが名前でフレームを認識しないことでした。スクリプトを作成する唯一の方法は、名前の代わりにフレームインデックスを使用することでした。

frames[2].document... 

代わりの

frames['aname'].document... 
関連する問題