我有一些变量,我想在函数调用之间保留它们的值,任何人都可以分享如何在 javascript 中执行此操作。我曾尝试使用全局变量,但这无济于事。非常感谢帮助,例如在下面的代码中,每当调用内部函数跳转时,警报值总是相同的,它不会为每个函数调用增加。警报(this.prevVal);和警报(this.currentVal);
// We're using a global variable to store the number of occurrences
var MyApp_SearchResultCount = 0;
var currSelected = 0;
var countStr = 0;
//var prevEl,el;
// helper function, recursively searches in elements and their child nodes
function MyApp_HighlightAllOccurencesOfStringForElement(element,keyword) {
if (element) {
if (element.nodeType == 3) { // Text node
while (true) {
var value = element.nodeValue; // Search for keyword in text node
var idx = value.toLowerCase().indexOf(keyword);
if (idx < 0) break; // not found, abort
var span = document.createElement("span");
var text = document.createTextNode(value.substr(idx,keyword.length));
span.appendChild(text);
span.setAttribute("class","MyAppHighlight");
span.style.backgroundColor="yellow";
span.style.color="black";
text = document.createTextNode(value.substr(idx+keyword.length));
element.deleteData(idx, value.length - idx);
var next = element.nextSibling;
element.parentNode.insertBefore(span, next);
element.parentNode.insertBefore(text, next);
element = text;
window.MyApp_SearchResultCount++; // update the counter
//countStr = MyApp_SearchResultCount;
}
} else if (element.nodeType == 1) { // Element node
if (element.style.display != "none" && element.nodeName.toLowerCase() != 'select') {
for (var i=element.childNodes.length-1; i>=0; i--) {
MyApp_HighlightAllOccurencesOfStringForElement(element.childNodes[i],keyword);
}
}
}
}
}
// the main entry point to start the search
function MyApp_HighlightAllOccurencesOfString(keyword) {
alert("test");
//MyApp_RemoveAllHighlights();
MyApp_HighlightAllOccurencesOfStringForElement(document.body, keyword.toLowerCase());
alert(window.MyApp_SearchResultCount);
}
// helper function, recursively removes the highlights in elements and their childs
function MyApp_RemoveAllHighlightsForElement(element) {
if (element) {
if (element.nodeType == 1) {
if (element.getAttribute("class") == "MyAppHighlight") {
var text = element.removeChild(element.firstChild);
element.parentNode.insertBefore(text,element);
element.parentNode.removeChild(element);
return true;
} else {
var normalize = false;
for (var i=element.childNodes.length-1; i>=0; i--) {
if (MyApp_RemoveAllHighlightsForElement(element.childNodes[i])) {
normalize = true;
}
}
if (normalize) {
element.normalize();
}
}
}
}
return false;
}
// the main entry point to remove the highlights
function MyApp_RemoveAllHighlights() {
window.MyApp_SearchResultCount = 0;
MyApp_RemoveAllHighlightsForElement(document.body);
}
function goNext(){
jump(1);
}
function goPrev(){
jump(-1);
}
var prevSelected = 0;
var currSelectedGlo = 0;
this.prevVal = 0;
this.currentVal = 0;
function jump(howHigh){
this.prevVal = this.currentVal;
this.currentVal = this.currentVal + 1;
alert(this.prevVal);
alert(this.currentVal);
prevSelected = currSelected;
currSelected = currSelected + howHigh;
//window.currSelectedGlo = currSelected + howHigh;
//currSelected = window.currSelectedGlo;
//alert("prevSelected" +prevSelected);
//alert("window.currSelected "+ currSelected);
//alert(window.MyApp_SearchResultCount);
//alert(currSelected);
if (currSelected < 0){
currSelected = window.MyApp_SearchResultCount + currSelected;
}
if (currSelected >= window.MyApp_SearchResultCount){
currSelected = currSelected - window.MyApp_SearchResultCount;
}
prevEl = document.getElementsByClassName("MyAppHighlight")[prevSelected];
//alert(window.prevEl);
if (prevEl){
prevEl.style.backgroundColor="yellow";
}
el = document.getElementsByClassName("MyAppHighlight")[currSelected];
el.style.backgroundColor="green";
el.scrollIntoView(true); //thanks techfoobar
}
谢谢 djrecker