為了改善您的使用體驗,本網站正在進行維護,部分功能暫時無法使用。若本站的文件無法解決您的問題,想要向社群發問的話,請到 Twitter 上的 @FirefoxSupport 或 Reddit 上的 /r/firefox 發問,我們的社群成員將很快會回覆您的疑問。

搜尋 Mozilla 技術支援網站

防止技術支援詐騙。我們絕對不會要求您撥打電話或發送簡訊,或是提供個人資訊。請用「回報濫用」功能回報可疑的行為。

了解更多

JavaScript for loop ends prematurely when using String.length, why?

  • 6 回覆
  • 2 有這個問題
  • 12 次檢視
  • 最近回覆由 awasen

more options

Ok, I have this JavaScript code:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//current.value contains, e.g. /tmp/myFile.txt

var filename = "";

var tmp = "";

for (var j = 0; j < current.value.length; j++) {

tmp = current.value.substr(current.value.length-j,1);

if (tmp.length > 0) {

if ((tmp.charCodeAt(0) == 92) || (tmp.charCodeAt(0) == 47)) break;

filename = tmp + filename;

}

}

alert(filename);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

I want to get the file name out as "myFile.txt". This works fine in IE8 & 9, Chrome and Opera, but not in FireFox 4. In FF4 I always get "yFile.txt" as the loop ends one position sooner than all the other browsers.

(And, yes, I know this can be done using reg.exp. but due to a PHP bug I can not use the reg.exp. expression using \\ (double back-slashes) so I had to come up with a work-around).

Regards, Anders

Ok, I have this JavaScript code: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //current.value contains, e.g. /tmp/myFile.txt var filename = ""; var tmp = ""; for (var j = 0; j < current.value.length; j++) { tmp = current.value.substr(current.value.length-j,1); if (tmp.length > 0) { if ((tmp.charCodeAt(0) == 92) || (tmp.charCodeAt(0) == 47)) break; filename = tmp + filename; } } alert(filename); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ I want to get the file name out as "myFile.txt". This works fine in IE8 & 9, Chrome and Opera, but not in FireFox 4. In FF4 I always get "yFile.txt" as the loop ends one position sooner than all the other browsers. (And, yes, I know this can be done using reg.exp. but due to a PHP bug I can not use the reg.exp. expression using \\ (double back-slashes) so I had to come up with a work-around). Regards, Anders

由 cor-el 於 修改

所有回覆 (6)

more options

Try posting at the Web Development / Standards Evangelism forum at MozillaZine. The helpers over there are more knowledgeable about web page development issues with Firefox.
http://forums.mozillazine.org/viewforum.php?f=25
You'll need to register and login to be able to post in that forum.

more options

Thanks for taking time to respond!

I have created a thread there instead. Anyone who wants to follow it can find it here: http://forums.mozillazine.org/viewtopic.php?f=38&t=2207267&e=0

Regards, Anders

由 awasen 於 修改

more options

Maybe it is better to start with j=1 because strings start at 0 until length-1 and substr(current.value.length-0) is not defined.

  • current.value.substr(current.value.length-j,1);
more options

Thanks cor-el, you are correct, but unfortunately the issue is that the loop exits one "revolution" too soon. Like in my sample it bails out one character too soon so "abcd" becomes "bcd"...

Regards, Anders

more options

for (var j = 1; j <= current.value.length; j++)

more options
)

Well, the problem is with this line: if ((tmp.charCodeAt(0) == 92) || (tmp.charCodeAt(0) == 47)) break;

If it finds a front- or back-slash it should bail out from the for-loop. The problem is that it bails out one character too soon...

Regards, Anders