form within table-row tag - html

Is it OK to write a form within the tr tag?
<table>
% for my $word ( #$words_2 ) {
<tr>
<form action="/blacklist" method="post">
<td><%=$word%></td>
<td><input type="text" name="data" readonly hidden value="<%=$word%>" /></td>
<td><input class="remove" type="submit" value="Remove" /></td>
</form>
</tr>
% }
</table>

The tr doesn't allow form-tags as direct children. Most modern browsers will let you do a lot of crap and so you could use this - but I wouldn't call it OK. A better approach would be to but the complete form into one of the tds (tds allow text, forms, inline- and block-elements as children):
<table>
<% for my $word ( #$words_2 ) { %>
<tr>
<td><%=$word%></td>
<td>
<form action="/blacklist" method="post">
<input type="text" name="data" readonly hidden value="<%=$word%>" />
<input class="remove" type="submit" value="Remove" />
</form>
</td>
</tr>
<% } %>
</table>
or, a lot easier, simply use a link (but note that data gets sent using GET instead of POST - maybe you'll have to change something in your code that handles the blacklisting):
<table>
<% for my $word ( #$words_2 ) { %>
<tr>
<td><%=$word%></td>
<td>Remove</td>
</tr>
<% } %>
</table>

Is it OK to write a form within the tr tag?
No. Forms can contain tables. Table cells can contain forms.
I'd approach this problem like so:
<form action="/blacklist" method="post">
<fieldset>
<legend>Remove</legend>
% for my $word ( #$words_2 ) {
<label>
<input type="checkbox" name="data" value="<%=$word%>" />
<%=$word%>
</label>
% }
</fieldset>
<input class="remove" type="submit" value="Remove" />
</form>

No, that is not correct. The form tag has to be outside the table or inside a table cell.
Putting the form tag inside the table is an old trick to keep the form from taking up extra space. You should just use CSS for that:
form { margin: 0; padding: 0; }

Related

esp32, button onclick Can't find variable: of function

I cant get any of the buttons using onclick to recognise the functions. I get an error "cant find variable". Im very new to all this and at a loss. It doesn't matter which button I click I have the same issues with all of them.
in the below code,
I click on <button onclick="show_admin()">Admin</button> which should call function show_admin().. What am I doing wrong please.
Inspector output
const char main_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset='UTF-8'">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="refresh" content="500; url=/">
<title>System Settings</title>
<body onload="show_admin()">
<div class="banner">
<h1>X Controller</h1>
</div>
<div class="split left">
<div class="centered">
These are my button
<button onclick="show_admin()">Admin</button>
<br/>
<button onclick="show_wifi()">WIFI</button>
<br/>
<button onclick="show_tags()">Tags</button>
<br/>
</div>
</div>
<div class="split right">
<div class="centered" id="showdata">
</div>
</div>
</body>
<script>
These are my functions
function show_admin() {var table_data = <h1>Admin Settings</h1><br/>%s<br/>
<form action="/ADMINSetting" method="POST">
<table><tr>
<td> User Name </td> <td> <input type="String" name="UserName" placeholder="%s"></td>
</tr><tr>
<td> Password </td> <td> <input type="String" name="UserPass" placeholder="%s">
</td></tr></table>
<input type="submit" value="Update Admin Details">
</form>
document.getElementById("showdata").innerHTML = table_data
}
function show_wifi() { var table_data = <h1>WIFI Settings</h1><br/>%s<br/>
<form action="/WIFISetting" method="POST">
<table>
<tr>
<td> SSID Network </td> <td> <input type="String" name="WifiSsid" placeholder="%s"></td>
</tr><tr>
<td> SSID Password </td> <td> <input type="String" name="SsidPass" placeholder="%s"></td>
</tr>
</table>
<input type="submit" value="Update Wifi Details">
</form>
document.getElementById("showdata").innerHTML = table_data
}
function show_tags() { let table_data = <h1>Tag Settings</h1><br/>%s<br/>
<form action="/DEVICESetting" method="POST">
<table>
<tr>
<td> Access Tag 1 </td> <td> <input type="String" name="TAG1" placeholder="%s"></td>
</tr>
<tr>
<td> Access Tag 2 </td> <td> <input type="String" name="TAG2" placeholder="%s"></td>
</tr>
<tr>
<td> Cleaner Tag 1 </td> <td> <input type="String" name="CTAG1" placeholder="%s"></td>
</tr>
</table>
<input type="submit" value="Update BLE Tag Details">
</form>
document.getElementById("showdata").innerHTML = table_data
}
</script>
</body>
</html>
)=====";
I have tried rearranging the function and moving its position. with no luck
Unless you have JSX installed, You can't just stick HTML elements into JavaScript like that. You will need to use quotes around all the HTML.
It looks like you're reusing the same tags anyway, why not stick all those tags into the HTML portion and update the values in Javascript? You can also update the CSS through JavaScript and set display:none if you want to hide an unused element.
I added the below to the html section
<div class="split right">
<div class="centered" id="showdata">
<form id="adminForm">
<table>
<tr>
<td> User Name </td>
<td>
<input type="String" name="UserName" placeholder="%s">
</td>
</tr>
<tr>
<td> Password </td>
<td>
<input type="String" name="UserPass" placeholder="%s">
</td>
</tr>
</table>
<input type="submit" value="Update Admin Details">
</form>
and the following to the script section
function admin(){
document.getElementById("wifiForm").style.display="none";
document.getElementById("tagForm").style.display="none";
document.getElementById("adminForm").style.display="block";
}

Table with identical submit button in every row: first submit button doesn't work (multiple same ids?)

I have a table which show product's files. A file can have a note added. If a note was added, it is displayed in a row. If not, text area field with submit button is displayed instead.
Short story, it all works, except for the first row without a note. After typing a note and clicking submit button nothing happens.
HTML:
<div id="files-list" style="display: none">
<table class="table">
<thead>
<tr>
<th>File</th>
<th>Date</th>
<th>Notes</th>
<th></th>
</tr>
</thead>
<tbody>
<c:if test="${fn:length(bean.product.files)>0}">
<c:forEach items="${bean.product.files}" var="na">
<tr>
<td>${na.name}</td>
<td><fmt:formatDate value="${na.created}" pattern="yyyy-MM-dd HH:mm" /></td>
<td>
<c:if test="${empty na.note}">
<form:form id="${na.id}" method="POST" modelAttribute="bean" action="${pageContext.request.contextPath}/app/updateFile.ajax?id=${bean.product.id}&fileId=${na.id}" style="display: inline">
<form:textarea path="prodFiles" rows="1" cols="50" />
<input type="hidden" name="version" value="${bean.product.version}">
<input type="submit" id="submitButton" value="Save it!" />
</form:form>
</c:if>
<c:if test="${not empty na.note}">
<div style="max-width: 400px">${na.note}</div>
</c:if>
</td>
<td><button type="button" class="btn btn-xs btn-danger" onclick="$().mkdelformTable('${pageContext.request.contextPath}/app/deleteFile.ajax?id=${bean.product.id}&fileId=${na.id}', this)">Delete it!</button></td>
</tr>
</c:forEach>
</c:if>
</tbody>
</table>
</div>
Possible hints:
When I open the table (it's a pop-up) console shows multiple [DOM] Found X elements with non-unique id errors
Checking elements in dev's tools I noticed that the first row doesn't include the form part. Possibly connected with the multiple-same-ids problem. Example:
<td>
<textarea id="prodFiles" name="prodFiles" rows="1" cols="50"></textarea>
<input type="hidden" name="version" value="181">
<input type="submit" id="submitButton" value="Save it!">
</td>
VS
<td>
<form id="65" style="display: inline" action="/oferty/app/updateFile.ajax?id=12701&fileId=65" method="POST">
<textarea id="prodFiles" name="prodFiles" rows="1" cols="50"></textarea>
<input type="hidden" name="version" value="181">
<input type="submit" id="submitButton" value="Save it!">
</form>
</td>
Edit: Also, new files can be added so hard-coding different names/ids can't be done, if suggested.
As I found out, there was some legacy code. I managed to get rid of 'multiple same ids' etc. errors by adding a note in an additional pop-up - on a previos page, instead of an input, I included a button to the new pop-up.

React not ordering JSX elements correctly

I'm new to React.
Here is my code inside a React component:
for (var i = 0; i < fields.length; i++) {
rows.push(
<tr>
<td>...</td>
<td>...></td>
</tr>
)
}
return (
<tr>
<form className="updateForm" onSubmit={this.handleSubmit}>
<td>
<table>
{rows}
</table>
</td>
<td>
<button id={this.props.id} name="Update" type="button">Update</button>
<button id={this.props.id} name="Delete" type="button">Delete</button>
<button id={this.props.id} name="Add" type="button">Add</button>
</td>
</form>
</tr>
Here is the output HTML:
<tr data-reactid=".au4np63w8w.1.0.1.0.$0">
<form class="updateForm" data-reactid=".au4np63w8w.1.0.1.0.$0.0"></form>
<td data-reactid=".au4np63w8w.1.0.1.0.$0.0.0">
<table data-reactid=".au4np63w8w.1.0.1.0.$0.0.0.0">
<tbody>
...
</tbody>
</table>
</td>
<td data-reactid=".au4np63w8w.1.0.1.0.$0.0.1">
<button id="0" name="Update" type="button" data-reactid=".au4np63w8w.1.0.1.0.$0.0.1.0">Update</button>
<button id="0" name="Delete" type="button" data-reactid=".au4np63w8w.1.0.1.0.$0.0.1.1">Delete</button>
<button id="0" name="Add" type="button" data-reactid=".au4np63w8w.1.0.1.0.$0.0.1.2">Add</button>
</td>
</tr>
Notice that the form element that is supposed to include the table cells renders so that the table cells are outside of the form. I would expect that it should all be WYSIWYG. Am I doing something wrong or is it an actual bug? BTW, I'm using Babel with Webpack to parse JSX.
This is not a bug in React but rather the browser cleaning your erroneous semantics up.
A form element is not allowed as a direct child of a tr element. That's why your browser/React is outputting the HTML you see.
Paste below HTML in JSBin/Fiddle or the W3 validator and see the results
<table>
<tr>
<form>
<td>Hello!</td>
</form>
</tr>
</table>
A td can contain a form or a form can contain a table.

Ajax loading HTML form is closing directly

I am loading an Ajax form with Smarty and jQuery.
It should load this:
{foreach $topFEED as $article}
<tr>
<td><form action='postbox.php' method='POST'></td>
<td><img class="favicon_prev" src="http://www.google.com/s2/favicons?domain={$article.img_link}"> <input type="text" name="link" style="width: 300px;" value="{$article.link}" READONLY/></td>
{if $loggedin}<td><input type='submit' id="abo" name="submit" value='Abonnieren' /></td>
<input type='hidden' name="action" value='add_feed' READONLY />{/if}
<td></form></td>
</tr>
{/foreach}
Ajax Code:
$.ajax({
type: 'GET',
url: "article.php?method=top_feeds",
dataType: 'html',
})
.done(function(html) {
$("#ajax_top_feeds").replaceWith(html);
});
Result:
<tr>
<td><form action="postbox.php" method="POST"></form></td>
<td><img class="favicon_prev" src="http://www.google.com/s2/favicons?domain=http://www.n-tv.de"> <input type="text" name="link" style="width: 300px;" value="http://www.n-tv.de/rss" readonly=""></td>
<td><input type="submit" id="abo" name="submit" value="Abonnieren"></td>
<input type="hidden" name="action" value="add_feed" readonly=""> <td></td>
</tr>
Your HTML is invalid, the browser is simply correcting it for you. form elements can't cross multiple table cells like that.
You can wrap a form around your entire table:
<form>
<table>
<!--- etc. --->
</table>
</form>
Or you can place a form inside of a table cell:
<table>
<tr>
<td>
<form>
<!--- etc. --->
</form>
</td>
</tr>
</table>
But you can't begin a form in one cell and end it in another. The hierarchy of HTML markup isn't structured that way. Tags must be closed before parent tags are closed.

redirect html 5 form using javascript

Hi all i have login form design in html 5 and depending on login details enterd it shoud redirect to respective page. i am checking login details in javascript and redirecting page using javascript but its not working at all. page is not getting redirect.
<form id="html5form" method="post">
<table border="0" cellpadding="0" cellspacing="0" width="100%" class="tbl_form">
<tbody>
<tr>
<td>
<label>Username: <span>*</span></label>
</td>
<td>
<input type="text" name="txtLoginNm" id="txtLoginNm" class="field" required="required" placeholder="Enter Username" onkeydown="fnAdmPassword(e);"/>
</td>
</tr>
<tr>
<td>
<label>Password: <span>*</span></label>
</td>
<td>
<input type="password" name="txtPwd" id="txtPwd" maxlength="20" class="field" required="required" Placeholder="Enter Password" onkeydown="fnAdmPassword(e);"/>
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type="submit" title="Login" value="Login" name="Login" class="buttom" onclick="javascript:return fnlogin();" />
</td>
</tr>
</tbody>
</table>
</form>
//// and the javascript function is as follows
function fnlogin()
{
if ((document.getElementById("txtLoginNm").value == "") && (document.getElementById("txtPwd").value == ""))
{
alert("Please enter Username & Password!");
}
else if ((document.getElementById("txtLoginNm").value == "user155") && (document.getElementById("txtPwd").value == "user155"))
{
window.location.href = "comp-admin/u_dashboard.shtm";
}
else if ((document.getElementById("txtLoginNm").value == "superadmin") && (document.getElementById("txtPwd").value == "superadmin")) {
window.location.href = "s-admin/edit-profile.shtm";
}
else (alert("Invalid username or password!"))
}
please tell me why page is not getting redirect
This is why it is not redirecting
<input type="submit" title="Login" value="Login" name="Login" class="buttom" onclick="javascript:return fnlogin();" />
You have to make 2 changes here
Change button type from submit to just button, because then submit functionality is taking precedence and you have no action url defined
Remove javascript: from your call. (As also suggested by Jan Hančič in comments)
So try this
<input type="button" title="Login" value="Login" name="Login" class="buttom" onclick="return fnlogin();" />