天天看點

異步加載js檔案并執行js方法:實作異步處理網頁的複雜效果

有這麼一個場景,當你的網頁頁面效果過多就會造成了打開頁面的速度變得緩慢,長時間處于加載的狀态,這樣的效果通常會讓使用者感到不友好,通常的處理方法是先加載基本的html,然後再加載其他的網頁效果,讓使用者感覺到頁面一下子就出來了,然後其他的網頁效果再慢慢的展現出來。

這裡通過JSLoader元件來實作這種前端的效果

using System;  

class XXTEA  

{  

    public static Byte[] Encrypt(Byte[] Data, Byte[] Key)  

    {  

        if (Data.Length == 0)  

        {  

            return Data;  

        }  

        return ToByteArray(Encrypt(ToUInt32Array(Data, true), ToUInt32Array(Key, false)), false);  

    }  

    public static Byte[] Decrypt(Byte[] Data, Byte[] Key)  

        return ToByteArray(Decrypt(ToUInt32Array(Data, false), ToUInt32Array(Key, false)), true);  

    public static UInt32[] Encrypt(UInt32[] v, UInt32[] k)  

        Int32 n = v.Length - 1;  

        if (n < 1)  

            return v;  

        if (k.Length < 4)  

            UInt32[] Key = new UInt32[4];  

            k.CopyTo(Key, 0);  

            k = Key;  

        UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum = 0, e;  

        Int32 p, q = 6 + 52 / (n + 1);  

        while (q-- > 0)  

            sum = unchecked(sum + delta);  

            e = sum >> 2 & 3;  

            for (p = 0; p < n; p++)  

            {  

                y = v[p + 1];  

                z = unchecked(v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));  

            }  

            y = v[0];  

            z = unchecked(v[n] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));  

        return v;  

    public static UInt32[] Decrypt(UInt32[] v, UInt32[] k)  

        UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum, e;  

        sum = unchecked((UInt32)(q * delta));  

        while (sum != 0)  

            for (p = n; p > 0; p--)  

                z = v[p - 1];  

                y = unchecked(v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));  

            z = v[n];  

            y = unchecked(v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));  

            sum = unchecked(sum - delta);  

    private static UInt32[] ToUInt32Array(Byte[] Data, Boolean IncludeLength)  

        Int32 n = (((Data.Length & 3) == 0) ? (Data.Length >> 2) : ((Data.Length >> 2) + 1));  

        UInt32[] Result;  

        if (IncludeLength)  

            Result = new UInt32[n + 1];  

            Result[n] = (UInt32)Data.Length;  

        else  

            Result = new UInt32[n];  

        n = Data.Length;  

        for (Int32 i = 0; i < n; i++)  

            Result[i >> 2] |= (UInt32)Data[i] << ((i & 3) << 3);  

        return Result;  

    private static Byte[] ToByteArray(UInt32[] Data, Boolean IncludeLength)  

        Int32 n;  

            n = (Int32)Data[Data.Length - 1];  

            n = Data.Length << 2;  

        Byte[] Result = new Byte[n];  

            Result[i] = (Byte)(Data[i >> 2] >> ((i & 3) << 3));  

調用方法示例:

先在頁面上加載JSLoader.js檔案

然後執行

JSLoader.load('js/test.js' , function () {a();})

表示異步加載test.js檔案,并且加載完成後再執行a()方法,a()方法是test.js裡面的方法,a()方法就是負責渲染一些前端頁面的網頁效果來的。

不過該方法在ie7下并不會産生異步的效果,在ie7下需要使用延時觸發器來包裝一下,如:

setTimeout(" JSLoader.load('js/test.js' , function () {a();})", 1);

本文轉自linzheng 51CTO部落格,原文連結:http://blog.51cto.com/linzheng/1078557

繼續閱讀