I have a table below which contains a textbox and next to the textbox it contains a hyperlink known as “Open Grid”. If the user clicks on this link, it opens up a grid and on this grid it displays number buttons from 3 – 26.
<table id="optionAndAnswer" class="optionAndAnswer">
<tr class="option">
<td>1. Option Type:</td>
<td>
<div class="box">
<input type="text" name="gridValues" class="gridTxt maxRow" id="mainGridTxt" readonly="readonly" />
<span href="#" class="showGrid" id="showGridId">[Open Grid]</span>
</div>
<table class="optionTypeTbl">
<tr>
<tr><td><input type="button" value="3" id="btn3" name="btn3Name" class="gridBtns gridBtnsOff">
<input type="button" value="4" id="btn4" name="btn4Name" class="gridBtns gridBtnsOff">
<input type="button" value="5" id="btn5" name="btn5Name" class="gridBtns gridBtnsOff">
<input type="button" value="6" id="btn6" name="btn6Name" class="gridBtns gridBtnsOff">
//...goes all the way to btn26
</tr>
</table>
</td>
</tr>
</table>
Now the code below is able to trigger one of the grid buttons to state that a grid button is clicked. This code is below:
$('#btn'+gridValues).trigger('click');
Now everything above is fine.
THE PROBLEM:
The issue I have is that a user can add a row containing the same template as the option control on top. But within this option and answer control, the user can change an option type if they wish by clicking on one of the grid buttons in this template. So my question is that how do I write the .trigger() to correctly point to a grid button within this template? If you look at the above code, it users the button’s id, but if you look at code below which does the template, it doesn’t contain an id, it simply just copies the option and control features from above into the template.
Below is the template:
function insertQuestion(form) {
var context = $('#optionAndAnswer');
var $tbody = $('#qandatbl > tbody');
var $tr = $("<tr class='optionAndAnswer' align='center'>");
var $options = $("<div class='option'>Option Type:<br/></div>");
var $questionType = '';
$('.gridTxt', context).each( function() {
var $this = $(this);
var $optionsText = $("<input type='text' class='gridTxtRow maxRow' readonly='readonly' />")
.attr('name',$this.attr('name')+"[]")
.attr('value',$this.val())
.appendTo( $options )
.after("<span href='#' class='showGrid'>[Open Grid]</span>");
$questionType = $this.val();
});
$td.append($options);
$tbody.append($tr);
}
UPDATE:
I have created a URL for this application here. Please follow the steps to use the application and then you can see what is happening:
- Step 1: When you open application, you see a green plus button on the
page, click on it and it will display a modal window. - Step 2: In modal window there is a search bar, type in “AAA” and
submit search, you will see a bunch of rows appear. - Step 3: In the first row, you see under “Option Type” A-D, click on
the “Add” button within this row, the modal window will close and you
see in the grey textbox on right hand side that “Option Type” textbox
equals 4 and it displays the Answer buttons A,B,C and D, this is
because as you remember the option type for that row was “A-D”.
Now this works fine but it only works for the top option and answer control, follow the steps below:
- Step 4: Click on the “Add Question” button, it adds a row underneath
containing the details from the option and answer control on top. - Step 5: Within the row you have just added, you see a green plus
button on left hand side, click on this button and perform the same
search “AAA” in search box. - Step 6: This time select the last row by clicking on its “Add”
button, the “Option Type” for this row is “A-G” so it should display
“Answer” buttons A,B,C,D,E,F and G, but it doesn’t do this, it still
states “A,B,C,D”.
So how do I change the answer buttons display in the option and answer control within one of the appended rows?
The addwindow() function you see in the view source in the application is the function which occurs after the “Add” button is clicked on. The “Add” button is in an included PHP script and the code for this button is below and with it are all the columns you see after you have performed a search in the modal window:
echo "<table border='1' id='resulttbl'>
<tr>
<th class='questionth'>Question</th>
<th class='optiontypeth'>Option Type</th>
<th class='noofanswersth'>Number of <br/> Answers</th>
<th class='answerth'>Answer</th>
<th class='noofrepliesth'>Number of <br/> Replies</th>
<th class='noofmarksth'>Number of <br/> Marks</th>
</tr>";
foreach ($searchResults as $key=>$question) {
echo '<tr class="questiontd"><td>'.htmlspecialchars($question).'</td>';
echo '<td class="optiontypetd">'.htmlspecialchars($searchOption[$key]).'</td>';
echo '<td class="noofanswerstd">'.htmlspecialchars($searchNoofAnswers[$key]).'</td>';
echo '<td class="answertd">'.htmlspecialchars($searchAnswer[$key]).'</td>';
echo '<td class="noofrepliestd">'.htmlspecialchars($searchReply[$key]).'</td>';
echo '<td class="noofmarkstd">'.htmlspecialchars($searchMarks[$key]).'</td>';
echo "<td class='addtd'><button type='button' class='add' onclick=\"parent.addwindow('$question','$searchMarks[$key]','$searchNoofAnswers[$key]','$searchOption[$key]','$searchReply[$key]','$searchAnswer[$key]');\">Add</button></td></tr>";
}
echo "</table>";
I’m afraid I must be the bearer of bad news. The problem you are having stems from the overall design. Your HTML and javascript really need a bottom-up overhaul with the aim of getting all javascript into a single $(function(){…}) structure, and thus into the same scope. To achieve this you will need to :
In the process you will also purge some duplicate click handling (plus button img and its
<a>...</a>wrapper).Then, you can start to find a solution to your problem :
documentbut preferably something more specific. This appears to be partly achieved already..closest()and.find()will be useful here.$(function(){...})scope. (Now you are benefiting from making all those structural changes). The “Add” buttons’ click handler will use this reference to affect the correct “Option and answer” block..clone(true, true)to make a copy of the original block (then insert the clone into the DOM). If the other fixes have been applied, then all functionality (click handlers) will attach to the clone automatically.I work quite quickly but it would still allow 1-2 days for this.
Here’s how I would organise the javascript.
This works to an extent, but please note that it requires associated changes to the HTML and CSS.