簡體   English   中英

將JavaScript窗口對象轉換為JSON

[英]Converting the JavaScript Window Object to JSON

顯然,乍一看似乎無法做到這一點,但我要明確指出我已成功將JavaScript窗口對象轉換為JSON。 我需要的幫助是如何以一種比我現在更聰明的方式做到這一點。

該過程現在如下所示:

1)創建一個新對象,並將窗口鍵中的每個鍵復制到新對象。 常見密鑰列表不會添加到新對象(例如WebSocket)中。 2)名為getArray的函數以遞歸方式清除每個子對象,並將其保存為JSON。 結果看起來像這樣{'key':'JSON _ {....}'}或{'key':'JSON _ {{'key':'JSON _ {....}'}}'}。 這個想法是在最小級別上捕獲錯誤,以便最終的JSON對象由key:JSON_string值組成。 另一個關鍵點是捕捉圓形物體。 如果對象具有很長的鍵列表,則將其排除(例如tagName)。

問題在於此代碼有點不穩定。 它只是最近才停止在我們的網站上工作,我沒有改進的想法。

我將接受將window對象轉換為JSON(或可以正確解碼的任何文本格式)的任何解決方案。 我建議,如果可能的話,部分解決方案是最好的,它可以檢測100%的圓形和非JSON可編碼對象。 生產這需要天才,但我相信這是可能的。

這樣做的目的是為了讓用戶發送的錯誤報告顯示我們JavaScript的狀態。 枚舉的對象太多了,按1枚舉,甚至我們創建的用戶對象都包含無法編碼的對象。 它對網絡非常有用且相關。

這是當前代碼,描述的設計模式。 getWindow()

getWindow: function()
    {
        var obj2 = {};
        for (var i in window)
        {
            obj2[i] = 1;
        }
        var keys = ["RequestLogs", "WebSocket", "ClickLogs", "$", "jQuery", "window", "top", "location", "external", "chrome", "document", "i", "arr", "webkitNotifications", "localStorage", "sessionStorage", "applicationCache", "webkitStorageInfo", "indexedDB", "webkitIndexedDB", "crypto", "CSS", "performance", "console", "devicePixelRatio", "styleMedia", "parent", "opener", "frames", "self", "defaultstatus", "defaultStatus", "status", "name", "length", "closed", "pageYOffset", "pageXOffset", "scrollY", "scrollX", "screenTop", "screenLeft", "screenY", "screenX", "innerWidth", "innerHeight", "outerWidth", "outerHeight", "offscreenBuffering", "frameElement", "clientInformation", "navigator", "toolbar", "statusbar", "scrollbars", "personalbar", "menubar", "locationbar", "history", "screen", "postMessage", "close", "blur", "focus", "ondeviceorientation", "ondevicemotion", "onunload", "onstorage", "onresize", "onpopstate", "onpageshow", "onpagehide", "ononline", "onoffline", "onmessage", "onhashchange", "onbeforeunload", "onwaiting", "onvolumechange", "ontimeupdate", "onsuspend", "onsubmit", "onstalled", "onshow", "onselect", "onseeking", "onseeked", "onscroll", "onreset", "onratechange", "onprogress", "onplaying", "onplay", "onpause", "onmousewheel", "onmouseup", "onmouseover", "onmouseout", "onmousemove", "onmouseleave", "onmouseenter", "onmousedown", "onloadstart", "onloadedmetadata", "onloadeddata", "onload", "onkeyup", "onkeypress", "onkeydown", "oninvalid", "oninput", "onfocus", "onerror", "onended", "onemptied", "ondurationchange", "ondrop", "ondragstart", "ondragover", "ondragleave", "ondragenter", "ondragend", "ondrag", "ondblclick", "oncuechange", "oncontextmenu", "onclose", "onclick", "onchange", "oncanplaythrough", "oncanplay", "oncancel", "onblur", "onabort", "onwheel", "onwebkittransitionend", "onwebkitanimationstart", "onwebkitanimationiteration", "onwebkitanimationend", "ontransitionend", "onsearch", "getSelection", "print", "stop", "open", "showModalDialog", "alert", "confirm", "prompt", "find", "scrollBy", "scrollTo", "scroll", "moveBy", "moveTo", "resizeBy", "resizeTo", "matchMedia", "requestAnimationFrame", "cancelAnimationFrame", "webkitRequestAnimationFrame", "webkitCancelAnimationFrame", "webkitCancelRequestAnimationFrame", "captureEvents", "releaseEvents", "atob", "btoa", "setTimeout", "clearTimeout", "setInterval", "clearInterval", "TEMPORARY", "PERSISTENT", "getComputedStyle", "getMatchedCSSRules", "webkitConvertPointFromPageToNode", "webkitConvertPointFromNodeToPage", "webkitRequestFileSystem", "webkitResolveLocalFileSystemURL", "openDatabase", "addEventListener", "removeEventListener", "dispatchEvent"];
        for (var iii in keys)
        {
            var key = keys[iii];
            if (obj2[key])
                delete(obj2[key]);
        }

        for (var i in obj2)
        {
            obj2[i] = window[i];
        }

        return this.getArray(obj2, 0);
    },

getArray()

getArray: function(obj, count)
    {
        try {
            var data = this._getArray(obj, count);
            var cache = [];
            if (typeof data === 'object' && data !== null) {
                if (cache.indexOf(data) !== -1) {
                    // Circular reference found, discard key
                    return 'circular';
                }
                // Store value in our collection
                cache.push(data);
            }
            if (typeof data == 'object')
                return 'JSON_' + JSON.stringify(data);
            else
                return data;
            //return data;
        } catch (e)
        {
            console.log(e);
            return '';
        }
    }

_getArray

_getArray: function(obj, count)
    {
        count = isset(count) ? count : 0;
        if (obj == window && count > 0)
            return 'window';
        if (obj && typeof obj == 'object')
        {
            if (Object.keys(obj).length >= 100 && count > 0)
            {
                return 'object,>100keys';
            }
            if (obj['tagName'])
            {
                return obj['tagName'];
            }

            if (count > 0)
            {
                var keys = ['$', 'tagName', 'scrollTop', 'contentEditable', 'documentURI', 'documentElement', 'context', 'selector', 'jquery', 'ATTRIBUTE_NODE', 'nodeName'];
                for (var ii in keys)
                {
                    if (obj[0] && obj[0].length == 3)
                    {
                        ///log2(obj);
                    }
                    var key = keys[ii];
                    if (obj[key])
                    {
                        return ii;
                    }
                }
            }
            if (!$.isPlainObject(obj))
            {
                var obj2 = {};
                for (var ii in obj)
                {
                    obj2[ii] = obj[ii];
                }
                obj = obj2;
            }
        }
        var arr = {};
        for (var i in obj)
        {
            var type = typeof obj[i];
            if (type == 'string' || type == 'number' || type == 'boolean')
            {
                arr[i] = obj[i];
            }

            if (type == 'function')
            {
                var obj2 = {};
                var funcHasData = false;
                for (var ii in obj[i])
                {
                    funcHasData = true;
                    obj2[ii] = obj[i][ii];
                }
                if (funcHasData)
                {
                    arr[i] = obj2;
                }
            }


            if (type == 'object')
            {
                if (count > 5)
                {
                    return '_';
                }
                arr[i] = this.getArray(obj[i], count + 1);
            }
        }
        return arr;
    }

用法:GetLocalProperties(object); 或GetLocalProperties.getWindow();

GetLocalProperties = function(obj,parent_objects){
    var keys = Object.getOwnPropertyNames(obj);
    if (typeof parent_objects == 'object')
    {
        if (parent_objects.indexOf(obj) >= 0)
        {
            return 'recursive obj';
        }
        parent_objects = GetLocalProperties.copyArray(parent_objects);
    } else {
        parent_objects = [window];
    }
    //console.log(parent_objects.length);
    if (parent_objects.length > 10)
    {
        return 'depth greater than 10';
    }
    parent_objects.push(obj);
    var new_object = {};
    for (var key_i_key in keys)
    {
        var key_i = keys[key_i_key];
        var value_i = obj[key_i];
        var value_cloned = GetLocalProperties.getKeyValue(value_i,parent_objects);
        new_object[key_i] = value_cloned;
    }
    return new_object;
};
GetLocalProperties.getKeyValue = function (value_i,parent_objects)
{
    GetLocalProperties.last_value_i = value_i;
    GetLocalProperties.last_parent_objects = parent_objects;
    var type = typeof value_i;
    switch (type)
    {
        case 'object':
            if (!value_i)
            {
                return 'value_is_null';
            }
            if (Array.isArray(value_i))
            {
                //return value_i;
            }
            return GetLocalProperties(value_i,parent_objects);
        case 'boolean':
        case 'number':
        case 'string':
            return value_i;
    }
    return 'not_copied';

};
GetLocalProperties.copyArray = function(arr)
{
    var arr_new = [];
    for (var i in arr)
    {
        arr_new.push(arr[i]);
    }
    return arr_new;
};
GetLocalProperties.getWindow = function()
{
    return GetLocalProperties.getObjectClean(window);
};
GetLocalProperties.getObjectClean = function(obj)
{
    var a = GetLocalProperties(obj);
    for (var i in a)
    {
        var value_i = a[i];
        if (typeof value_i == 'string' && value_i == 'not_copied')
        {
            delete(a[i]);
        }
    }
    return a;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM