On a site I'm working on there are random numbers appearing in a very simple bit of jQuery.
Instead of what's meant to appear, these numbers — 48
, etc. — appear at the beginning. Like this:
<script type="text/javascript"> 48 48document).ready(function () { 48 48".closed").click(function () { 48 48this).find("div.but").toggleClass('plus').toggleClass('minus'); 48 48this).toggleClass('closed').toggleClass('open'); }); }); </script>
I can't even begin to imagine why it would spit this out when I hard-coded it into the site and there's no external file or anything.
OK, so since it's Perl I need to escape $(
, but how? I took a look at the Perl documentation and I just felt like I'd been punched.
Do I just use single quotes instead of double quotes?
<script type="text/javascript"> $(document).ready(function () { $('.closed').click(function () { $(this).find('div.but').toggleClass('plus').toggleClass('minus'); $(this).toggleClass('closed').toggleClass('open'); }); }); </script>
Here's the full Perl script. It's the header of a site.
########################### ## META DATA AND HEADERS ## ########################### $be_strict = 0; # 1 = 404 on page not found if ((!$title{$loadpage} || !$h1{$loadpage} || !$description{$loadpage} || !$keywords{$loadpage} || !$breadcrumb{$loadpage}) && $be_strict) { print "Status: 302 Found\r\n" . "Location: http://www.realots.co/404/\r\n" . "\r\n"; exit(0); } if ($action) { ############################# ## Highscore page SEO Hack ## ############################# if ($action eq "fish") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Fishing Skill</b>"; $h1{'highscores'} = "RealOTS Fishing Highscores"; $title{'highscores'} = "RealOTS Top Fishing Skill"; $description{'highscores'} = "Fishing Skill Highscore list of our RealOTS. Check out these amazing fishermen!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,fishing,top fishing"; } elsif ($action eq "ml") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Magic Level</b>"; $h1{'highscores'} = "RealOTS Magic Highscores"; $title{'highscores'} = "RealOTS Top Magic Level"; $description{'highscores'} = "Magic Level Highscore list of our RealOTS. Check out these fearsome mages!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,magic,top magic"; } elsif ($action eq "sword") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Sword Fighting</b>"; $h1{'highscores'} = "RealOTS Sword Fighting Highscores"; $title{'highscores'} = "RealOTS Top Sword Fighters"; $description{'highscores'} = "Sword Fighting Highscore list of our RealOTS. Fear the mighty sword wielder!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,sword,top sword"; } elsif ($action eq "axe") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Axe Fighting</b>"; $h1{'highscores'} = "RealOTS Axe Fighting Highscores"; $title{'highscores'} = "RealOTS Top Axe Fighters"; $description{'highscores'} = "Axe Fighting Highscore list of our RealOTS. Behold these savage beasts with their amazing axe skills!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,axe,top axe,axe fighting"; } elsif ($action eq "club") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Club Fighting</b>"; $h1{'highscores'} = "RealOTS Club Fighting Highscores"; $title{'highscores'} = "RealOTS Top Club Fighters"; $description{'highscores'} = "Club Fighting Highscore list of our RealOTS. Caveman-like agility all around!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,club,top club,club fighting"; } elsif ($action eq "dist") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Distance Fighting</b>"; $h1{'highscores'} = "RealOTS Distance Fighting Highscores"; $title{'highscores'} = "RealOTS Top Distance Fighters"; $description{'highscores'} = "Distance Fighting Highscore list of our RealOTS. Death from afar, raining from the sky!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,distance,top distance,distance fighting"; } elsif ($action eq "shield") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Shielding</b>"; $h1{'highscores'} = "RealOTS Shielding Highscores"; $title{'highscores'} = "RealOTS Top Shielding"; $description{'highscores'} = "Shielding Highscore list of our RealOTS. These tanks are able to withstand tremendeous blows!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,shielding,top shielding"; } elsif ($action eq "fist") { $breadcrumb{'highscores'} = "<a href='/'>RealOTS</a> » <a href='/highscores/'>Highscores</a> » <b>Fist Fighting</b>"; $h1{'highscores'} = "RealOTS Fist Fighting Highscores"; $title{'highscores'} = "RealOTS Top Fist Fighters"; $description{'highscores'} = "Fist Fighting Highscore list of our RealOTS. They had special training by sensai Chuck Norris!"; $keywords{'highscores'} = "realots,otserv,tibia,highscore,hiscores,fist,top fist,fist fighting"; } } #&print_header(); $web_content .= qq{ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>$title{$loadpage}</title> <meta name="google-site-verification" content="Z97W94Kp7MlIOgiaMAYcFA4Lp4i5hckXdncRarXkBxk" /> <meta name="google-site-verification" content="I5HTpL8jLRcdrWk3jD83qIFDBkS4G_rmWHlxEq94jLU" /> <style type="text/css"> table.outlined { border-width: 1px; order-style: solid; border-color: #9999CC; border-collapse: separate; } a.suggestions:visited{color:#0000FF;text-decoration:none;} a.suggestions:link{color:#0000FF;text-decoration:none;} a.suggestions:hover{color:#305997;text-decoration:none;} .trans { filter:alpha(opacity=50); -moz-opacity:0.5; -khtml-opacity: 0.5; opacity: 0.5; } </style> <!--[if IE 6]> <![endif]--> <!--[if IE 6]> <style type="text/css"> html { overflow-y: hidden; } body { overflow-y: auto; } img#bg { position:absolute; z-index:-1; } #content { position:static; } </style> <![endif]--> }; if ($no_index{$loadpage}) { $web_content .= qq{ <meta name="Robots" content="NOINDEX,NOFOLLOW,NOARCHIVE,NOSNIPPET" />}; } else { $web_content .= qq{ <meta name="Robots" content="index,follow" />}; } $web_content .= qq{ <meta name="keywords" content="$keywords{$loadpage}"> <meta name="description" content="$description{$loadpage}"> <meta name="author" content="RealOTS" /> <meta name="Expires" content="never" /> <link rel="stylesheet" type="text/css" href="/images/style.css" /> <script type="text/javascript" src="http://www.mollie.nl/partners/js/96481.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function () { $(".closed").click(function () { $(this).find("div.but").toggleClass('plus').toggleClass('minus'); $(this).toggleClass('closed').toggleClass('open'); }); }); </script> </head> };
$@ The perl syntax error message from the last eval command. If null, the last eval parsed and executed correctly (although the operations you invoked may have failed in the normal fashion). (Mnemonic: Where was the syntax error "at"?)
${} is just a lot cleaner to insert variable in a string then using + : let x = 5; console. log("hello world " + x + " times"); console. log(`hello world ${x} times`); for ${} to work, the string needs to be enclosed in backticks.
my keyword in Perl declares the listed variable to be local to the enclosing block in which it is defined. The purpose of my is to define static scoping. This can be used to use the same variable name multiple times but with different values.
$(
is a Perl predefined variable, expanding to the process's group ID list.
If you are on a machine that supports membership in multiple groups simultaneously, gives a space separated list of groups you are in. The first number is the one returned by getgid() , and the subsequent ones by getgroups() , one of which may be the same as the first number.
See the perlvar docs for details.
To avoid the problem, make sure to escape $(
(and any other JavaScript $
chars) in Perl strings, or use ''
instead of ""
to avoid interpolation.
Bad:
$html = "$(document).ready(...)";
Good:
$html = "\$(document).ready(...)"; $html = '$(document).ready(...)';
In the code above, for example, the script section should be:
<script type="text/javascript"> \$(document).ready(function () { \$(".closed").click(function () { \$(this).find("div.but").toggleClass('plus').toggleClass('minus'); \$(this).toggleClass('closed').toggleClass('open'); }); }); </script>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With