Solved

Javascript array loop function not working

Posted on 2009-07-16
10
370 Views
Last Modified: 2013-11-19
I have some areas on my page with tinyMCE editors. I need to loop through the areas and return some values in an array.

I have to perform a few function inside of the loop as well such as removing unneeded content and replacing some invalid characters.

Here is what I have. It is currently not working.

Thank you for your help!
function removeElement(parentElm, childDiv){
	if (document.getElementById(childDiv)) {     
		var child = document.getElementById(childDiv);
		var parent = document.getElementById(parentElm);
		parent.removeChild(child);
	}
}
 
function getElementsByClass(node,searchClass,tag) {
var classElements = new Array();
var els = node.getElementsByTagName(tag); // use "*" for all elements
var elsLen = els.length;
var pattern = new RegExp("\\b"+searchClass+"\\b");
for (i = 0, j = 0; i < elsLen; i++) {
 if ( pattern.test(els[i].className) ) {
 classElements[j] = els[i];
 j++;
 }
}
return classElements;
}
//this script gets the contents of the edit areas
function areaGetContents(){
	var i;
	var contentAreas = getElementsByClass(document,'contentArea','*');
	var fullContent = new Array();
	for (i=1; i<=contentAreas.length; i++) {
		 document.getElementById('editorArea_'+i).innerHTML = tinyMCE.get('editorArea_'+i).getContent();
		 removeElement('contentArea_'+i,'editorArea_'+i+'_parent');
		 fullContent[i] = contentAreas[i].innerHTML;
		 var divModStart = fullContent[i].replace(/<textarea style="display: none;"/g, '<div');
	 	 var divModEnd = divModStart.replace(/textarea>/g, 'div>');
 		 var ltMod = divModEnd.replace(/\&lt;/g, '<');
		 var gtMod = ltMod.replace(/\&gt;/g, '>');
		 fullContent[i] = gtMod;
	     alert(fullContent[i]);
	}
}

Open in new window

0
Comment
Question by:Shaye Larsen
  • 5
  • 3
  • 2
10 Comments
 
LVL 82

Accepted Solution

by:
hielo earned 400 total points
ID: 24874375
>>for (i=1; i<=contentAreas.length; i++)
You probably meant:

"less than" NOT "less than or equal to". Also, arrays are 0-indexed:
for (i=0; i<contentAreas.length; i++)
0
 
LVL 1

Author Comment

by:Shaye Larsen
ID: 24875124
K, I made changes to do that, but it still doesn't work.

I am getting the following error on line 5 that has

parent.removeChild(child);


error from firebug:

Error: uncaught exception: [Exception... "Node was not found"  code: "8" nsresult: "0x80530008 (NS_ERROR_DOM_NOT_FOUND_ERR)"  location: "http://fabuso/js/sitecreator_edit_page_scripts.js Line: 82"]
0
 
LVL 82

Assisted Solution

by:hielo
hielo earned 400 total points
ID: 24875547
>>"Node was not found"
There's the reason. Within your loop you are doing:
removeElement('contentArea_'+i,'editorArea_'+i+'_parent');
 
So, when i=0, you are actually calling:
removeElement('contentArea_0','editorArea_0_parent');
 
So, do you have some element with id="contentArea_0" and also WITHIN that element you need some other element with id="editorArea_0_parent".
 
The same rationale applies when i=1, etc. I can't tell you more since you didn't post much. If you have a link to your page, please post it.

Open in new window

0
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 
LVL 1

Author Comment

by:Shaye Larsen
ID: 24875840
Yeah, I have those elements with those IDs. Tomorrow I'll get in a make a test page, its on my local system.
0
 
LVL 12

Assisted Solution

by:Barry Jones
Barry Jones earned 100 total points
ID: 24879259
Are you sure that the child is a child of the parent that you are passing in?

Why not let the removeElement() function determine the parent?
removeElement = function(ele){
	var ele_ret = ele;
	if (ele && (ele.parentNode)){ele.parentNode.removeChild(ele);}
	return ele_ret;
}

Open in new window

0
 
LVL 12

Expert Comment

by:Barry Jones
ID: 24879271
Also, your removeElement() function expects the parent passed in first, and in your code it appears that you have reversed the order of the parameters:
removeElement('contentArea_'+i,'editorArea_'+i+'_parent');

Open in new window

0
 
LVL 1

Author Comment

by:Shaye Larsen
ID: 24879400
Yeah, the naming convention would make it seem like so. tinyMCE produces a lot of markup when they convert your textareas into editors. Since I have multiple areas on one page it produces the topmost element for the new tinyMCE markup as editorArea_0_parent, editorArea_1_parent, editorArea_2_parent, etc. My elms that contain the tinyMCE editors all have a class of 'contentArea' and an id that is contentArea_0, contentArea_1, contentArea_2 respectively.
0
 
LVL 12

Expert Comment

by:Barry Jones
ID: 24879590
Ah ok...
0
 
LVL 1

Author Comment

by:Shaye Larsen
ID: 24981890
I resorted to using jQuery and that made everything simple and fixed whatever was going wrong. Thanks for you help!
0
 
LVL 1

Author Closing Comment

by:Shaye Larsen
ID: 31604423
Thank you!
0

Featured Post

Active Directory Webinar

We all know we need to protect and secure our privileges, but where to start? Join Experts Exchange and ManageEngine on Tuesday, April 11, 2017 10:00 AM PDT to learn how to track and secure privileged users in Active Directory.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

What is Node.js? Node.js is a server side scripting language much like PHP or ASP but is used to implement the complete package of HTTP webserver and application framework. The difference is that Node.js’s execution engine is asynchronous and event…
This article discusses how to create an extensible mechanism for linked drop downs.
Learn how to match and substitute tagged data using PHP regular expressions. Demonstrated on Windows 7, but also applies to other operating systems. Demonstrated technique applies to PHP (all versions) and Firefox, but very similar techniques will w…
The viewer will learn how to count occurrences of each item in an array.

829 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question