I've got a simple spam killer I'm trying to put together, but the text is not showing up on my form.
The javascript is:
<script language="javascript" type="text/javascript">
document.write("SPAM Killer: What is " + GetDateMonth() + " + " + GetDateDay() + "?")
</script>
In my .js file, I have these two functions defined:
function GetDateMonth() {
return date1.getMonth() + 1;
}
function GetDateDay() {
return date1.getDay() + 1;
}
The text shows up under IE8, but not under Chrome.
As a bonus: My OnClick method of my Submit form has this bit of code that is incorrectly adding my month and date:
string spamError = "The SPAM Killer answer was incorrect. ";
char[] split = spamTest.ToCharArray();
for (int i = 0; i < split.Length; i++) {
if (char.IsLetter(split[i])) {
Ok = false;
txtMessage.Text = spamError + "Non-numeric data entered.";
return;
}
}
int nTestValue = Convert.ToInt32(spamTest, 10);
if (nTestValue < 1) {
Ok = false;
txtMessage.Text = spamError + "Negatave or zero value found.";
}
DateTime dt = DateTime.Now;
int month = dt.Month;
int day = dt.Day;
int nCorrect = month + day;
if (nCorrect != nTestValue) {
Ok = false;
txtMessage.Text = spamError + string.Format("Expected {0}; Received {1}.", nCorrect, nTestValue);
return;
}
Using IE8, I see the following:
SPAM Killer: What is 2 + 3?
I enter 5, click Send, and get Expected 17; Received 5.
Don't reinvent the wheel, help read books with http://www.google.com/recaptcha
For C# code see http://code.google.com/apis/recaptcha/docs/aspnet.html
If you're adamant on sticking with your code, think about the problems around midnight, and users in other timezones. Also, a bot can very easily answer your anti-bot question, it would take me 45 seconds to code support for that, if I wrote bots.
If you're still adamant, you shouldn't use document.write anymore (not since 2002), but instead use DOM to insert the text to a tag ID like this: Change label text using Javascript
The answer, it seems, was in using the document.write() function with appending strings.
I redesigned my HTML to be more like this:
<table>
<tr>
<td colspan="2">
<b>[Human Check]</b><br />
Enter the text to the left and below exactly as it appears:
</td>
</tr>
<tr>
<td>
<script language="javascript" type="text/javascript">
document.write(GetSpamText())
</script>
</td>
</tr>
</table>
#serverfault: Thanks for your suggestion about the date property, though. That would have been a problem.
The text returned by GetSpamText() can be static or coded to create a random value (another topic).
Related
I'm trying to pull specific tag values on a page I created for experiment.I'm new to using Cefsharp. And I'm trying to experiment to improve myself.I was stuck for about two days in the EvaluateScriptAsync section.
I am trying to capture the values of the buttons in the specific label on the page I prepared.I run the following codes by pressing a button.My page has 3 buttons with the same label.However, it prints only one of them.
<input type="button" id ="button1" value="First Button">
<input type="button" id ="button2" value="Second Button">
<input type="button" id ="button3" value="Third Button">
These are the buttons I'm trying to find.
string script = #"(function() { " +
"var button = document.querySelectorAll('input[type = \"button\"]'); " +
"if(button != null) {for (var i = 0; i < button.length; i++) { return button[i].value;
}}else{alert('not found!');}" +
"})();";
chrome.EvaluateScriptAsync(script).ContinueWith(a =>{
var response = a.Result;
if (response.Success && response.Result != null)
{
string print = (string)response.Result;
MessageBox.Show(print.ToString());
}
}, TaskScheduler.FromCurrentSynchronizationContext());
I have tried many.I think I'm making a mistake in the javascript part.I've read most of the similar topics.But I could not find a solution.
output : First Button
This worked for me. The EvaluateScriptAsync funciton can only return 1 value or a string so I made sure to convert the results in JavaScript to a JSON string object.
Then when you retrieve the result back in C# land, you can then use JSON to convert it back to an object (in this case a list of strings) and perform any operations you need on the data.
// Step 01: Generate a HTML page
var htmlPage = #"
<html>
<body>
<p>Hello!!</p>
<input type='button' id='button1' value='First Button'>
<input type='button' id='button2' value='Second Button'>
<input type='button' id='button3' value='Third Button'>
</body>
</html>";
// Step 02: Load the Page
m_chromeBrowser.LoadHtml(htmlPage, "http://customrendering/");
// Step 03: Get list of buttons on page from C# land
var jsScript = #"
// define a temp function to retrieve button text
function tempFunction() {
var result = [];
var list = document.querySelectorAll('input[type=button]');
for(var i = 0, len = list.length; i < len; i++) {
result.push(list[i].value);
}
// Important: convert object to json string before returning to C#
return JSON.stringify(result);
}
// Now execute the temp function and returns result back to C#
tempFunction();";
var task = m_chromeBrowser.EvaluateScriptAsync(jsScript);
task.ContinueWith(t =>
{
if (!t.IsFaulted)
{
var response = t.Result;
if (response.Success == true)
{
// Use JSON.net to convert to object;
MessageBox.Show(response.Result.ToString());
}
}
}, TaskScheduler.FromCurrentSynchronizationContext());
Looking at your JavaScript code sample, the problem with your code is that in your loop you have a return statement that will just return the 1st button value it comes across. Thats your problem.
If you want to interact with the resulting list in C# land you will need to convert it back from a JSON string. Just go to nuget and install the 'Newtonsoft.Json' package into your project.
Then you can write something like:
// C# land
var list = new List<string>();
list = JsonConvert.DeserializeObject<List<string>>(response.Result.ToString());
Hi is it possible to change the error message of a asp.net range validator based on the value of the textbox. For example if the number is below 0, display the error message, "number can not be less than 0" and if it is above the max value set the error message to "number can't be above maxvalue".
if (stockCount < Convert.ToInt32(range.MinimumValue))
{
range.ErrorMessage = "Quantity has to be minumm of 1";
}
else if (stockCount > Convert.ToInt32(range.MaximumValue))
{
range.ErrorMessage = "Not enough items in stock";
}
this is the code which i have had no success with, any suggestions or advice is more than appreciated.
You can use a simple jQuery listener on the TextBox and change the error message based on it's input.
<script type="text/javascript">
$('#<%= TextBox1.ClientID %>').keyup(function () {
var validator = document.getElementById('<%= RangeValidator1.ClientID %>');
var errorMsg = 'Your value of ' + $(this).val() + ' is incorrect (max is ' + validator.maximumvalue + ')';
$('#<%= RangeValidator1.ClientID %>').text(errorMsg);
});
</script>
If you want in ASP.NET and C# only try below way of doing:
Declare a rangevalidator for your text box
<asp:TextBox id="text1" runat="server"></asp:TextBox><br />
<asp:RangeValidator EnableClientScript="false"
id="RangeValidator1"
runat="server"
ControlToValidate="text1" >
</asp:RangeValidator>
You have to invoke Validate() function of RangeValidator.
And in your code, try below pseudo code where ever you want to validate. (Not tested)
RangeValidator1.MinimumValue = 0;
RangeValidator1.MaximumValue = 10;
RangeValidator1.Type = ValidationDataType.Integer;
RangeValidator1.Validate();
if (!RangeValidator1.IsValid)
{
if(Convert.ToInt32(text1.Text) < 0)
{
RangeValidator1.ErrorMessage = "number can not be less than 0";
}
else
{
RangeValidator1.ErrorMessage = "number can't be above maxvalue";
}
}
Maybe my answer didn't show two different messages, but i think it simpler and cleaner to summarized the message in one error message.
you can use Class and put Range validator with error message on top.
I am very sorry if my suggestion is not to your liking.
public class Example
{
[Range(10, 1000, ErrorMessage = "Value must be between {1} and {2}.")]
public int Quantity { get; set; }
....
}
I want to add a Header to my PDF with this:
--header-center TEST
and it works fine, but if i want to insert Whitespace:
--header-center TEST test
it wont be displayed. Do I have to write something instead of " "?
Another question is how to insert pagenumbers into the footer. I found this code-snippet, but I'm new in this issue and have no idea how to implement it:
var pdfInfo = {};
var x = document.location.search.substring(1).split('&');
for (var i in x) { var z = x[i].split('=',2); pdfInfo[z[0]] = unescape(z[1]); }
function getPdfInfo() {
var page = pdfInfo.page || 1;
var pageCount = pdfInfo.topage || 1;
document.getElementById('pdfkit_page_current').textContent = page;
document.getElementById('pdfkit_page_count').textContent = pageCount;
}
And my last question is how to insert Images into the footer with --header-html ~\image.html.
I inserted a link referencing a simple html with a picture but it wont be displayed.
I know... many questions. This issue is very tricky for me.
Thanks in advance!
LG FG
As in my comment, the whitespace in the text header should work if you surround it in quotes, ex --header-center "TEST test"
Okay, so I played around and found how to get the page numbers and image to work. Your header.html should look something like (notice how the image URL is the absolute path) :
<html>
<head>
<script type="text/javascript">
var pdfInfo = {};
var x = document.location.search.substring(1).split('&');
for (var i in x) { var z = x[i].split('=',2); pdfInfo[z[0]] = unescape(z[1]); }
function getPdfInfo() {
var page = pdfInfo.page || 1;
var pageCount = pdfInfo.topage || 1;
document.getElementById('pdfkit_page_current').textContent = page;
document.getElementById('pdfkit_page_count').textContent = pageCount;
}
</script>
</head>
<body onload="getPdfInfo()">
<img src="/var/sites/mysite/htdocs/images/logo.jpg" />
<br />Page <span id="pdfkit_page_current"></span> Of <span id="pdfkit_page_count"></span>
</body>
</html>
Then generate the with something like wkhtmltopdf --margin-top 40mm --header-html /var/sites/mysite/pdf/header.html content.html output.pdf
You'll have to play with --margin-top to get the right spacing. The same procedure should work for footers as well.
My source for this was http://metaskills.net/2011/03/20/pdfkit-overview-and-advanced-usage/ (PDFkit is a wrapper for wkhtmltopdf)
I am working on a donations website. In my page, I have a textbox which accepts a numeric value from the user (that is, money to be donated).
In my code-behind, I have a method which checks whether the value in the textbox is numeric. The method generates an error message if the number is invalid.
I also have a JavaScript which, after checking that the value in the textbox is numeric, opens a new tab to the website confirmation page, thanking the user for his donation. Here is the code of the javascript:
<script type="text/javascript">
function Open_Window()
{
var textbox = document.getElementById('DonationTextBox');
if (textbox.value != "")
{
if (isNan(textbox) == false)
{
window.open("DonationConfirmation.aspx")
}
}
}
</script>
The problem is that the tab is NEVER opened, even if the number is valid. Can you please help me solve this problem? Thank you.
P.S.
Here is the code of the button that initiates the validation:
<asp:ImageButton ID="PayPalButton2" runat="server" ImageAlign="Middle"
ImageUrl="Resources/Icons/PayPalCheckOut.gif"
onclick="PayPalButton2_Click" OnClientClick="Open_Window()"/>
The function name is isNaN. Note: The final 'N' is capital. That should solve your problem.
<script type="text/javascript">
function Open_Window()
{
var textbox = document.getElementById('<%=DonationTextBox.ClientID%>');
if (textbox.value != "" && !isNaN(textbox.value)) {
window.open("DonationConfirmation.aspx");
}
}
</script>
edit
instead of isNan should be isNaN (javascript is casesensitive)
Shouldn't this line...
if (isNan(textbox) == false)
be this instead...
if (isNan(textbox.value) == false)
First, I would recommend explicitly parsing the number, not relying on the implicit ToNumber operation that will be applied when you pass a string into isNaN. Presumably your users are inputting decimal, so if it's meant to be a whole number (e.g., 10), use:
var num = parseInt(textbox.value, 10);
If it's meant to be a number with a fractional component (e.g., 10.5), use:
var num = parseFloat(textbox.value);
You probably want parseFloat for a currency value.
Then your if condition becomes isNaN (note that the final N is capped) on num:
<script type="text/javascript">
function Open_Window()
{
var textbox = document.getElementById('DonationTextBox');
var num = parseInt(textbox.value, 10);
if (!isNaN(num))
{
window.open("DonationConfirmation.aspx")
}
}
</script>
And lastly, are you sure that the client-side ID of the textbox really is 'DonationTextBox'? ASP auto-generates client-side IDs, you may need to use ClientID instead, e.g.:
var textbox = document.getElementById('<%=DonationTextBox.ClientID%>');
Here is a stripped down working jsFiddle example:
http://jsfiddle.net/pjgalbraith/QZeSF/
The html:
Open
<textarea id="donationTextBox">1</textarea>
And the js:
function openWindow() {
if($('#donationTextBox').val() && isNaN($('#donationTextBox').val()) === false)
window.open("http://www.google.com/", "mywindow");
}
$(document).ready(function() {
$('#PayPalButton2').click(function(){
openWindow();
});
});
I want to display time in textbox or in something like a numericupdownextender used in AJAX so that the user can change time as he desires..
i have used the control to show numbers and increase accordingly..
is there a way to do this..
new code but not what is desired...
<asp:TextBox runat="server" ID="txtHour"></asp:TextBox>
<ajaxToolkit:NumericUpDownExtender ID="txtHour_NumericUpDownExtender" runat="server" Enabled="True" Maximum="12" Minimum="1" TargetControlID="txtHour" Width="70"></ajaxToolkit:NumericUpDownExtender>
<asp:TextBox runat="server" ID="txtMinute"></asp:TextBox>
<ajaxToolkit:NumericUpDownExtender ID="txtMinute_NumericUpDownExtender" runat="server" Enabled="True" Maximum="60" Minimum="1" TargetControlID="txtMinute" Width="70"></ajaxToolkit:NumericUpDownExtender>
<asp:TextBox runat="server" ID="txtDayPart"></asp:TextBox>
<ajaxToolkit:NumericUpDownExtender ID="txtDayPart_NumericUpDownExtender" runat="server" Enabled="True" RefValues="AM;PM" TargetControlID="txtDayPart" Width="70"></ajaxToolkit:NumericUpDownExtender>
the code behind is:
private void ParseTime(string TimeString)
{
// Validation of input
if (TimeString.IndexOf(":") == -1)
{
return;
}
if ((TimeString.IndexOf("PM") == -1) && (TimeString.IndexOf("AM") == -1))
{
return;
}
// Good to go with format
int ColonPos = TimeString.IndexOf(":");
int AMPos = TimeString.IndexOf("AM");
int PMPos = TimeString.IndexOf("PM");
string sHour = TimeString.Substring(0, ColonPos);
string sMinutes = TimeString.Substring(ColonPos, 3); string sDayPart = (TimeString.IndexOf("AM") != -1) ? TimeString.Substring(AMPos, 2) : TimeString.Substring(PMPos, 2);
txtHour.Text = sHour;
txtMinute.Text = sMinutes;
txtDayPart.Text = sDayPart;
}
Yes this should be pretty simple to achieve using the updownextender. Just attach web service methods to the serviceupmethod and servicedownmethod which increment/decrement your datetime by the required timespan. you haven't posted any code so it's difficult to know where you are stuck.
UPDATE: ok, so having thought about this, I don't think there is any real reason to use an updownextender with server call backs. A quick google discovered that javascript already has some basic date manipulation functions, so it's easy enough to do everything client side.
I'm not a javascript expert, so the following code is possibly of questionable quality, but it seems to work ok and hopefully will get you set on the right track. Let me know if you still get stuck.
<head runat="server">
<title></title>
<script type="text/javascript" language="javascript">
<!--
var date;
function initDateObject()
{
date = new Date ( "January 1, 2000 12:00:00" );
showTimePortion();
}
function showTimePortion()
{
document.getElementById('timeDisplay').value = padToMinimumLength(date.getHours(),2) + ':' + padToMinimumLength(date.getMinutes(),2) + ':' + padToMinimumLength(date.getSeconds(),2);
}
function padToMinimumLength(number, requiredLength)
{
var pads = requiredLength - (number + '').length;
while (pads > 0)
{
number = '0' + number;
pads--;
}
return number;
}
function addMinutes(n)
{
date.setMinutes(date.getMinutes() + n);
showTimePortion();
}
function setTodaysTime()
{
var d = new Date();
d.setHours(date.getHours());
d.setMinutes(date.getMinutes());
d.setSeconds(date.getSeconds());
alert('the time is now ' + d.toString());
}
-->
</script>
</head>
<body onload="initDateObject();">
<form id="form1" runat="server">
<div>
<input type="text" id="timeDisplay" readonly="readonly"/>
+
-
<br />
Submit
</div>
</form>
</body>
Hrmm, I recommend you spend some time playing around with jQuery if you haven't. Hope it helps.
jQuery UI
John Resig
lovemore-world has a good article that hopefuly can inspire you and get the creative juices going.