Метод ColdFusion cfc может определить свое собственное имя?

Просто измените <p> на <a href="">, а также измените p на a в CSS , попробуйте это, я надеюсь, это поможет вам. Благодарю

var open = false;

function Drop(n) {
    var i;
    if (open == false) {
        for (i = n; i < 5; i++) {
            Drp(i)
        }
        open = true
    } else if (open == true) {
        for (i = n; i < 5; i++) {
            Cls(i)
        }
        open = false
    }
}

function Drp(n) {
    var elem = document.getElementsByClassName("menu-con")[n];
    var pos = -1 * window.innerHeight - n * 100;
    var id = setInterval(frame, 5);

    function frame() {
        if (pos >= -10) {
            clearInterval(id);
            elem.style.top = 0 + 'px';
        } else {
            pos += 10;
            elem.style.top = pos + 'px';
        }
    }
}

function Cls(n) {
    var elems = document.getElementsByClassName("menu-con")[n];
    var poss = 0;
    var ids = setInterval(frames, 5);

    function frames() {
        if (poss <= -1 * window.innerHeight) {
            clearInterval(ids);
            elems.style.top = -1 * window.innerHeight + 'px';
        } else {
            poss += -7 - n * 2;
            elems.style.top = poss + 'px';
        }
    }
}
* {
    box-sizing: border-box;
    max-width: 100%;
    font-family: 'PT Sans Narrow', sans-serif;
    font-weight: bold;
}

html,
body {
    height: 100%;
    margin: 0;
    padding: 0;
    background-image: url(background.png);
    background-color: black;
}

.menu-icon {
    width: 50px;
    height: 50px;
    position: fixed;
    top: 0;
    right: 0;
    margin: 10px 15px;
    transform: scale(0.8);
    padding: 0;
    cursor: pointer;
    z-index: 20
}

.menu-bar {
    width: 50px;
    height: 5px;
    background: rgb(190, 190, 190);
    position: absolute;
    transition: all 0.3s;
    font-weight:bold;
    font-size:50px
}

.menu-bar1 {
    margin-top: 9px
}

.menu-bar2 {
    margin-top: 23px
}

.menu-bar3 {
    margin-top: 37px
}

.menu-icon.hover .menu-bar1 {
    -webkit-transform: rotate(45deg) scaleX(0.7);
    margin-top: 22px;
}

.menu-icon.hover .menu-bar2 {
    opacity: 0
}

.menu-icon.hover .menu-bar3 {
    -webkit-transform: rotate(-45deg) scaleX(0.7);
    margin-top: 22px;
}

.menu {
    width: 100%;
    height: 100%;
    display: -webkit-flex;
    display: flex;
    -webkit-flex-wrap: wrap;
    flex-wrap: wrap;
}

.menu-con {
    -webkit-flex-grow: 1;
    flex-basis: 0;
    flex-grow: 1;
    display: -webkit-flex;
    display: flex;
    -webkit-justify-content: space-around;
    position: relative;
    top: -100%;
    transition: all 0.5s
}

.menu-con a:before {
    content: "";
    display: block;
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    width: 100%;
    height: 100%;
    opacity: 1;
    background: rgba(0, 0, 0, 0);
    -webkit-transition: all 0.5s;
    transition: all 0.5s;
}

.menu-con:hover a:before {
    background: rgba(0, 0, 0, 0.2)
}

.menu-con a {
    height: 20px;
    -webkit-align-self: center;
    color: white;
    font-size: 25px;
    z-index: 2;
    text-decoration: none;
}

@media screen and (max-width: 600px) {
    .menu-con {
        min-width: 50%
    }
}

@media screen and (max-width: 350px) {
    .menu-con {
        min-width: 100%
    }
}
<html>
    <head>
    <title>Ben Cohen</title>
<link href=style.css rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=PT+Sans+Narrow" rel="stylesheet">
        <link href="animate.css" rel=stylesheet>
<script src="main.js"></script>
           </head>
    <body>
<div class="menu-icon" onclick="this.classList.toggle('hover');Drop(0)">
    <div class="menu-bar menu-bar1"></div>
    <div class="menu-bar menu-bar2"></div>
    <div class="menu-bar menu-bar3"></div>
</div>
 
<div class="menu">
    <div class="menu-con" style="background:red;">
        <a href="yayitworks.html">HOME</a>
    </div>
    <div class="menu-con" style="background:blue">
        <a href="">PORTFOLIO</a>
    </div>
    <div class="menu-con" style="background:darkorange;">
        <a href="">UNDECIDED</a>
    </div>
    <div class="menu-con" style="background:green;">
        <a href="">HOMEWORK</a>
    </div>
    <div class="menu-con" style="background:white;">
        <a href="" style="color:black">TEST PAGE</a>
    </div>
</div>
    </body>
</html>

13
задан James A Mohler 29 November 2012 в 22:29
поделиться

4 ответа

Я согласовываю w/tpryan. ColdSpring делает это очень легким. Однако вот другая альтернатива. Вместо того, чтобы анализировать отслеживание стека, можно проанализировать сам файл CFC.

<cffunction name="foo" displayname="foo" hint="this is just a test function" access="public" returntype="string">
    <cfset var test = getFunctionName(getMetaData().path, getPageContext().getCurrentLineNo()) />
    <cfreturn test />
</cffunction>

<cffunction name="getFunctionName" hint="returns the function name based on the line number" access="public" returntype="string">
    <cfargument name="filepath" type="string" required="true" />
    <cfargument name="linenum" type="any" required="true" />
    <cfset var line = "" />
    <cfset var functionName = "" />
    <cfset var i = 1 />
    <!---- loop over CFC by line ---->
    <cfloop file="#ARGUMENTS.filepath#" index="line">
        <cfif findNoCase('cffunction', line, 1)>
            <cfset functionName = line />
        </cfif>
        <cfif i EQ ARGUMENTS.linenum><cfbreak /></cfif>
        <cfset i++ />
    </cfloop>
    <!---- parse function name ---->
    <cfset functionName = REMatchNoCase("(\bname=[""|'])+[a-z]*[""|']", functionName) />
    <cfset functionName = REMatchNoCase("[""']+[a-z]*[""']", functionName[1]) />
    <cfset functionName = ReReplaceNoCase(functionName[1], "[""']", "", "all") />
    <!---- return success ---->
    <cfreturn functionName />
</cffunction>

Вышеупомянутое записано для ColdFusion 8. Добавленная поддержка CFLOOP цикличного выполнения по файлам линию за линией (и не читает весь файл в память). Я сделал несколько тестов, сравнивающих метод отслеживания стека по сравнению с парсингом файла. Оба работали одинаково хорошо на маленьком CFC, называемом непосредственно из единственного шаблона CFM. Очевидно, если у Вас есть очень большой CFCs, метод парсинга мог бы быть немного медленнее. С другой стороны, если у Вас есть большое отслеживание стека (как то, если Вы используете какую-либо из популярных платформ), затем, парсинг файла может быть быстрее.

- = Да здравствует ColdFusion = -

4
ответ дан 1 December 2019 в 23:48
поделиться

Таким образом, теперь 3 пути.

Если Вы используете ColdFusion 9.0 или выше существует теперь функция под названием GetFunctionCalledName (). Это возвратит то, что Вы ищете. http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WS7cc222be8a31a47d-6e8b7083122cebfc8f2-8000.html

ИЛИ

Используйте ColdSpring и Аспектно-ориентированное программирование (http://www.coldspringframework.org/coldspring/examples/quickstart/index.cfm?page=aop) для обработки этого для Вас.

ИЛИ

Используйте cfthrow для генерации отслеживания стека, которое имеет информацию для Вас:

<cffunction name="determineFunction" output="FALSE" access="public"  returntype="string" hint="" >
<cfset var functionName ="" />
<cfset var i = 0 />
<cfset var stackTraceArray = "" />
<cftry>
<cfthrow />
<cfcatch type="any">
    <cfset stacktraceArray = ListToArray(Replace(cfcatch.stacktrace, "at ", " | ", "All"), "|") />

    <!---Rip the right rows out of the stacktrace --->
    <cfloop index ="i" to="1" from="#ArrayLen(stackTraceArray)#" step="-1">
        <cfif not findNoCase("runFunction", stackTraceArray[i]) or FindNoCase("determineFunction", stackTraceArray[i])>
            <cfset arrayDeleteAt(stackTraceArray, i) />
        </cfif>
    </cfloop>

    <!---Whittle down the string to the func name --->
    <cfset functionName =GetToken(stacktraceArray[1], 1, ".") />
    <cfset functionName =GetToken(functionName, 2, "$")/>
    <cfset functionName =ReplaceNoCase(functionName, "func", "", "once")/>

    <cfreturn functionName />
</cfcatch>
</cftry></cffunction>

Моя рекомендация была бы использованием getFunctionCalledName, или если не на CF 9 ColdSpring, поскольку это, вероятно, купит Вас некоторые другие вещи.

11
ответ дан 1 December 2019 в 23:48
поделиться

Хорошо Вы могли бы попробовать это:

 <cffunction name="getFunctionName" returntype="any">
        <cfset meta =getMetaData(this)> 
        <cfreturn meta.functions[numberOfFunction].name>
    </cffunction>

Я попробовал различные вещи, и это не точно, поскольку функции, кажется, добавляются к массиву функций в обратном алфавитном порядке. Это кажется ограничением (и не решение проблемы). Я предположил бы, что некоторый собственный код Java мог быть вызван, но я испытываю необходимость для изучения этого.

Это и Это похожи на интересное чтение на связанных внутренних функциях.

Ре: другой ответ на coldspring. Я нашел это подробно статьей о функциональных метаданных с coldspring.

Связанный вопрос: Как получить название компонента, это расширяет мой в ColdFusion?

1
ответ дан 1 December 2019 в 23:48
поделиться

Я думал иначе, который мог работать.

Установите OnMissingMethod что-то вроде этого:

<cffunction name="onMissingMethod">
    <cfargument name="missingMethodName" type="string"> 
    <cfargument name="missingMethodNameArguments" type="struct">

    <cfset var tmpReturn = "">
    <cfset var functionToCallName = "Hidden" & Arguments.missingMethodName>
    <cfset arguments.missingMethodArguments.calledMethodName = Arguments.missingMethodName>
    <cfinvoke method="#functionToCallName#" argumentcollection="#Arguments.missingMethodArguments#" returnvariable="tmpReturn" />
    <cfreturn tmpReturn>
</cffunction>

Затем назовите каждый из обычных методов с префиксом ("Скрытым" в этом примере) и отметьте их как частных. Таким образом, мой начальный пример стал бы:

<cffunction name="HiddenisUsernameAvailable" access="private">
    <cfset logAccess(request.userid,Arguments.calledMethodName)>
    ......
</cffunction>

Теперь все вызовы будут прерваны onMissingMethod, который добавит имя метода к аргументам, которые передаются реальному методу.

Оборотные стороны, которые я вижу к этому, - то, что самоанализ больше не работает правильно, и необходимо использовать параметры, передаваемые по имени для вызывания всех функций. Если Вы не будете использовать параметры, передаваемые по имени, то args случайным образом изменит порядок в missingMethodNameArguments структуре.

1
ответ дан 1 December 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: