0

EktronのJS.RegisterJSIncludeを使用してJavaScriptファイルをロードしたいのですが、JavaScriptのロード順序を設定したいと思います。

    Ektron.Cms.CommonApi _api = new Ektron.Cms.CommonApi();

    // I'd like this to be called first every time
    JS.RegisterJSInclude(this, _api.SitePath + "/js/first.js", "FirstJS");

    JS.RegisterJSInclude(this, _api.SitePath + "/js/atk.js", "AdobeTypeKitJS");
    JS.RegisterJSInclude(this, _api.SitePath + "/js/file2.js", "File2JS");

    // I'd like this to be called last every time
    JS.RegisterJSInclude(this, _api.SitePath + "/js/last.js", "LastJS");

これらのファイルは、呼び出された順にロードされます。私がやりたいのは、MasterPage、WebForm、またはウィジェットのいずれから呼び出されるかを制御することです。たとえば、

    Ektron.Cms.CommonApi _api = new Ektron.Cms.CommonApi();
    JS.RegisterJSInclude(this, _api.SitePath + "/js/widget.js", "WidgetJS");

ウィジェットでは、常に「LastJS」の前に配置したいと思います。

これはEktronv8.6で可能ですか?

4

1 に答える 1

0

バージョンを指定しなかったので、完全なFrameworkAPIで8.5以降を想定します

それはページイベントの実行順序に帰着します-優先順位を手動で指定する方法はありません。

ただし、ウィジェットのInitイベントで/js/widget.jsをロードし、ページのLoadイベントで他のイベントをロードする場合、たとえば、widget.jsを最初にロードする必要があります。これが上記の説明に理想的かどうかはわかりません。上記のコードでウィジェットJSを他の2つの間にロードするように要求している可能性がありますが、これは不可能です。少なくとも、箱から出してはいけません。

ただし、カスタムソリューションでできることがあるかもしれません。たとえば、私はテストしていませんが、このようなものは機能するはずです。HTTPContextを使用して、あるイベントから次のイベントにオブジェクトを渡します。これは、ウィジェット、ページ、マスターなどで機能します。

// adding javascript objects to http context in init function on page/widget
protected void Page_Init(object sender, EventArgs e)
{
    List<JSObject> AddOns;
    object StoredAddOns = HttpContext.Current.Items["JSAddOns"];
    if (StoredAddOns == null)
    {
        AddOns = new List<JSObject>();
    }
    else
    {
        AddOns = (List<JSObject>)StoredAddOns;
    }
    // javascript being added to the list in the wrong order intentionally
    AddOns.Add(new JSObject() { name = "LastJS", path = "/js/last.js", priority = 10 });
    AddOns.Add(new JSObject() { name = "WidgetJS", path = "/js/widget.js", priority = 5 });
    HttpContext.Current.Items["JSAddOns"] = AddOns;
}

// reading js objects from httpcontext and adding them to the page using framework ui api
// this could just as easily be prerender - as long as the event that reads the objects is after the event that writes them
protected void Page_Load(object sender, EventArgs e)
{
    object StoredAddOns = HttpContext.Current.Items["JSAddOns"];
    if (StoredAddOns != null)
    {
        var AddOns = (List<JSObject>)StoredAddOns;
        // using LINQ to order the JS objects by custom-defined priority setting
        var SortedAddOns = AddOns.OrderBy(j => j.priority);
        // looping through items in priority order to add to the page
        foreach (var js in SortedAddOns)
        {
            Ektron.Cms.Framework.UI.JavaScript.Register(this, js.path, true);
        }
    }
}

// the custom js object
public class JSObject
{
    public int priority { get; set; }
    public string path { get; set; }
    public string name { get; set; }
    public JSObject()
    {
        priority = 0;
        path = string.Empty;
        name = string.Empty;
    }
}

補足: SitePathを使用する場合は、次の文字列を/で開始しないでください。それ以外の場合、Ektronアプリケーションがサイトのルートにあると仮定するとパスは//js/widget.jsになり、サブフォルダーまたは子アプリケーションにある場合は/path//js/widget.jsになります。

于 2013-02-13T19:11:20.177 に答える