在另一个字符串中扩展带引号的字符串

时间:2009-05-06 21:05:07

标签: php javascript

我有两个变量包含一些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

4 个答案:

答案 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."\');