我有两个变量包含一些html代码,另一个变量包含html表单的代码。我试图在第二个字符串中扩展一个字符串,将其作为参数传递给函数,但这会导致一些错误。
我的make弹出功能非常简单:
function popup(htmlcode){
child1 = window.open ("about:blank");
child1.document.write(htmlcode);
child1.document.close();
}
使用上述功能的代码
<?php
$blah = "<h1>Well</h1>"; $test = "<h2>Done</h2>";
echo '<script type="text/javascript" src="fetchlayers.js"></script>';
$formcode = "<form action=\"process.php\" method=\"post\" enctype=\"multipart/form-data \">
<label for=\"file\">Filename:</label>
<input type=\"file\" name=\"file\" id=\"file\"/>
<br />
<input type=\"submit\" name=\"submit\" value=\"Submit\" onclick=\"setTimeout(function() { sendInfo(\"".$blah."\", \"".$test."\"); } ),1250);\" />
</form>";
echo "<h1>hello</h1>
<div id='form'>
<a href='#' onclick=\"popup('" . htmlentities($formcode) . "'); return false;\">
click here</a>
</div>";
这产生了足够好的html代码,但是firebug给了我一个错误,我有一个未端接的字符串横向。我找不到它的位置。我理解我这样做的方式并不理想,但我正在学习,目前还不知道更好的方法。我感谢任何输入
编辑:好的,所以问题是我有未终止的字符串文字,这是\ n字符。我把字符串变成了一行,它正确调用了函数。
是否无法将一个echo语句分成多行?
现在问题在于弹出窗口中生成的html。有些代码实际打印到屏幕上,为什么会这样?
<form action="process.php" method="post" enctype="multipart/form-data "><label for="file">Filename:</label><input name="file" id="file" type="file"> <br><input name="submit" value="Submit" onclick="setTimeout(function() { sendInfo(" type="submit"><h1>Well</h1>", "<h2>Done</h2>"); },1250);" /></form>
查看图片here:
答案 0 :(得分:1)
更好的方法是打开一个已包含表单代码的HTML或PHP页面,而不是打开about:blank
并动态传递它。
没有理由你必须将HTML传递给Javascript函数,因为它可以直接写入文档。
答案 1 :(得分:1)
如果您必须按原样保留弹出功能,我找到了一个解决方案,其中包含this answer到“How do I escape a string inside javascript inside an onClick handler?”的帮助。
<?php
$blah = "<h1>Well</h1>"; $test = "<h2>Done</h2>";
echo '<script type="text/javascript" src="fetchlayers.js"></script>';
$formcode = '<form action="process.php" method="post" enctype="multipart/form-data ">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"/>
<br />
<input type="submit" name="submit" value="Submit" onclick="setTimeout(function() { sendInfo(\\x27'.$blah.'\\x27, \\x27'.$test.'\\x27); }, 1250);" />
</form>';
echo "<h1>hello</h1>
<div id='form'>
<a href='#' onclick='popup(\"" . addslashes(str_replace("\n", ' ', $formcode)) . "\"); return false;'>
click here</a>
</div>";
?>
编辑前:
也许你可以采用不同的方式。
Javascript函数:
function popup(id, params){
var html = document.getElementById(id).innerHTML;
if (params != undefined) {
html = findAndReplaceStrings(html, params);
}
var child1 = window.open ("about:blank");
child1.document.write(html);
child1.document.close();
}
function findAndReplaceStrings(text, json) {
for (var x in json) {
text = text.replace(x, json[x]);
}
return text;
}
HTML隐藏代码:
<div style="display:none;" id="process">
<form action="process.php" method="post" enctype="multipart/form-data ">
<label for="file">Filename:</label>
<input type="file" name="file" id="file"/>
<br />
<input id="submit" type="submit" name="submit" value="Submit" onclick="setTimeout(function() { sendInfo('{param1}', '{param2}'); } ), 1250);" />
</form>
</div>
与json的HTML链接:
<a href="#" onclick="popup('process', {'{param1}':'<h1>Well</h1>', '{param2}':'<h2>Done</h2>'}); return false;">
click here</a>
答案 2 :(得分:0)
您必须通过执行
来转义回车符(\ n)$formcode = str_replace("\n", "\\n", $formcode);
你还必须逃避引号
$formcode = str_replace("'", "\\'", $formcode);
您可以将这两行合并为一行:
$formcode = str_replace(array("\n", "'"), array("\\n", "\\'"), $formcode);
答案 3 :(得分:0)
提交按钮有一个额外的)
,它过早地关闭了setTimeout函数。具体位置在里面:
} ),1250
你也应该考虑在php字符串中使用单引号,以便更容易阅读。而且因为你使用的是双引号,所以你不必突破字符串来插入变量$ blah和$ test的内容。
这样的事情应该有效:
$formcode = "...
<input type='submit' name='submit' value='Submit'
onclick='setTimeout(function() { sendInfo(\"$blah\", \"$test\"); },1250);' />
...
“;
编辑:
看起来现在太早关闭onclick了。将这些作为开始和结束引号匹配:
onclick=\"setTimeout(function() { sendInfo(\"
我将sendInfo行更改为以下内容,运行它,看起来它正在运行。单引号在此转义,因此不会过早关闭对popup()的调用。
sendInfo(\'".$blah."\', \'".$test."\');