2009-02-27 7 views
3

私のページのヘッダーのコントロールを委任コントロールに追加する2つのSharePoint機能がそれぞれ同じように実装されています(下記参照)。コントロールの1つは他のものに依存します(1つはjQueryライブラリ、もう1つはjQueryに依存します)。ただし、コントロールがレンダリングされると、コントロールの順序が正しくありません。これらのコントロールがレンダリングされる順序を指定するにはどうすればよいですか?SharePoint DelegateControlレンダリング注文

制御(両方は、それらが異なる.jsファイルを参照することを除いて、同一である):

<%@ Control ClassName="MyScriptControl" %> 
<script type="text/javascript" src="/_layouts/MyScript.js"></script> 

は、Feature.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<Feature Id="AA9D59AC-D53E-4338-9B52-CD39F2A8C31A" 
    ActivateOnDefault="true" 
    Title="My Feature" 
    Description="Does something." 
    Scope="Site" Version="1.0.0.0" 
    Hidden="FALSE" 
    DefaultResourceFile="core" 
    xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <ElementManifests> 
     <ElementManifest Location="MyFeature\Elements.xml" /> 
    </ElementManifests> 
</Feature> 

Elements.xml:

<?xml version="1.0" encoding="utf-8" ?> 
<Elements xmlns="http://schemas.microsoft.com/sharepoint/" 
    Id="24A4BB9A-9636-4a73-B3A5-35661DE19902"> 
    <Control Id="AdditionalPageHead" 
     ControlSrc="~/_controltemplates/MyControl.ascx" /> 
</Elements> 

ページの出力(jQueryはDependsOnjQueryの前にデプロイされています):

<script type="text/javascript" src="/_layouts/DependsOnjQuery.js"></script> 
<script type="text/javascript" src="/_layouts/jQuery.min.js"></script> 

MyControl2.jsの前にMyControl1.jsをレンダリングします。

答えて

2

私のmasterpageのヘッダに2番目のDelegateControlを追加し、そのデリゲートにjQueryを追加することで、これを動作させることができました。こうすることで、依存ライブラリのロードを遅らせるロジックを書くことなく、jQueryが常に他のものの前にロードされるようにすることができます。

<SharePoint:DelegateControl runat="server" ControlId="jQueryDelegate" AllowMultipleControls="true"/> 
<SharePoint:DelegateControl runat="server" ControlId="AdditionalPageHead" AllowMultipleControls="true"/> 
1

Sequence属性を使用して、これらの人がレンダリングされる順序を制御できるように思えます。あなたのjQueryコントロールに50のシーケンスを与え、DependsOnjQueryコントロールで100のシーケンスをコントロールし、あなたは良いものになるはずです。

詳細については、Delegate Control documentation on MSDNを参照してください。

+0

これは私が最初に思ったものですが、これを試してみると、順序は変わりません。 –

0

スクリプトでDEFER = "DEFER"属性を設定しようとしましたか?

これは、スクリプトをロードする前にスクリプトがページを読み込んでレンダリングするのをスクリプトが待機する必要があることをユーザーエージェントに伝えます。

これ以外の場合は、スクリプトをロードするときに変数がtrueに設定されます。もう一方では、スクリプトがロードされた場合にテストされたロジック(thinkループとタイムアウトメソッド)を配置し、両方のスクリプトがロードされたときにロジックを呼び出します。

しかし、あなたはスクリプトを実行するだけでなく、実行を処理するために何らかのロジックが必要です。

nathan:デリゲートのシーケンスは、デリゲートコントロールがロードするを決定するために使用されます。これは問題の問題とは関係がありません。私が理解しているように、JSファイルはちょうどデリゲートコントロールになるスクリプトの値を設定します。

+0

シーケンスがより多くのものに影響を与えることを期待していました...ドキュメントが完成していないこともあります。 –