Проблем с JS масив

primecode

Active Member
Здравейте,
имам един проблем с масиви в JS с които не успявам да се оправя няколко часа, а вероятно проблема е в нещо дребно. Все пак ще питам тук.

Имам форма в която извеждам държави, като пред всяка от тях имам checkbox и съответно той е checked или не за определени държави.

Пример:
Код:
<input type="checkbox" name="iso[]" value="'.$iso.'" checked /> Bulgaria
<input type="checkbox" name="iso[]" value="'.$iso.'" /> Burkina Faso

Съответно с jQuery съм задал след натискане на бутона на формата да се направи проверка кои държави са маркирани и кои не. Т.е. преди натискане на бутона може дадена отметка да бъде премахната или сложена.

$('#SubscribeTo').live('click', function() {
var iso = new Array();
$('#fm-notice-scroll input:checked').each(function() {
if ( $(this).is(':checked') ) {
var c = $(this).val();
iso.push(c);
}
});
});

Проблема е в това, че със:
alert(iso);
след тази проверка се извеждат всички държави които са били селектирани още при извеждане на формата + тези които след това са били селектирани или останалите с отметка.

Например, както показвах по-горе 2-те checkbox полета, ако сложа отметка на Burkina Faso ще получа BG, BG, BF a ако махна отметка от Bulgaria ще имам BG.

Благодаря предварително на отзовалите се и се надявам се да съм бил достатъчно ясен.
 
От: Проблем с JS масив

Код:
var iso = $('#fm-notice-scroll input[type="checkbox"]:checked').map(function () {
  return $(this).val();
}).get();

Това ще ти върне масив от рода на ['Bulgaria', 'USA', ..]

Иначе твоят код трябва да изглежда така, че да работи както се очаква.
Код:
var iso = new Array();
$('#SubscribeTo').live('click', function() {
$('#fm-notice-scroll input:checked').each(function() {
iso.push( $(this).val() );
}
});
});
 
От: Проблем с JS масив

По предложения начин имам същият проблем.
Избрани са ми AL,BG,IN,US,IN,US при положение, че съм махнал отметките на Albania и Bulgaria. T.e. селектираните си излизат + тези които се селектират или са с махната селекция.

А относно кода, това, че съм направил още една проверка - да, знам, че е безсмислено но от толкова опити какви ли не неща опитвах.
 
От: Проблем с JS масив

Няма как да ти дава всичките. Дай линк към страницата, така само може да се гадае, защо не ти работи.
 
От: Проблем с JS масив

Прасни HTML и JS кода в jsfiddle и кажи какво искаш да стане като хората.
 
От: Проблем с JS масив

Кода ти в първия пост прави точно това, което си описал. Събира в масив стойностите на всички чекбоксове, които са избрани.
Но не стана ясно, какво се очаква в същност да се случи.
 
От: Проблем с JS масив

Благодаря за отзивите, но още нямам напредък.

Ето пример в който показвам същия проблем ТУК
Сложил съм 4 държави, като 2 от тях са селектирани и 2 не са. Без значение кои отметки ще се поставят или махнат, то в крайна сметка ми излизат 2-те селектирани + други такива ако има. Т.е. ако 2-те селектирани си останат така ще излязат 2-те селектирани + себе си. Ако не ме разбирате - вижте примерната страница която давам.
 
От: Проблем с JS масив

Проблема ти е в зад клавиатурното устройство.
Запитвал ли си се защо имаш два пъти съдържанието на елемента с ID fm-notice-scroll ?
 
От: Проблем с JS масив

Проблема ти е в зад клавиатурното устройство.
Запитвал ли си се защо имаш два пъти съдържанието на елемента с ID fm-notice-scroll ?
Не те разбрах, не виждам да го имам 2 пъти.
 
От: Проблем с JS масив

Код:
<html xmlns="http://www.w3.org/1999/xhtml"><head>
	<title>JS Arrays</title>
	<link rel="stylesheet" href="main.css" type="text/css" media="screen">
	<script type="text/javascript" src="jquery-1.7.2.min.js"></script>
	<script type="text/javascript" src="events.js"></script>
</head>
<body>
	<div id="Subscribes">
		<form id="form-subscribes" method="post" action="manage-offers.php?msg=7">
		<input name="subscribes" type="hidden">
		<input name="s_cnt" id="s_cnt" value="" type="hidden">
		<input name="s_id" id="s_id" value="" type="hidden">
		<div id="fm-header">Subscribe to all offers from list</div>
		<div id="fm-notice-scroll">
			<table width="100%"><tbody><tr>
			</tr><tr><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="BG" checked="" type="checkbox"> Bulgaria</td><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="RO" type="checkbox"> Romania</td></tr><tr><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="IT" type="checkbox"> Italy</td><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="US" checked="" type="checkbox"> United States</td>			</tr></tbody></table>
		</div>
		<div id="fm-button" style="text-align:center;">
			<br>
			<a href="javascript:void(0);" class="fm-button" id="SubscribeTo">Subscribe/Unsubscribe to a selected countries</a>
		</div>
		</form>
	</div>
	
	<input id="opener" value="Open" onclick="SubscribeToOffersFrom();" type="button">
	
	<div style="position: fixed; left: 710px; top: 150px; display: block;" id="large">
		<div id="inner-code">
		<form id="form-subscribes" method="post" action="manage-offers.php?msg=7">
		<input name="subscribes" type="hidden">
		<input name="s_cnt" id="s_cnt" value="" type="hidden">
		<input name="s_id" id="s_id" value="" type="hidden">
		<div id="fm-header">Subscribe to all offers from list</div>
		<div id="fm-notice-scroll">
			<table width="100%"><tbody><tr>
			</tr><tr><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="BG" checked="" type="checkbox"> Bulgaria</td><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="RO" type="checkbox"> Romania</td></tr><tr><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="IT" type="checkbox"> Italy</td><td style="white-space:nowrap; padding:1px 10px 1px 0px;" width="50%"><input name="ISO[]" value="US" checked="" type="checkbox"> United States</td>			</tr></tbody></table>
		</div>
		<div id="fm-button" style="text-align:center;">
			<br>
			<a href="javascript:void(0);" class="fm-button" id="SubscribeTo">Subscribe/Unsubscribe to a selected countries</a>
		</div>
		</form>
	</div>
		<br style="clear:both;">
	</div>
	<div style="opacity: 0.5; display: block;" id="background"></div>
	


</body></html>

Брой. Има го точно два пъти.
 
От: Проблем с JS масив

Не знам през какво го гледаш. Това явно ти вкарва и css-a в html-a защото половината неща са от там. Ще ти пусна целия сорс на index.php файла да кажеш къде е това повторение:

Код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>JS Arrays</title>
	<link rel="stylesheet" href="main.css" type="text/css" media="screen" />
	<script type='text/javascript' src='jquery-1.7.2.min.js'></script>
	<script type='text/javascript' src='events.js'></script>
</head>
<body>
	<div id="Subscribes">
		<form id="form-subscribes" method="post" action="manage-offers.php?msg=7<?php echo $action;?>">
		<input type="hidden" name="subscribes" />
		<input type="hidden" name="s_cnt" id="s_cnt" value="" />
		<input type="hidden" name="s_id" id="s_id" value="<?php echo $_SESSION['userid'];?>" />
		<div id="fm-header"></div>
		<div id="fm-notice-scroll">
			<table width="100%"><tr>
			<?php
				$i = 1;
				$countries = array('BG'=>'Bulgaria', 'RO'=>'Romania', 'IT'=>'Italy', 'US'=>'United States');
				$subsCountries = array('BG', 'US');
				foreach ( $countries as $iso => $cname ) {
					if ( $i % 2 ) {
						echo '</tr><tr>';
					}
					echo '<td width="50%" style="white-space:nowrap; padding:1px 10px 1px 0px;">';
					echo '<input type="checkbox" name="ISO[]" value="'.$iso.'" ';
					//if ( in_array($cname, $myCountries) ) {
					if ( in_array($iso, $subsCountries) ) {
						echo 'checked';
					}
					echo '/> ' . $cname . '</td>';
					$i++;
				}
			?>
			</tr></table>
		</div>
		<div id="fm-button" style="text-align:center;">
			<br />
			<a href="javascript:void(0);" class="fm-button" id="SubscribeTo">Subscribe/Unsubscribe to a selected countries</a>
		</div>
		</form>
	</div>
	
	<input type="button" id="opener" value="Open" onclick="SubscribeToOffersFrom();" />
	
	<div id="large">
		<div id="inner-code"></div>
		<br style="clear:both;" />
	</div>
	<div id="background"></div>
	
</body>
</html>
 
От: Проблем с JS масив

Прав си @AMitrev
Дублира се след клик на бутона. Това е защото имам един скрит div долу:
Код:
<div id="large">
		<div id="inner-code"></div>
		<br style="clear:both;" />
	</div>
	<div id="background"></div>
След клик, всичко от <div id="Subscribes">....</div> се взима и поставя в него и затова става дублирането. Ще търся начин, но съм отворен за идеи.
 
От: Проблем с JS масив

Проблема е решен. Както и предполагах, в крайна сметка всичко е от недоглеждане.
Замених:
Код:
$('#fm-notice-scroll input:checked').each(function() {
Със:
Код:
$('#inner-code #fm-notice-scroll input:checked').each(function() {
и проблема е решен.
Благодаря на всички за помощта.
 
От: Проблем с JS масив

То е ясно, че съм прав.
Ако ти се налага занапред да се занимаваш с JS, то инстсалирай си правилните добавки за браузъра да ти е лесен живота и не прави сложнотии! Простите решения винаги са най добри.
 

Горе