settimeout函数中定义的变量在函数外部返回undefined

时间:2017-03-28 11:22:26

标签: javascript jquery salesforce charactercount

请找到以下代码:

setTimeout(function() {
var objTextareaText = objTextArea.innerText;
var normalizedText = objTextareaText;
                        if (!countSpacesAsChars) {
                            normalizedText = objTextareaText.replace(/\s/g,"").replace(/ /g, "");}
                        strText = normalizedText.replace(/(\r\n|\n|\r)/gm,    "").replace(/ /gi, " ");         
                        //Strip Html tags
                        strText = normalizedText.replace(/(<([^>]+)>)/ig,"").replace(/^([\t\r\n]*)$/, "");
                    }, 50);
if (strText.length >= MaxLength) {

}

从上面的if语句strText返回为undefined。

此外,如果我在settimeout函数中包含if语句,如下所示:

setTimeout(function() {
    var objTextareaText = objTextArea.innerText;
                var normalizedText = objTextareaText;
                if (!countSpacesAsChars) {
                    normalizedText = objTextareaText.replace(/\s/g,    "").replace(/&nbsp;/g, "");
                }
                strText = normalizedText.replace(/(\r\n|\n|\r)/gm, "").replace(/&nbsp;/gi, " ");         
                //Strip Html tags
                strText =         normalizedText.replace(/(<([^>]+)>)/ig,"").replace(/^([\t\r\n]*)$/, "");

                if ((e.data.domEvent.$.keyCode === 8) ||     (e.data.domEvent.$.keyCode === 46) || ((e.data.domEvent.$.shiftKey) 
                    && (e.data.domEvent.$.keyCode === 36)) || ((e.data.domEvent.$.shiftKey) && (e.data.domEvent.$.keyCode === 35)) 
                    || (e.data.domEvent.$.keyCode === 35) || (e.data.domEvent.$.keyCode === 36) || (e.data.domEvent.$.keyCode === 37) 
                    || (e.data.domEvent.$.keyCode === 38) || (e.data.domEvent.$.keyCode === 39) || (e.data.domEvent.$.keyCode === 40)) {
                    showCharacterCount();
                    e.cancelBubble = false;
                    e.returnValue = true;
                    return true;
                }
                // Reaches Max Length - Shows error MAX_VALUE Reached Error Msg.
                if (strText.length >= MaxLength) {
                    showCharacterCount();
                    e.cancelBubble = true;
                    e.returnValue = false;
                    e.cancel();
                    e.stop();
                    return false;
                } else {
                    showCharacterCount(strText);
                    e.cancelBubble = false;
                    e.returnValue = true;
                    return true;
                }
          }, 50);

通过上述方式,关键事件存在问题。

e.cancelBubble = true;
e.returnValue = false;
                    e.cancel();
                    e.stop();
                    return false;

这些代码不起作用。

所以请建议一个解决方案。 请注意:应该使用Settimeout函数,因为我在salesforce中获得了RTF中字符的数量。

1 个答案:

答案 0 :(得分:1)

使用下面的代码,因为Closure已添加到setTimeout

setTimeout(function() {

var objTextareaText = objTextArea.innerText;
var normalizedText = objTextareaText;
                        if (!countSpacesAsChars) {
                            normalizedText = objTextareaText.replace(/\s/g,"").replace(/&nbsp;/g, "");}
                        strText = normalizedText.replace(/(\r\n|\n|\r)/gm,    "").replace(/&nbsp;/gi, " ");         
                        //Strip Html tags
                        strText = normalizedText.replace(/(<([^>]+)>)/ig,"").replace(/^([\t\r\n]*)$/, "");



//change below code line as closure
  }(), 50);


// now strText is not undefined 
if (strText.length >= MaxLength) {

 }

如果要在其外部使用setTimeout变量值,则可以使用闭包函数,因为它(一个闭包函数)可以访问外部,内部和内部函数。更多信息,请访问closure function