SkylineGlobe 邻近度(Proximity)分析JavaScript源代码

邻近度(Proximity)描述了地理空间中两个地物距离相近的程度,是空间分析的一个重要手段。

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>ToolTitle</title>

    <script language="javascript" src="ToolsCommon65.js"></script>

    <link rel="StyleSheet" href="Style.css" type="text/css">
    <style>
        .MenuButton
        {
            height: 78px;
            width: 65px;
            margin: 5px;
            white-space: normal;
        }
        .MenuButtonHighlight
        {
            color: Red;
            font-weight: bold;
        }
    </style>
</head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" style="border: 0;
    overflow: auto; background-color: #ffffff" id="Body" onload="Init()" onunload="Reset(0,0);DeleteTarget();">
    <!--oncontextmenu="return false;"  onclick="bHide=true;HideOptionsNow()" > -->
       <table border="0" width="100%" cellspacing="0" cellpadding="2">
        <tr>
            <td id="TopAreaTD" height="50px" width="100%" valign="middle" style="background-color: #CAD8E2">
                <table border="0" width="100%" cellspacing="0" cellpadding="0">
                    <tr>
                        <td width="12px"></td>
                        <td width="55px"><img src="images/ProximityIcon.gif" align="absmiddle" /></td>
                        <td id="TitleTD" align="center" class="s12b  i18n">ToolName</td>
                        <!--<td valign="top" align="right" id="CloseHelpTd"><img src="../CommonImg/help.gif" border="0" class="i18n" alt="help" title="help" onclick="DisplayHelpPopup6 (SGLang.i18nFile(‘help.html‘),SGLang.i18n(‘help‘))" style="cursor: pointer;"></td>-->
                    </tr>
                </table>
            </td>
        </tr>
        <tr height="1px">
            <td style="background-repeat: repeat-x;" background="../CommonImg/separator.gif">
            </td>
        </tr>
        <tr>
            <td>
                <br />
            </td>
        </tr>
    </table>
               <table border="0" cellspacing="1" cellpadding="3" bgcolor="#ffffff" class="s8" width="100%">
                    <tr >
                        <td class="s8b">
                            <label for="createAs" class="i18n">Text30</label>
                        </td>
                        <td align="left">
                        <input id="targetID"  type="text"  value="" style="width:100px" readonly="readonly"/>
<!--                        &nbsp;&nbsp;<button id="SetTargetFromSelected" type="button" onclick="SetTargetFromSelectedPress()"><span id="Span1" class="i18n">Text31</span></button>
                        &nbsp;&nbsp;<button id="CreateTarget" type="button" onclick="CreateTargetPress()"><span id="Span3" class="i18n">Text43</span></button>-->
                        <br />
                        <a id="SetTargetFromSelected" class="link i18n" onclick="SetTargetFromSelectedPress();">Text31</a> |
                        <a id="CreateTarget" class="link i18n" class="link" onclick="CreateTargetPress();">Text43</a></div>
                        </td>
                    </tr>
                    <tr class=‘TableOtherLine‘>
                        <td class="s8b">
                            <label for="createAs" class="i18n">Text32</label>
                        </td>
                        <td align="left">
                        <input id="trackedGroupID"  type="text"  value="" style="width:100px" readonly="readonly"/>
                        <!--&nbsp;&nbsp;<button id="SetGroupFromSelected" type="button" onclick="SetGroupFromSelectedPress()"><span id="Span2" class="i18n">Text31</span></button>-->
                        <br />
                        <a id="SetGroupFromSelected" class="link i18n" onclick="SetGroupFromSelectedPress();">Text31</a> <span id="Span1" >
                        </td>
                    </tr>
                   <tr >
                        <td align="top" class="s8b i18n">
                            <label for="createAs" class="i18n">Text33</label>
                        </td>
                        <td align="left">
                        <input id="warningRadiusID"  type="text"  value="700"  style="width:100px; background-color:#FFD7C1"/><label for="createAs" class="i18n">Text35</label>
                        </td>
                    </tr>
                    <tr class=‘TableOtherLine‘>
                        <td class="s8b">
                            <label for="createAs" class="i18n">Text34</label>
                        </td>
                        <td align="left">
                        <input id="dangerRadiusID"  type="text" value="300"  style="width:100px; background-color:#FFD7D7;"/><label for="createAs" class="i18n">Text35</label>
                        </td>
                    </tr>
                    <tr >
                        <td class="s8b">
                            <label for="createAs" class="i18n">Text42</label>
                        </td>
                        <td align="left">
                        <input id="chkTint" type="checkbox" style="width:20px;" onclick="bTint = document.getElementById(‘chkTint‘).checked;" checked="checked"/>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" valign="top" class="s8b i18n" align="center">

                    <button id="startStopButton" class="MenuButton" onclick="StartStop()"><img src="images/startCursor.gif" /><br /> <span id="startstopSpan" class="i18n">Text36</span></button> 

                        </td>
                        </tr>
    </table>

 <object id="SGWorld" classid="CLSID:3a4f9197-65a8-11d5-85c1-0001023952c1">    </object>

<script language="JavaScript">
function DetectTEMode()
{
var vMode = document.documentMode;
var rMode = ‘IE5 Quirks Mode‘;
if(vMode == 8){
  rMode = ‘IE8 Standards Mode‘;
} else if(vMode == 7){
  rMode = ‘IE7 Strict Mode‘;
} else if(vMode == 9){
  rMode = ‘IE9 Strict Mode‘;
}
//alert(‘Rendering in: ‘ + rMode);
}
DetectTEMode();

//***delete the uneeded ones at the end
var gDisplayHeadingSlope ;
var gDisplayMinMaxSlope ;
var gDisplayCoordinateInfo;
var gLastClickMouseX;
var gLastClickMouseY;
///var popupMsg;
var timeoutID;
var measureDistance;
var warningSlope;
var alertSlope;
var arrowMaxPositive;
var arrowMaxNegative;
var arrowHeading;
var labelMaxPositive;
var labelMaxNegative;
var labelHeading;
var labelCoordinateInfo;
var groupID;
var colorNormalPositive ;
var colorNormalNegative;
var colorHeading;
var colorLinewarning ;
var colorLineAlert;
var colorLabel;
var colorTextNormal;
var colorTextWarning;
var colorTextAlert;
var gNameIndex = 1;

var cameraClickPos;
var rootId;

//Proximity globals
var isStart = false;
var warningRadius;
var dangerRadius;
var targetObj;
var trackedObjArray = [];
var colorLineWarning;
var colorLineDanger;
var bTint = true;
var tmpGroup;
var bInPlaceTarget = false;
var manualTargetLabel;

//--------------
// Init
function Init() {

    targetObj = null;
    manualTargetLabel = null;

    SGWorld.AttachEvent("onFrame", onFrame);

    colorLineWarning = SGWorld.Creator.CreateColor(238, 173, 23, 255);
    colorLineDanger = SGWorld.Creator.CreateColor(255, 117, 117, 255);

    Reset(true, false);

    TargetPathNameParam = GetParamValue("TargetPathName", "");
    if (TargetPathNameParam != "")
        SetTargetFromPathName(TargetPathNameParam);
    else {
        if (SGWorld.ProjectTree.FindItem("Target") != 0)
            SetTargetFromPathName("Target");
    }

    TrackedGroupPathNameParam = GetParamValue("TrackedGroupPathName", "");
    if (TrackedGroupPathNameParam != "")
        SetTrackedGroupFromPathName(TrackedGroupPathNameParam);
    else {
        if (SGWorld.ProjectTree.FindItem("Tracked Group") != 0)
            SetTrackedGroupFromPathName("Tracked Group");
    }

    if (document.getElementById("targetID").value != "" && document.getElementById("trackedGroupID").value != "")
        StartStop();

}

//------------
//onFrame
function onFrame() {
    if (isStart == false || targetObj == null)
        return;

    displayProximityInfo();

}

//--------------
// SetTargetFromSelectedPress
function SetTargetFromSelectedPress() {
    var node = SGWorld.ProjectTree.GetNextItem("", 10);
    if (node == 0 || SGWorld.ProjectTree.IsGroup(node)) {
        alert(SGLang.i18n("Text38"));
        return;
    }
    SetTarget(node);
}

//--------------
// SetTargetFromPathName
function SetTargetFromPathName(pathName) {
    var node = SGWorld.ProjectTree.FindItem(pathName);
    if (node == 0 || SGWorld.ProjectTree.IsGroup(node)) {
        alert(SGLang.i18n("Text38"));
        return;
    }
    SetTarget(node);
}

//--------------
// SetTarget
function SetTarget(node) {

    try {
        var object = SGWorld.ProjectTree.GetObject(node);
        var targetPosition = object.Position;
        if (!targetPosition) {
            alert(SGLang.i18n("Text38"));
            return;
        }
        document.getElementById("targetID").value = object.TreeItem.Name;
        DeleteTarget();
        targetObj = object;
    }
    catch (err) {
        alert(SGLang.i18n("Text38"));
        return;
    }
}

//--------------
// CreateTargetPress
function CreateTargetPress() {
    if (!bInPlaceTarget) {
        bInPlaceTarget = true;
        SGWorld.AttachEvent("OnLButtonUp", CreateTarget);
        SGWorld.AttachEvent("OnRButtonUp", CreateTargetRButtonUp);
        SGWorld.AttachEvent("OnInputModeChanged", ResetCreateTarget);

        document.getElementById("CreateTarget").innerText = SGLang.i18n("Text46");

        SGWorld.Window.SetInputMode(1, abspath() + "/cursor_m.cur");
        SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text44"));
    }
    else {
        ResetCreateTarget();
    }
}

//--------------
// CreateTargetRButtonUp
function CreateTargetRButtonUp(Flags, X, Y) {
    ResetCreateTarget();
}

//--------------
// ResetCreateTarget
function ResetCreateTarget() {
    document.getElementById("CreateTarget").innerText = SGLang.i18n("Text43");

    SGWorld.DetachEvent("OnLButtonUp", CreateTarget);
    SGWorld.DetachEvent("OnInputModeChanged", ResetCreateTarget);
    bInPlaceTarget = false;
    SGWorld.Window.SetInputMode(0);
}

//--------------
// CreateTarget
function CreateTarget(Flags, X, Y) {
    var CursorCoord = SGWorld.Window.pixelToWorld(X, Y);
    if (CursorCoord == null)
        ResetCreateTarget();

    var imageLabelStyle = SGWorld.Creator.CreateLabelStyle(0);
    imageLabelStyle.Scale = 1.0;

    DeleteTarget();

    manualTargetLabel = SGWorld.Creator.CreateImageLabel(CursorCoord.Position, abspath() + "/Images/icon.png", imageLabelStyle, SGWorld.ProjectTree.HiddenGroupID, SGLang.i18n("Text45"));
    manualTargetLabel.SaveInFlyFile = false;
    document.getElementById("targetID").value = manualTargetLabel.TreeItem.Name;
    targetObj = manualTargetLabel;
    ResetCreateTarget();
}

//--------------
// DeleteTarget
function DeleteTarget() {
    if (manualTargetLabel != null) {
        SGWorld.Creator.DeleteObject(manualTargetLabel.ID);
        manualTargetLabel = null;
    }
}

//--------------
// SetGroupFromSelectedPress
function SetGroupFromSelectedPress() {
    var node = SGWorld.ProjectTree.GetNextItem("", 10);
    SetTargetGroup(node);
}

//--------------
// SetTrackedGroupFromPathName
function SetTrackedGroupFromPathName(pathName) {
    var node = SGWorld.ProjectTree.FindItem(pathName);
    SetTargetGroup(node);
}

//--------------
// SetGroupFromSelectedPress
function SetTargetGroup(nodeID) {
    var node = nodeID;
    /*To allow layers as well ViewshedQuery tool uses:     if (node == 0 || !(SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))) { */
    if (node == 0 || SGWorld.ProjectTree.IsLayer(node)) {
        alert(SGLang.i18n("Text39"));
        return;
    }
    if (SGWorld.ProjectTree.IsGroup(node)) {//group
        EmptytrackedObjArray();
        searchObjects2(node, AddObjectToArray);
        document.getElementById("trackedGroupID").value = SGWorld.ProjectTree.GetItemName(node);
    }
    else {//object
        var object = SGWorld.ProjectTree.GetObject(node);
        var trackedPosition = object.Position;
        if (!trackedPosition) {
            alert(SGLang.i18n("Text38"));
            return;
        }

        EmptytrackedObjArray();
        PushtrackedObj2Array(object);
        document.getElementById("trackedGroupID").value = object.TreeItem.Name;
    }

}

//--------------
// StartStop
function StartStop() {
    if (!isStart) {
        isStart = true;
        document.getElementById("targetID").disabled = true;
        document.getElementById("SetTargetFromSelected").disabled = true;
        document.getElementById("CreateTarget").disabled = true;
        document.getElementById("trackedGroupID").disabled = true;
        document.getElementById("SetGroupFromSelected").disabled = true;
        document.getElementById("warningRadiusID").disabled = true;
        document.getElementById("dangerRadiusID").disabled = true;
        document.getElementById("chkTint").disabled = true;

        startstopSpan.innerHTML = SGLang.i18n("Text37");

        warningRadius = document.getElementById("warningRadiusID").value;
        dangerRadius = document.getElementById("dangerRadiusID").value;

    }
    else {
        Reset(false, false);
    }

}

//------------------
// Reset
//------------------
function Reset(FirstTime, FromMouseInputMode) {

    try {
        startstopSpan.innerHTML = SGLang.i18n("Text36");
        if (isStart && SGWorld.Project.Name != "") {
            isStart = false;
            deleteObjs();
        }
        isStart = false;

        document.getElementById("targetID").disabled = false;
        document.getElementById("SetTargetFromSelected").disabled = false;
        document.getElementById("trackedGroupID").disabled = false;
        document.getElementById("SetGroupFromSelected").disabled = false;
        document.getElementById("warningRadiusID").disabled = false;
        document.getElementById("dangerRadiusID").disabled = false;
        document.getElementById("chkTint").disabled = false;
        document.getElementById("CreateTarget").disabled = false;
    }
    catch (err) { isStart = false; }
}

//-------------
// AddObjectToArray
function AddObjectToArray(object, type, altitudeType) {

    SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text40"));
    SGWorld.ProjectTree.EnableRedraw(0);

    if (type == 1) {
        //In the future may want to work on the pivot of the polyline. was: if (!DrawOnPolyline(geometry, type, altitudeType))
            return false;
    }
    else if (type == 2)
    {
        //In the future may want to work on the pivot of the polyline. was: if (!DrawOnPolygon(geometry, type, altitudeType))
            return false;
    }
    else // Selected points
    {
        PushtrackedObj2Array(object);
    }
    return true;
}

//-------------------
//searchObjects2 - modified from ToolsCommon65 searchGeometries
function searchObjects2(parentNode, callbackFunc) {
    SGWorld.ProjectTree.EnableRedraw(0);
    searchObjectsLeaf2(parentNode, callbackFunc);
    SGWorld.ProjectTree.EnableRedraw(1);
}
//-------------------
// searchObjectsLeaf2 - modified from ToolsCommon65 searchGeometriesLeaf2
function searchObjectsLeaf2(parentNode, callbackFunc) {

    if (SGWorld.ProjectTree.IsLayer(parentNode))  // Layer
    {
        var layer = SGWorld.ProjectTree.GetLayer(parentNode);
        var featureGroups = layer.FeatureGroups;
        for (var i = 0; i < featureGroups.Count; i++) // Traverse all sub-layers
        {
            var featureGroup = featureGroups.Item(i);
            var altitudeType = AltitudeMethodToAltitudeType(featureGroup.GetProperty("Altitude Method"));
            var features = featureGroup.Features;
            for (var j = 0; j < features.Count; j++) {
                var ret;
                if (featureGroup.GeometryType != 0)
                    ret = callbackFunc(features.Item(j).Geometry, featureGroup.GeometryType, altitudeType);
                else {
                    if (features.Item(j).Geometry.GeometryType == 0) // Point
                    {
                        var position = SGWorld.Creator.CreatePosition(features.Item(j).Geometry.X, features.Item(j).Geometry.Y, features.Item(j).Geometry.Z);
                        ret = callbackFunc(position, featureGroup.GeometryType, altitudeType);
                    }
                }
                if (!ret)
                    return;
            }
        }
    }
    else {
        var node = SGWorld.ProjectTree.GetNextItem(parentNode, 11);
        while (node != "") {
            if (SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))
                searchObjectsLeaf2(node, callbackFunc);
            else {
                var Object = SGWorld.Creator.GetObject(node);
                if (Object != null) {
                    var altitudeType = Object.Position.AltitudeType;
                    var ret;
                    if (Object.ObjectType == 1 || Object.ObjectType == 2)
                       ret = callbackFunc(Object/*.Geometry*/, Object.ObjectType, altitudeType);
                    else
                        ret = callbackFunc(Object/*.Position*/, Object.ObjectType, altitudeType);

                    if (!ret)
                        return;
                }
            }

            node = SGWorld.ProjectTree.GetNextItem(node, 13);
        }
    }
}

//--------------
// EmptytrackedObjArray
function EmptytrackedObjArray() {
    while (trackedObjArray.length > 0) {
        trackedObjArray.pop();
    }
}

//--------------
// PushtrackedObj2Array
function PushtrackedObj2Array(object) {
    trackedObjArray.push({
        "object": object,
        "lineObj": null,
        "distLabelObj": null,
        "level": "undefined"
    });
}

//------------
//deleteObjs
function deleteObjs() {//In the future move logic to deleteObj that can be called from here and from other places.
    try {
        //while (trackedObjArray.length > 0)
        for (var i = 0; i < trackedObjArray.length; i++) {
            //var item = trackedObjArray.pop();
            var item = trackedObjArray[i];
            if (item.lineObj != null) {
                SGWorld.Creator.DeleteObject(item.lineObj.ID);
                item.lineObj = null;
            }
            if (item.distLabelObj != null) {
                SGWorld.Creator.DeleteObject(item.distLabelObj.ID);
                item.distLabelObj = null;
            }
            item.level = "undefined";
            if (bTint) item.object.Terrain.Tint = SGWorld.Creator.CreateColor(0, 0, 0, 0);

        }
    }
    catch (err) { alert(SGLang.i18n("Text41") + err); Reset(0, 0); }
}

//------------
//displayProximityInfo
function displayProximityInfo() {
    //debugger;
    if (!isStart || targetObj == null ) {
        return false;
    }
    try {
        for (var i = 0; i < trackedObjArray.length; i++) {

            //calculate distance
            var dist = SGWorld.CoordServices.GetDistance3D(targetObj.Position, trackedObjArray[i].object.Position);
            if (dist <= warningRadius) {
                //Create/Update polygon
                if (trackedObjArray[i].lineObj == null) {
                    var absoluteTargetObj = targetObj.Position.ToAbsolute(0);
                    var absoluteTrackedObj = trackedObjArray[i].object.Position.ToAbsolute(0);
                    var pointsArray = [absoluteTargetObj.X, absoluteTargetObj.Y, absoluteTargetObj.Altitude, absoluteTrackedObj.X, absoluteTrackedObj.Y, absoluteTrackedObj.Altitude];
                    trackedObjArray[i].lineObj = SGWorld.Creator.CreatePolylineFromArray(pointsArray, colorLineDanger, 3, SGWorld.ProjectTree.HiddenGroupID); //leave this comment: ATC_TERRAIN_ABSOLUTE = 3
                    trackedObjArray[i].lineObj.SaveInFlyFile = false;
                    trackedObjArray[i].lineObj.SetParam(5440, 1);
                    trackedObjArray[i].lineObj.LineStyle.Width = -2
                }
                else {
                    trackedObjArray[i].lineObj.Geometry.StartEdit()
                    //update second point
                    var absolutePosition = trackedObjArray[i].object.Position.ToAbsolute(0);
                    trackedObjArray[i].lineObj.Geometry.Points.Item(1).X = absolutePosition.X;
                    trackedObjArray[i].lineObj.Geometry.Points.Item(1).Y = absolutePosition.Y;
                    trackedObjArray[i].lineObj.Geometry.Points.Item(1).Z = absolutePosition.Altitude;
                    trackedObjArray[i].lineObj.Geometry.EndEdit()
                }
                //Create/Update Text ***arik: Does it look good? what to do when below ground
                if (trackedObjArray[i].distLabelObj == null) {
                    var absoluteTargetObj = targetObj.Position.ToAbsolute(0);
                    var absoluteTrackedObj = trackedObjArray[i].object.Position.ToAbsolute(0);
                    var middlePosition = absoluteTargetObj.MoveToward(absoluteTrackedObj, dist / 2);
                    middlePosition.Altitude = middlePosition.Altitude + warningRadius / 40;

                    var labelStyle = SGWorld.Creator.CreateLabelStyle(0);
                    labelStyle.Bold = true;
                    //labelStyle.LineToGround = false;
                    labelStyle.Scale = warningRadius / 20;
                    labelStyle.FontSize = 10;

                    trackedObjArray[i].distLabelObj = SGWorld.Creator.CreateTextLabel(middlePosition, dist.toFixed(2), labelStyle, SGWorld.ProjectTree.HiddenGroupID);
                    trackedObjArray[i].distLabelObj.SaveInFlyFile = false;

                }
                else {
                    var absoluteTargetObj = targetObj.Position.ToAbsolute(0);
                    var absoluteTrackedObj = trackedObjArray[i].object.Position.ToAbsolute(0);
                    var middlePosition = absoluteTargetObj.MoveToward(absoluteTrackedObj, dist / 2);
                    middlePosition.Altitude = middlePosition.Altitude + warningRadius / 40;
                    trackedObjArray[i].distLabelObj.Position = middlePosition;
                    trackedObjArray[i].distLabelObj.Text = dist.toFixed(2);
                }

                //Color objects
                var newLevel = (dist > dangerRadius) ? "warning" : "danger";
                if (trackedObjArray[i].level != newLevel) {
                    trackedObjArray[i].lineObj.LineStyle.Color = (newLevel == "danger") ? colorLineDanger : colorLineWarning;
                    trackedObjArray[i].distLabelObj.Style.TextColor = (newLevel == "danger") ? colorLineDanger : colorLineWarning;
                    if (bTint) {
                        trackedObjArray[i].object.Terrain.Tint = (newLevel == "danger") ? colorLineDanger : colorLineWarning;
                        trackedObjArray[i].object.Terrain.Tint.SetAlpha(0.5);
                    }
                }

            }
            else {
                if (trackedObjArray[i].lineObj != null) {
                    SGWorld.Creator.DeleteObject(trackedObjArray[i].lineObj.ID);
                    trackedObjArray[i].lineObj = null;
                }
                if (trackedObjArray[i].distLabelObj != null) {
                    SGWorld.Creator.DeleteObject(trackedObjArray[i].distLabelObj.ID);
                    trackedObjArray[i].distLabelObj = null;
                }
                trackedObjArray[i].object.Terrain.Tint = SGWorld.Creator.CreateColor(0, 0, 0, 0);
            }

        }

    }
    catch (err) { alert(SGLang.i18n("Text41") + err); Reset(0, 0); }
}

</script>

</body>
</html>
时间: 2024-08-07 07:28:16

SkylineGlobe 邻近度(Proximity)分析JavaScript源代码的相关文章

Pongo网页版JavaScript源代码及设计思路

1.游戏背景介绍(写在前面的废话): 五月初的某天,看到某网推荐了这款游戏,Pongo,看着还不错的样子就用ipad下下来试玩了下,玩了两局感觉还错挺过瘾的,因为是手欠类游戏嘛大家懂的. 但是没一会发现游戏在ipad似乎有些bug,玩一会就会卡住然后只能强退了,真是揪心,记录还等着破呢. 怎么办?玩游戏不如玩自己的游戏的念头又邪恶的出现了,然后就把pad丢给了朋友虐心去,我默默回到电脑前开始动手自己写个不会卡的. 大概两小时吧,写出了基本框架,然后扔sinaapp里试了下效果基本能玩就洗洗睡了.

ExtJs中disabled和readOnly美观度的分析

ExtJs中disabled和readOnly美观度的分析 ExtJs中,如果设置输入框为只读属性,一般第一考虑的都是readonly=true 它的效果和正常输入框一样,但是不允许输入: 然而,它很容易引起歧义,让用户第一感觉是它是输入框,有输入信息的冲动,其实不然: 这时候,可以考虑使用disabled=true属性 这下绝对不会认为可输入,一看就知道不允许修改,但字体颜色明显很模糊,所以效果不佳: 因此,使用中常常仍然使用readOnly=true,但修改背景颜色来做到disabled的更

Memcached源代码分析 - Memcached源代码分析之消息回应(3)

文章列表: <Memcached源代码分析 - Memcached源代码分析之基于Libevent的网络模型(1)> <Memcached源代码分析 - Memcached源代码分析之命令解析(2)> <Memcached源代码分析 - Memcached源代码分析之消息回应(3)  > <Memcached源代码分析 - Memcached源代码分析之HashTable(4) > <Memcached源代码分析 - Memcached源代码分析之增删

通过分析 JDK 源代码研究 TreeMap 红黑树算法实现

TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点. TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializab

C#/vbscript/JS如何加密保护HTML/javascript源代码

原文地址:http://www.coding123.net/article/20121008/encrypt-javascript-by-charp-vbscript.aspx 本文通过将源代码进行unicode转换后进行混淆加密,对HTML或者javascript源代码进行加密,将内容转换为一些看似乱码的内容,然后通过客户端的JS脚本反相解析回来. HTML/javascript源代码加密混淆算法 1)ASCII编码内可见字符[33~126],33~79进行+47操作操作,80~126进行-4

【转】console.time 简单分析javascript动态添加Dom节点的性能

本文代码约定 1 el: 指的是增加直接点的DOM节点 2 totalNum: 为100000(值越大越能体现差距)指的是循环创建的DOM节点 3 for(var i=0;i<totalNum;i++){}: 我们用for来表示就好了,简写代码 如果叫你用javascript动态增加DOM节点,你有哪几种思路呢? 1 .使用innerHTML和字符串拼接 console.time("time1"); var str = ""; for{ str += &quo

console.time 简单分析javascript动态添加Dom节点的性能

Bullshit 本来想每天都更新下博客的,但是最近要考试,还有就是自己还是停留在暗自窃喜中吧(这种想法要改变).其实最近总在想,自己要怎么去管理自己的数据,每天的生活都是对自己的数据的增删查改.昨天把自己的电脑重装了,确实很多软件的存放要改地方了,之前不知道怎么去管理软件安装,所以放得乱七八糟的.说好一大堆废话之后,我最后再说一遍,管好自己的时间.数据真的比你学习东西重要. Method 本文代码约定 1 el: 指的是增加直接点的DOM节点 2 totalNum: 为100000(值越大越能

JS高级调试技巧:捕获和分析 JavaScript Error详解

前端工程师都知道 JavaScript 有基本的异常处理能力.我们可以 throw new Error(),浏览器也会在我们调用 API 出错时抛出异常.但估计绝大多数前端工程师都没考虑过收集这些异常信息 反正只要 JavaScript 出错后刷新不复现,那用户就可以通过刷新解决问题,浏览器不会崩溃,当没有发生过好了.这种假设在 Single Page App 流行之前还是成立的.现在的 Single Page App 运行一段时间后状态复杂无比,用户可能进行了若干输入操作才来到这里的,说刷新就

Java提高篇——通过分析 JDK 源代码研究 Hash 存储机制

阅读目录 通过 HashMap.HashSet 的源代码分析其 Hash 存储机制HashMap 的存储实现Hash 算法的性能选项HashMap 的读取实现HashSet 的实现 HashMap 和 HashSet 是 Java Collection Framework 的两个重要成员,其中 HashMap 是 Map 接口的常用实现类,HashSet 是 Set 接口的常用实现类.虽然 HashMap 和 HashSet 实现的接口规范不同,但它们底层的 Hash 存储机制完全一样,甚至 H